RT-Thread線程與時鐘定時器管理
第一天
我今天學習的是RT—Thread線程和時鐘定時器管理。
系統中總共存在兩類線程,分別是系統線程和用戶線程,系統線程是由 RT-Thread 內核創建的線程,用戶線程是由應用程序創建的線程,而RT-Thread 的線程調度器是搶占式的。
線程具有上下文切換、保護線程中局部變量、函數調用上下文保存等作用。當線程剛開始創建還沒開始運行時就處于初始狀態;在初始狀態下,線程不參與調度。此狀態在 RT-Thread 中的宏定義為RT_THREAD_INIT。在就緒狀態下,線程按照尤先級排隊等待被執行;一旦當前線程運行完畢讓出處理器,操作系統會馬上尋找最高優先級的就緒態線程運行。此狀態在 RT-Thread 中的宏定義為 RT_THREAD_READY線程當前正在運行在單核系統中,只有rthread_ self0 函數返回的線程處于運行狀態;在多核系統中,可能就不止這一個線程處于運行狀態。此狀態在 RT-Thread 中的宏定義為 RT_THREAD_RUNNING也稱阻塞態。可能因為資源不可用 而掛起等待,或式程主動了延時一段時間而掛起。在掛起狀態下,線程不參與調度。此狀態在FT-Thread 中的宏定義為 RT_THREAD_SUSPEND當線程運行結束時將處干關閉狀態。關閉狀態的線程不參與線程的調度。此狀態在 RT-Thread 中的宏定義為 RT_THREAD _CLOSE。
在系統啟動時,系統會創建 main 線程,它的入口函數為 main_thread_entry(),用戶的應用入口函數 main() 就是從這里真正開始的,系統調度器啟動后,main 線程就開始運行。
RT-Thread 中,定時器分為硬件定時器和軟件定時器,觸發方式分為單次觸發和周期觸發。我們在創建定時器時,把定時器指定成SOFT_TIMER的方式,這樣可以使得定時器超時函數完全運行在timer系統線程上下文環境中。如果系統在初始化時需要使用SOFT_TIMER特性,需要在系統配置中打開RT_USING_TIMER_SOFT宏定義,那么調用rt_system_timer_thread_init函數就可以啟動timer系統線程。這里值得注意的是,SOFT_TIMER定時器的精度由RT_TIMER_TICK_PER_SECOND定義的值所決定,這個值必須是OS tick的整數倍。
硬件定時器因為是在中斷中執行,所以對超時函數有很強的限制:1.時間不能太久2,不能有掛起、等待操作3.不能申請動態內存、釋放動態內存。軟件定時器因為是在線程中執行,所以要求就比較寬泛一點:1.時間也要短2,不允許有阻塞掛起、死循環3,不能影響其他超時函數的下一次回調,也就是時間短的標準。使用硬件定時器,在時基更新的時候,查詢的定時器包含線程的內置定時器和用戶定義的定時器,它們都掛在硬件定時器列表上,而且特點是:所有線程的內置定時器的回調函數都是一個函數,而用戶自定義的定時器的回調函數由用戶自定義。在每次系統滴答中斷進行線程恢復和調度是通過調用線程內置的定時器的超時函數實現的。拋開一切不說,滴答中斷里是查詢定時器,有超時的定時器就調用其超時函數,當這個定時器是線程內置的定時器,它這個超時函數就是恢復線程和執行調度。如果這個定時器是用戶自己開的硬件定時器時,其調用的超時函數就是用戶自己寫的。
*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。