<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
核心控制的一些功能需要移植層提供,為了方便移植,這些API函數用宏來實現,比如上下文切換、進入和退出臨界區、禁止和使能可遮蔽中斷。核心控制函數還包括啟動和停止排程器、掛起和恢復排程器以及用於低功耗模式的調整系統節拍函數。
taskYIELD:用於強制上下文切換的宏。在中斷服務程式中的等價版本為portYIELD_FROM_ISR,這也是個宏,其實現取決於移植層。
用於上下文切換的實際程式碼由移植層提供。對於Cortex-M3硬體,這個宏會引起PendSV中斷。
taskENTER_CRITICAL:用於進入臨界區的宏。在臨界區中不會發生上下文切換。
進入臨界區的實際程式碼由移植層提供,對於Cortex-M3硬體,先禁止所有RTOS可遮蔽中斷,這可以通過向basepri 暫存器寫入configMAX_SYSCALL_INTERRUPT_PRIORITY來實現。
basepri暫存器被設定成某個值後,所有優先順序號大於等於此值的中斷都被禁止,但若被設定為0,則不關閉任何中斷,0為預設值。然後臨界區巢狀計數器增1。
taskEXIT_CRITICAL:用於退出臨界區的宏。
退出臨界區的實際程式碼有移植層提供,對於Cortex-M3硬體,先將臨界區巢狀計數器減1,如果臨界區計數器為零,則使能所有RTOS可遮蔽中斷,這可以通過向basepri 暫存器寫入0來實現。
taskDISABLE_INTERRUPTS:禁止所有RTOS可遮蔽中斷。
在呼叫宏taskENTER_CRITICAL進入臨界區時,也會間接呼叫該宏禁止所有RTOS可遮蔽中斷。
taskENABLE_INTERRUPTS:使能所有RTOS可遮蔽中斷。
在呼叫宏taskEXIT_CRITICAL退出臨界區時,也會間接呼叫該宏使能所有RTOS可遮蔽中斷。
void vTaskStartScheduler( void );
啟動RTOS排程器,之後RTOS核心控制哪個任務執行以及何時執行。
當呼叫vTaskStartScheduler()後,空閒任務被自動建立。
如果configUSE_TIMERS被設定為1,定時器後臺任務也會被建立。
如果vTaskStartScheduler()成功執行,則該函數不會返回,直到有任務呼叫了vTaskEndScheduler()。
如果因為RAM不足而無法建立空閒任務,該函數也可能執行失敗,並會立刻返回撥用處。
void vTaskEndScheduler( void );
僅用於x86硬體架構中。
停止RTOS核心系統節拍時鐘。所有建立的任務自動刪除並停止多工排程。
void vTaskSuspendAll( void );
掛起排程器,但不禁止中斷。當排程器掛起時,不會進行上下文切換。排程器掛起後,正在執行的任務會一直繼續執行,核心不再排程(意味著當前任務不會被切換出去),直到該任務呼叫了xTaskResumeAll ()函數。
核心排程器掛起期間,那些可以引起上下文切換的API函數(如vTaskDelayUntil()、xQueueSend()等)決不可使用。
BaseType_t xTaskResumeAll( void );
恢復因呼叫vTaskSuspendAll()函數而掛起的實時核心排程器。
xTaskResumeAll()僅恢復排程器,它不會恢復那些被vTaskSuspend()函數掛起的任務。
返回pdTRUE 表示恢復排程器引起了一次上下文切換,否則,返回pdFALSE。
voidvTask1( void * pvParameters ) { for( ;; ) { /* 任務程式碼寫在這裡 */ /* ... */ /* 有些時候,某個任務希望可以連續長時間的執行,但這時不能使用taskENTER_CRITICAL ()/taskEXIT_CRITICAL ()的方法,這樣會遮蔽掉中斷,引起中斷丟失,包括系統節拍時鐘。可以使用vTaskSuspendAll ()停止RTOS核心排程:*/ xTaskSuspendAll (); /* 執行操作程式碼放在這裡。這樣不用進入臨界區就可以連續長時間執行了。在這期間,中斷仍然會得到響應,RTOS核心系統節拍時鐘也會繼續保持運作 */ /* ... */ /* 操作結束,重新啟動RTOS核心 。我們想強制進行一次上下文切換,但是如果恢復排程器的時候已經執行了上下文切換,再執行一次是沒有意義的,因此會進行一次判斷。*/ if( !xTaskResumeAll () ) { taskYIELD (); } } }
void vTaskStepTick( TickType_txTicksToJump );
如果RTOS使能tickless空閒功能,每當只有空閒任務被執行時,系統節拍時鐘中斷將會停止,微控制器進入低功耗模式。
當微控制器退出低功耗後,系統節拍計數器必須被調整,將進入低功耗的時間彌補上。
如果FreeRTOS移植檔案中定義了宏portSUPPRESS_TICKS_AND_SLEEP()實體,則函數vTaskStepTick用於在這個宏portSUPPRESS_TICKS_AND_SLEEP()實體內部調整系統節拍計數器。
函數vTaskStepTick是一個全域性函數,所以也可以在宏portSUPPRESS_TICKS_AND_SLEEP()實體中重寫該函數。
在檔案FreeRTOSConfig.h中,宏configUSE_TICKLESS_IDLE必須設定為1,此函數才有效。
xTickToJump:時間值,單位是系統節拍週期,表示微處理器進入低功耗的時間,函數根據這個值來調整系統節拍計數器的值。
/* 首先定義宏portSUPPRESS_TICKS_AND_SLEEP()。宏引數指定要進入低功耗(睡眠)的時間,單位是系統節拍週期。*/#defineportSUPPRESS_TICKS_AND_SLEEP( xIdleTime ) vApplicationSleep( xIdleTime ) /* 定義被宏portSUPPRESS_TICKS_AND_SLEEP()呼叫的函數 */void vApplicationSleep(TickType_t xExpectedIdleTime ){ unsigned long ulLowPowerTimeBeforeSleep,ulLowPowerTimeAfterSleep; /* 從時鐘源獲取當前時間,當微控制器進入低功耗的時候,這個時鐘源必須在執行 */ ulLowPowerTimeBeforeSleep =ulGetExternalTime(); /*停止系統節拍時鐘中斷。*/ prvStopTickInterruptTimer(); /* 設定一箇中斷,當指定的睡眠時間達到後,將處理器從低功耗中喚醒。這個中斷源必須在微控制器進入低功耗時也可以工作。*/ vSetWakeTimeInterrupt( xExpectedIdleTime ); /*進入低功耗 */ prvSleep(); /* 確定微控制器進入低功耗模式持續的真正時間。因為其它中斷也可能使得微處理器退出低功耗模式。注意:在呼叫宏portSUPPRESS_TICKS_AND_SLEEP()之前,排程器應該被掛起,portSUPPRESS_TICKS_AND_SLEEP()返回後,再將排程器恢復。因此,這個函數未完成前,不會執行其它任務。*/ ulLowPowerTimeAfterSleep =ulGetExternalTime(); /*調整核心系統節拍計數器。*/ vTaskStepTick( ulLowPowerTimeAfterSleep –ulLowPowerTimeBeforeSleep ); /*重新啟動系統節拍時鐘中斷。*/ prvStartTickInterruptTimer();}/* 首先定義宏portSUPPRESS_TICKS_AND_SLEEP()。宏引數指定要進入低功耗(睡眠)的時間,單位是系統節拍週期。*/ #defineportSUPPRESS_TICKS_AND_SLEEP( xIdleTime ) vApplicationSleep( xIdleTime ) /* 定義被宏portSUPPRESS_TICKS_AND_SLEEP()呼叫的函數 */ void vApplicationSleep(TickType_t xExpectedIdleTime ) { unsigned long ulLowPowerTimeBeforeSleep,ulLowPowerTimeAfterSleep; /* 從時鐘源獲取當前時間,當微控制器進入低功耗的時候,這個時鐘源必須在執行 */ ulLowPowerTimeBeforeSleep =ulGetExternalTime(); /*停止系統節拍時鐘中斷。*/ prvStopTickInterruptTimer(); /* 設定一箇中斷,當指定的睡眠時間達到後,將處理器從低功耗中喚醒。這個中斷源必須在微控制器進入低功耗時也可以工作。*/ vSetWakeTimeInterrupt( xExpectedIdleTime ); /*進入低功耗 */ prvSleep(); /* 確定微控制器進入低功耗模式持續的真正時間。因為其它中斷也可能使得微處理器退出低功耗模式。注意:在呼叫宏portSUPPRESS_TICKS_AND_SLEEP()之前,排程器應該被掛起,portSUPPRESS_TICKS_AND_SLEEP()返回後,再將排程器恢復。因此,這個函數未完成前,不會執行其它任務。*/ ulLowPowerTimeAfterSleep =ulGetExternalTime(); /*調整核心系統節拍計數器。*/ vTaskStepTick( ulLowPowerTimeAfterSleep –ulLowPowerTimeBeforeSleep ); /*重新啟動系統節拍時鐘中斷。*/ prvStartTickInterruptTimer(); }
以上就是FreeRTOS實時作業系統的核心控制範例解析的詳細內容,更多關於FreeRTOS實時作業系統核心控制的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45