源碼下載
源碼地址: https://github.com/RT-Thread/rt-thread.git
rt-thread與AliOS-things,TencentOS tiny,freertos等設計看起來都有不同,在任務的命名上,改為了線程。
任務講解
1.任務怎樣創建來的?
編寫一個函數,定義為:rt_thread_create(),裡面需要包含參數:要執行的函數、任務的名稱、棧的大小、當前任務的優先級,運行的週期等。由於這個接口沒有任務的結構體,所以自然需要分配一個,實際的調用是_rt_thread_init()。
2.任務的私有信息需要怎麼存放?
定義一個函數,命名為:rt_hw_stack_init(),裡面包含的就是xPSR、PC、LR、R12、R3、R2、R1、R0,R11, R10, R9, R8, R7, R6, R5 and R4等的初始化。看起來rt-thread在這上面的處理跟其他系統有一個差別就是沒有在這裡填充一個位置,賦值0xfffffffd。
3.任務怎麼切換?
對於系統運行,要執行第一個任務,可以調用函數:rt_system_scheduler_start(),實際是調用rt_hw_context_switch_to();這個函數是使用匯編編寫的,最終會設置PENDSV中斷,在PendSV_Handler中去執行任務的切換操作。\u0004
之後則是多個任務之間進行調度。
在普通任務中,可以調用函數rt_thread_sleep(),其實就是調用rt_schedule(),實際幹活的則是rt_hw_context_switch(),它裡面也一樣,需要設置PENDSV位,這樣就能做到PENDSV中斷產生,然後切換到應該切換到的任務中。
在中斷服務函數中, 可以調用rt_thread_yield(),則會調用到rt_schedule(),跟普通任務不同,它會調用到rt_hw_context_switch_interrupt(),但是它跟rt_hw_context_switch()內容一樣,而它做法是彙編中兩個標號上下排列來共用代碼,這顯得比tencentos tiny處理得更好。之後也就能切換任務了。
4.訪問同一個資源(變量)如何處理?
對於rt-thread處理起來也很簡單了,直接粗暴的操作PRIMASK。相較而言,freertos在這塊考慮的更多。
本篇也將持續更新。。。
閱讀更多 wityuan 的文章