RT-Thread線程與時鐘定時器管理
第一天
我今天學習的是RT—Thread線程和時鐘定時器管理。
系統(tǒng)中總共存在兩類線程,分別是系統(tǒng)線程和用戶線程,系統(tǒng)線程是由 RT-Thread 內(nèi)核創(chuàng)建的線程,用戶線程是由應(yīng)用程序創(chuàng)建的線程,而RT-Thread 的線程調(diào)度器是搶占式的。
線程具有上下文切換、保護線程中局部變量、函數(shù)調(diào)用上下文保存等作用。當線程剛開始創(chuàng)建還沒開始運行時就處于初始狀態(tài);在初始狀態(tài)下,線程不參與調(diào)度。此狀態(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)。可能因為資源不可用 而掛起等待,或式程主動了延時一段時間而掛起。在掛起狀態(tài)下,線程不參與調(diào)度。此狀態(tài)在FT-Thread 中的宏定義為 RT_THREAD_SUSPEND當線程運行結(jié)束時將處干關(guān)閉狀態(tài)。關(guān)閉狀態(tài)的線程不參與線程的調(diào)度。此狀態(tài)在 RT-Thread 中的宏定義為 RT_THREAD _CLOSE。
在系統(tǒng)啟動時,系統(tǒng)會創(chuàng)建 main 線程,它的入口函數(shù)為 main_thread_entry(),用戶的應(yīng)用入口函數(shù) main() 就是從這里真正開始的,系統(tǒng)調(diào)度器啟動后,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宏定義,那么調(diào)用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)內(nèi)存、釋放動態(tài)內(nèi)存。軟件定時器因為是在線程中執(zhí)行,所以要求就比較寬泛一點:1.時間也要短2,不允許有阻塞掛起、死循環(huán)3,不能影響其他超時函數(shù)的下一次回調(diào),也就是時間短的標準。使用硬件定時器,在時基更新的時候,查詢的定時器包含線程的內(nèi)置定時器和用戶定義的定時器,它們都掛在硬件定時器列表上,而且特點是:所有線程的內(nèi)置定時器的回調(diào)函數(shù)都是一個函數(shù),而用戶自定義的定時器的回調(diào)函數(shù)由用戶自定義。在每次系統(tǒng)滴答中斷進行線程恢復和調(diào)度是通過調(diào)用線程內(nèi)置的定時器的超時函數(shù)實現(xiàn)的。拋開一切不說,滴答中斷里是查詢定時器,有超時的定時器就調(diào)用其超時函數(shù),當這個定時器是線程內(nèi)置的定時器,它這個超時函數(shù)就是恢復線程和執(zhí)行調(diào)度。如果這個定時器是用戶自己開的硬件定時器時,其調(diào)用的超時函數(shù)就是用戶自己寫的。
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。