[FreeRTOS學(xué)習(xí)] 內(nèi)核控制

上下文切換

taskYIELD 在中斷服務(wù)程序中的等價(jià)版本為portYIELD_FROM_ISR脑豹,用于強(qiáng)制上下文切換的宏晦攒。對于Cortex-M3硬件,這個(gè)宏會引起PendSV中斷牵触。

進(jìn)入臨界區(qū)

taskENTER_CRITICAL:用于進(jìn)入臨界區(qū)的宏姥宝。在臨界區(qū)中不會發(fā)生上下文切換茵肃。

對于Cortex-M3硬件蒂萎,先禁止所有RTOS可屏蔽中斷同欠,這可以通過向basepri 寄存器寫入configMAX_SYSCALL_INTERRUPT_PRIORITY來實(shí)現(xiàn)棍现。basepri寄存器被設(shè)置成某個(gè)值后调煎,所有優(yōu)先級號大于等于此值的中斷都被禁止,但若被設(shè)置為0己肮,則不關(guān)閉任何中斷士袄,0為默認(rèn)值。然后臨界區(qū)嵌套計(jì)數(shù)器增1谎僻。

退出臨界區(qū)

taskEXIT_CRITICAL:用于退出臨界區(qū)的宏窖剑。

對于Cortex-M3硬件,先將臨界區(qū)嵌套計(jì)數(shù)器減1戈稿,如果臨界區(qū)計(jì)數(shù)器為零西土,則使能所有RTOS可屏蔽中斷,這可以通過向basepri 寄存器寫入0來實(shí)現(xiàn)鞍盗。

禁止可屏蔽中斷

taskDISABLE_INTERRUPTS:禁止所有RTOS可屏蔽中斷需了。在調(diào)用宏taskENTER_CRITICAL進(jìn)入臨界區(qū)時(shí)跳昼,也會間接調(diào)用該宏禁止所有RTOS可屏蔽中斷。

使能可屏蔽中斷宏

taskENABLE_INTERRUPTS:使能所有RTOS可屏蔽中斷肋乍。在調(diào)用宏taskEXIT_CRITICAL退出臨界區(qū)時(shí)鹅颊,也會間接調(diào)用該宏使能所有RTOS可屏蔽中斷。

啟動調(diào)度器

void vTaskStartScheduler( void );

當(dāng)調(diào)用vTaskStartScheduler()后墓造,空閑任務(wù)被自動創(chuàng)建堪伍。如果configUSE_TIMERS被設(shè)置為1,定時(shí)器后臺任務(wù)也會被創(chuàng)建觅闽。

如果vTaskStartScheduler()成功執(zhí)行帝雇,則該函數(shù)不會返回,直到有任務(wù)調(diào)用了vTaskEndScheduler()蛉拙。如果因?yàn)镽AM不足而無法創(chuàng)建空閑任務(wù)尸闸,該函數(shù)也可能執(zhí)行失敗,并會立刻返回調(diào)用處孕锄。

停止調(diào)度器

void vTaskEndScheduler( void );

僅用于x86硬件架構(gòu)中吮廉。停止RTOS內(nèi)核系統(tǒng)節(jié)拍時(shí)鐘。所有創(chuàng)建的任務(wù)自動刪除并停止多任務(wù)調(diào)度畸肆。

掛起任務(wù)調(diào)度器

 void vTaskSuspendAll( void );

掛起調(diào)度器宦芦,但不禁止中斷。當(dāng)調(diào)度器掛起時(shí)轴脐,不會進(jìn)行上下文切換踪旷。調(diào)度器掛起后,正在執(zhí)行的任務(wù)會一直繼續(xù)執(zhí)行豁辉,內(nèi)核不再調(diào)度(意味著當(dāng)前任務(wù)不會被切換出去),直到該任務(wù)調(diào)用了xTaskResumeAll ()函數(shù)舀患。

內(nèi)核調(diào)度器掛起期間徽级,那些可以引起上下文切換的API函數(shù)(如vTaskDelayUntil()、xQueueSend()等)決不可使用聊浅。

恢復(fù)被掛起的調(diào)度器

BaseType_t xTaskResumeAll( void );

恢復(fù)因調(diào)用vTaskSuspendAll()函數(shù)而掛起的實(shí)時(shí)內(nèi)核調(diào)度器餐抢。xTaskResumeAll()僅恢復(fù)調(diào)度器,它不會恢復(fù)那些被vTaskSuspend()函數(shù)掛起的任務(wù)低匙。

voidvTask1( voidvoid * pvParameters )  
{  
    for( ;; )  
    {  
        /* 任務(wù)代碼寫在這里 */  
  
        /* ... */  
  
        /* 有些時(shí)候旷痕,某個(gè)任務(wù)希望可以連續(xù)長時(shí)間的運(yùn)行,但這時(shí)不能使用taskENTER_CRITICAL ()/taskEXIT_CRITICAL ()的方法顽冶,這樣會屏蔽掉中斷欺抗,引起中斷丟失,包括系統(tǒng)節(jié)拍時(shí)鐘强重〗食剩可以使用vTaskSuspendAll ()停止RTOS內(nèi)核調(diào)度:*/  
        xTaskSuspendAll ();  
  
        /* 執(zhí)行操作代碼放在這里贸人。這樣不用進(jìn)入臨界區(qū)就可以連續(xù)長時(shí)間執(zhí)行了。在這期間佃声,中斷仍然會得到響應(yīng)艺智,RTOS內(nèi)核系統(tǒng)節(jié)拍時(shí)鐘也會繼續(xù)保持運(yùn)作 */  
  
        /* ... */  
  
        /* 操作結(jié)束,重新啟動RTOS內(nèi)核 圾亏。我們想強(qiáng)制進(jìn)行一次上下文切換十拣,但是如果恢復(fù)調(diào)度器的時(shí)候已經(jīng)執(zhí)行了上下文切換,再執(zhí)行一次是沒有意義的志鹃,因此會進(jìn)行一次判斷夭问。*/  
        if( !xTaskResumeAll () )  
        {  
             taskYIELD ();  
        }  
    }  
}  

調(diào)整系統(tǒng)節(jié)拍

 void vTaskStepTick( TickType_txTicksToJump );

如果RTOS使能tickless空閑功能,每當(dāng)只有空閑任務(wù)被執(zhí)行時(shí)弄跌,系統(tǒng)節(jié)拍時(shí)鐘中斷將會停止甲喝,微控制器進(jìn)入低功耗模式。當(dāng)微控制器退出低功耗后铛只,系統(tǒng)節(jié)拍計(jì)數(shù)器必須被調(diào)整埠胖,將進(jìn)入低功耗的時(shí)間彌補(bǔ)上。

如果FreeRTOS移植文件中定義了宏portSUPPRESS_TICKS_AND_SLEEP()實(shí)體淳玩,則函數(shù)vTaskStepTick用于在這個(gè)宏portSUPPRESS_TICKS_AND_SLEEP()實(shí)體內(nèi)部調(diào)整系統(tǒng)節(jié)拍計(jì)數(shù)器直撤。函數(shù)vTaskStepTick是一個(gè)全局函數(shù),所以也可以在宏portSUPPRESS_TICKS_AND_SLEEP()實(shí)體中重寫該函數(shù)蜕着。

宏configUSE_TICKLESS_IDLE必須設(shè)置為1谋竖,此函數(shù)才有效。

/* 首先定義宏portSUPPRESS_TICKS_AND_SLEEP()承匣。宏參數(shù)指定要進(jìn)入低功耗(睡眠)的時(shí)間蓖乘,單位是系統(tǒng)節(jié)拍周期。*/  
#define portSUPPRESS_TICKS_AND_SLEEP( xIdleTime ) vApplicationSleep( xIdleTime )  
   
/* 定義被宏portSUPPRESS_TICKS_AND_SLEEP()調(diào)用的函數(shù) */  
void vApplicationSleep(TickType_t xExpectedIdleTime )  
{  
    unsigned long ulLowPowerTimeBeforeSleep,ulLowPowerTimeAfterSleep;  
   
    /* 從時(shí)鐘源獲取當(dāng)前時(shí)間韧骗,當(dāng)微控制器進(jìn)入低功耗的時(shí)候嘉抒,這個(gè)時(shí)鐘源必須在運(yùn)行 */  
    ulLowPowerTimeBeforeSleep =ulGetExternalTime();  
   
    /*停止系統(tǒng)節(jié)拍時(shí)鐘中斷。*/  
    prvStopTickInterruptTimer();  
   
    /* 配置一個(gè)中斷袍暴,當(dāng)指定的睡眠時(shí)間達(dá)到后些侍,將處理器從低功耗中喚醒。這個(gè)中斷源必須在微控制器進(jìn)入低功耗時(shí)也可以工作政模。*/  
    vSetWakeTimeInterrupt( xExpectedIdleTime );  
   
    /*進(jìn)入低功耗 */  
    prvSleep();  
   
    /* 確定微控制器進(jìn)入低功耗模式持續(xù)的真正時(shí)間岗宣。因?yàn)槠渌袛嘁部赡苁沟梦⑻幚砥魍顺龅凸哪J健W⒁猓涸谡{(diào)用宏portSUPPRESS_TICKS_AND_SLEEP()之前淋样,調(diào)度器應(yīng)該被掛起耗式,portSUPPRESS_TICKS_AND_SLEEP()返回后,再將調(diào)度器恢復(fù)。因此纽什,這個(gè)函數(shù)未完成前措嵌,不會執(zhí)行其它任務(wù)。*/  
    ulLowPowerTimeAfterSleep =ulGetExternalTime();  
          
    /*調(diào)整內(nèi)核系統(tǒng)節(jié)拍計(jì)數(shù)器芦缰。*/  
    vTaskStepTick( ulLowPowerTimeAfterSleep –ulLowPowerTimeBeforeSleep );  
   
    /*重新啟動系統(tǒng)節(jié)拍時(shí)鐘中斷企巢。*/  
    prvStartTickInterruptTimer();  
}  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市让蕾,隨后出現(xiàn)的幾起案子浪规,更是在濱河造成了極大的恐慌,老刑警劉巖探孝,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笋婿,死亡現(xiàn)場離奇詭異,居然都是意外死亡顿颅,警方通過查閱死者的電腦和手機(jī)缸濒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粱腻,“玉大人庇配,你說我怎么就攤上這事∩苄” “怎么了捞慌?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長柬批。 經(jīng)常有香客問我啸澡,道長,這世上最難降的妖魔是什么氮帐? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任嗅虏,我火速辦了婚禮,結(jié)果婚禮上上沐,老公的妹妹穿的比我還像新娘皮服。我一直安慰自己,他們只是感情好奄容,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著产徊,像睡著了一般昂勒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舟铜,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天戈盈,我揣著相機(jī)與錄音,去河邊找鬼。 笑死塘娶,一個(gè)胖子當(dāng)著我的面吹牛归斤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播刁岸,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼脏里,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了虹曙?” 一聲冷哼從身側(cè)響起迫横,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎酝碳,沒想到半個(gè)月后矾踱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疏哗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年呛讲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片返奉。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贝搁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出衡瓶,到底是詐尸還是另有隱情徘公,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布哮针,位于F島的核電站关面,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏十厢。R本人自食惡果不足惜等太,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蛮放。 院中可真熱鬧缩抡,春花似錦、人聲如沸包颁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娩嚼。三九已至蘑险,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間岳悟,已是汗流浹背佃迄。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工泼差, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人呵俏。 一個(gè)月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓堆缘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親普碎。 傳聞我的和親對象是個(gè)殘疾皇子吼肥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容