時(shí)鐘節(jié)拍
任何操作系統(tǒng)都需要提供一個(gè)時(shí)鐘節(jié)拍,以供系統(tǒng)處理所有和時(shí)間有關(guān)的事件,如線程的延時(shí)、時(shí)間片的輪轉(zhuǎn)調(diào)度以及定時(shí)器超時(shí)等。
RTT中,時(shí)鐘節(jié)拍的長(zhǎng)度可以根據(jù)RT_TICK_PER_SECOND的定義來調(diào)整。rtconfig.h配置文件中定義:
/**
* This is the timer interrupt service routine.
*
*/
void SysTick_Handler(void)
{
/* enter interrupt */
rt_interrupt_enter();
HAL_IncTick();
rt_tick_increase();
/* leave interrupt */
rt_interrupt_leave();
}
獲取系統(tǒng)節(jié)拍
rt_tick_get();
定時(shí)器
定時(shí)器,是指從指定的時(shí)刻開始,經(jīng)過一定的指定時(shí)間后觸發(fā)一個(gè)事件,定時(shí)器有硬件定時(shí)器和軟件定時(shí)器之分:
- 硬件定時(shí)器:芯片本身提供的定時(shí)功能,一般由外部晶振提供給芯片輸入時(shí)鐘,芯片向軟件模塊提供一組配置寄存器,接受控制輸入,到達(dá)設(shè)定時(shí)間值后芯片中斷控制器產(chǎn)生時(shí)鐘中斷。
硬件定時(shí)器的精度一般很高,可以達(dá)到納秒級(jí)別,并且是中斷觸發(fā)方式。 - 軟件定時(shí)器:由操作系統(tǒng)提供的一類系統(tǒng)接口,它構(gòu)建在硬件定時(shí)器基礎(chǔ)之上,使系統(tǒng)能夠提供不受數(shù)目限制的定時(shí)器服務(wù)。
RTT操作系統(tǒng)提供軟件實(shí)現(xiàn)的定時(shí)器,以時(shí)鐘節(jié)拍(OS Tick)的時(shí)間長(zhǎng)度為單位,即定時(shí)數(shù)值必須是OS Tick的整數(shù)倍。
RTT提供的兩類定時(shí)器機(jī)制
- 單次觸發(fā)定時(shí)器,這類定時(shí)器在啟動(dòng)后只會(huì)觸發(fā)一次定時(shí)器事件,然后定時(shí)器自動(dòng)停止。
- 周期觸發(fā)定時(shí)器,這類定時(shí)器會(huì)周期性地觸發(fā)定時(shí)器事件,直到用戶手動(dòng)的停止,否則將永遠(yuǎn)持續(xù)執(zhí)行下去。
根據(jù)定時(shí)器超時(shí)函數(shù)執(zhí)行時(shí)所處的上下文環(huán)境,RT-Thread的定時(shí)器可以分為HARD_TIMER模式和SOFT_TIMER模式。
HARD_TIMER模式:中斷上下文
定時(shí)器超時(shí)函數(shù)的要求:執(zhí)行時(shí)間應(yīng)該盡量短,執(zhí)行時(shí)不應(yīng)導(dǎo)致當(dāng)前上下文掛起、等待。例如在中斷上下文中執(zhí)行超時(shí)函數(shù)不應(yīng)該試圖去申請(qǐng)動(dòng)態(tài)內(nèi)存、釋放動(dòng)態(tài)內(nèi)存等。
SOFT_TIMER模式:線程上下文
該模式被棄用后,系統(tǒng)會(huì)在初始化時(shí)創(chuàng)建一個(gè)timer線程,然后SOFT_TIMER模式的定時(shí)器超時(shí)函數(shù)都會(huì)在timer線程的上下文環(huán)境中執(zhí)行。
定時(shí)器工作機(jī)制
在RTT定時(shí)器模塊中維護(hù)著兩個(gè)重要的全局變量:
- 當(dāng)前系統(tǒng)經(jīng)過的tick時(shí)間rt_tick(當(dāng)硬件定時(shí)器中斷來臨時(shí),它將加1)。
- 定時(shí)器鏈表rt_timer_list。系統(tǒng)新創(chuàng)建并激活的定時(shí)器都會(huì)按照以超時(shí)時(shí)間排序的方式插入到rt_timer_list鏈表中。
系統(tǒng)當(dāng)前tick值為20,在當(dāng)前系統(tǒng)中以及創(chuàng)建并啟動(dòng)了三個(gè)定時(shí)器。
分別是定時(shí)時(shí)間為50個(gè)tick的Timer1、100個(gè)tick的Timer2和500個(gè)tick的Timer3.
這三個(gè)定時(shí)器分別加上系統(tǒng)當(dāng)前時(shí)間rt_tick=20,從小到大排序鏈接在rt_timer_list鏈表中。
rt_tick隨著硬件定時(shí)器的觸發(fā)一直在增加(每一次硬件定時(shí)器中斷來臨,rt_tick變量會(huì)加1),50個(gè)tick以后,rt_tick從20增長(zhǎng)到70,與Timer1的timeout值相等,這時(shí)會(huì)觸發(fā)與Timer1定時(shí)器相關(guān)聯(lián)的超時(shí)函數(shù),同時(shí)將Timer1從rt_timer_list鏈表上刪除。同理,100個(gè)tick和500個(gè)tick過去后,與Timer2和Timer3定時(shí)器相關(guān)聯(lián)的超時(shí)函數(shù)會(huì)被觸發(fā),接著將Timer2和Timer3定時(shí)器從rt_timer_list鏈表刪除。
如果系統(tǒng)當(dāng)前定時(shí)器狀態(tài)在10個(gè)tick以后(rt_tick=30)有一個(gè)任務(wù)新創(chuàng)建了一個(gè)tick值為300的Timer4定時(shí)器,由于Timer4定時(shí)器的timeout=rt_tick+300=330,因此它被插入到Timer2和Timer3定時(shí)器中間,形成如下圖所示鏈表結(jié)構(gòu):文章來源:http://www.zghlxwxcb.cn/news/detail-682951.html
高精度延時(shí)
此函數(shù)只支持低于1個(gè)OS Tick的延時(shí),否則SysTick會(huì)出現(xiàn)溢出而不能夠獲取指定的延時(shí)時(shí)間。
void rt_hw_us_delay(rt_uint32_t us);//只支持小于1ms的延時(shí)文章來源地址http://www.zghlxwxcb.cn/news/detail-682951.html
到了這里,關(guān)于RT-Thread 時(shí)鐘管理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!