博客專欄

EEPW首頁 > 博客 > RT-Thread線程與時鐘定時器管理

RT-Thread線程與時鐘定時器管理

發(fā)布人:15695104076 時間:2023-06-16 來源:工程師 發(fā)布文章

第一天

我今天學習的是RT—Thread線程和時鐘定時器管理。

系統(tǒng)中總共存在兩類線程,分別是系統(tǒng)線程和用戶線程,系統(tǒng)線程是由 RT-Thread 內核創(chuàng)建的線程,用戶線程是由應用程序創(chuàng)建的線程,而RT-Thread 的線程調度器是搶占式的。

線程具有上下文切換、保護線程中局部變量、函數(shù)調用上下文保存等作用。當線程剛開始創(chuàng)建還沒開始運行時就處于初始狀態(tài);在初始狀態(tài)下,線程不參與調度。此狀態(tài)在 RT-Thread 中的宏定義為RT_THREAD_INIT。在就緒狀態(tài)下,線程按照尤先級排隊等待被執(zhí)行;一旦當前線程運行完畢讓出處理器,操作系統(tǒng)會馬上尋找最高優(yōu)先級的就緒態(tài)線程運行。此狀態(tài)在 RT-Thread 中的宏定義為 RT_THREAD_READY線程當前正在運行在單核系統(tǒng)中,只有rthread_ self0 函數(shù)返回的線程處于運行狀態(tài);在多核系統(tǒng)中,可能就不止這一個線程處于運行狀態(tài)。此狀態(tài)在 RT-Thread 中的宏定義為 RT_THREAD_RUNNING也稱阻塞態(tài)??赡芤驗橘Y源不可用 而掛起等待,或式程主動了延時一段時間而掛起。在掛起狀態(tài)下,線程不參與調度。此狀態(tài)在FT-Thread 中的宏定義為 RT_THREAD_SUSPEND當線程運行結束時將處干關閉狀態(tài)。關閉狀態(tài)的線程不參與線程的調度。此狀態(tài)在 RT-Thread 中的宏定義為 RT_THREAD _CLOSE。

在系統(tǒng)啟動時,系統(tǒng)會創(chuàng)建 main 線程,它的入口函數(shù)為 main_thread_entry(),用戶的應用入口函數(shù) main() 就是從這里真正開始的,系統(tǒng)調度器啟動后,main 線程就開始運行。

RT-Thread 中,定時器分為硬件定時器和軟件定時器,觸發(fā)方式分為單次觸發(fā)和周期觸發(fā)。我們在創(chuàng)建定時器時,把定時器指定成SOFT_TIMER的方式,這樣可以使得定時器超時函數(shù)完全運行在timer系統(tǒng)線程上下文環(huán)境中。如果系統(tǒng)在初始化時需要使用SOFT_TIMER特性,需要在系統(tǒng)配置中打開RT_USING_TIMER_SOFT宏定義,那么調用rt_system_timer_thread_init函數(shù)就可以啟動timer系統(tǒng)線程。這里值得注意的是,SOFT_TIMER定時器的精度由RT_TIMER_TICK_PER_SECOND定義的值所決定,這個值必須是OS tick的整數(shù)倍。

硬件定時器因為是在中斷中執(zhí)行,所以對超時函數(shù)有很強的限制:1.時間不能太久2,不能有掛起、等待操作3.不能申請動態(tài)內存、釋放動態(tài)內存。軟件定時器因為是在線程中執(zhí)行,所以要求就比較寬泛一點:1.時間也要短2,不允許有阻塞掛起、死循環(huán)3,不能影響其他超時函數(shù)的下一次回調,也就是時間短的標準。使用硬件定時器,在時基更新的時候,查詢的定時器包含線程的內置定時器和用戶定義的定時器,它們都掛在硬件定時器列表上,而且特點是:所有線程的內置定時器的回調函數(shù)都是一個函數(shù),而用戶自定義的定時器的回調函數(shù)由用戶自定義。在每次系統(tǒng)滴答中斷進行線程恢復和調度是通過調用線程內置的定時器的超時函數(shù)實現(xiàn)的。拋開一切不說,滴答中斷里是查詢定時器,有超時的定時器就調用其超時函數(shù),當這個定時器是線程內置的定時器,它這個超時函數(shù)就是恢復線程和執(zhí)行調度。如果這個定時器是用戶自己開的硬件定時器時,其調用的超時函數(shù)就是用戶自己寫的。


*博客內容為網友個人發(fā)布,僅代表博主個人觀點,如有侵權請聯(lián)系工作人員刪除。



關鍵詞: RT-Threa

相關推薦

技術專區(qū)

關閉