Freertos學習 05 核心控制

2022-02-18 07:53:12 字數 2730 閱讀 5650

---

title: rtos-freertos-05-kernel-control

date: 2020-06-22 11:10:19

categories:

tags:

- kernel

- freertos

- rtos

---章節概述:

核心控制的一些功能需要移植層提供,為了方便移植,這些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 )

}}

在檔案freertosconfig.h中,巨集configuse_tickless_idle必須設定為1,此函式才有效。

void vtasksteptick( ticktype_txtickstojump );
描述:如果rtos使能tickless空閒功能,每當只有空閒任務被執行時,系統節拍時鐘中斷將會停止,微控制器進入低功耗模式。當微控制器退出低功耗後,系統節拍計數器必須被調整,將進入低功耗的時間彌補上。

如果freertos移植檔案中定義了巨集portsuppress_ticks_and_sleep()實體,則函式vtasksteptick用於在這個巨集portsuppress_ticks_and_sleep()實體內部調整系統節拍計數器。函式vtasksteptick是乙個全域性函式,所以也可以在巨集portsuppress_ticks_and_sleep()實體中重寫該函式。

引數解析:

xticktojump:時間值,單位是系統節拍週期,表示微處理器進入低功耗的時間,函式根據這個值來調整系統節拍計數器的值。

例子:

/* 首先定義巨集portsuppress_ticks_and_sleep()。巨集引數指定要進入低功耗(睡眠)的時間,單位是系統節拍週期。*/

/* 定義被巨集portsuppress_ticks_and_sleep()呼叫的函式 */

FreeRTOS學習筆記( )

任務管理 portbase type xtaskcreate pdtask code pvtaskcode,指向任務函式的指標 const portchar const pcname,任務的文字名字,只會在除錯中用到 unsigned portshort usstackdepth,棧深度 void ...

FreeRTOS學習應用

就緒態 處於就緒態的任務還沒有執行,因為有乙個同優先順序或更高優先順序的任務正在執行。阻塞態 任務進入阻塞態即任務在等待佇列 訊號量 事件組 通知或互斥訊號量時會進入阻塞狀態。掛起狀態 任務進入掛起狀態後不能被排程器呼叫進入執行狀態 1.任務優先順序可以分為32個等級,任務優先順序最好設定滿足應用的...

freeRTOS學習筆記

freertos學習筆記 主要目的記api 1.freertos配置檔案 freertosconfig.h 2.狀態轉換執行就緒阻塞態 掛起態 vtasksuspend 掛起 就緒 vtaskresume 阻塞 就緒 cevent 執行 阻塞 呼叫阻塞api函式3.任務堆疊大小 實際引數 引數x4 ...