源碼獲取
源碼下載地址:https://www.micrium.com。
源碼需要自己去網站裡面找,也可以在網站裡面找一個開發板的例子,也就包括了源碼的。
任務講解
1.任務怎樣創建來的?
編寫一個函數,定義為:OSTaskCreate(),裡面需要包含參數:任務結構體,要執行的函數、任務的名稱、棧的大小、當前任務的優先級,棧數組等。
2.任務的私有信息需要怎麼存放?
定義一個函數,命名為:OSTaskStkInit(),裡面包含的就是xPSR、PC、LR、R12、R3、R2、R1、R0,R11, R10, R9, R8, R7, R6, R5 and R4等的初始化。uCOS-III,rtx,rt-thread在這上面的處理都是相同的,所以也沒什麼好多說的了。
所以,這一路分析下來,基本上套路沒差。
3.任務怎麼切換?
對於系統運行,要執行第一個任務,可以調用函數:OSStart(),實際是調用OSStartHighRdy();這個函數是使用匯編編寫的,在裡面找到最高任務,然後跳轉過去運行,而運行堆棧信息也切換到psp中。
之後則是多個任務之間進行調度。
在普通任務中,可以調用函數OSTimeDly(),其實就是調用OSCtxSw(),需要設置PENDSV位,這樣就能做到PENDSV中斷產生,然後切換到應該切換到的任務中。
在中斷服務函數中, 可以調用OSIntExit(),跟普通任務不同,它會調用到OSIntCtxSw(),但是它跟OSCtxSw()內容一樣,也就能切換任務了。
4.訪問同一個資源(變量)如何處理?
對於uCOS-III處理起來也很簡單了,直接粗暴的操作PRIMASK。
從這些rtos中的代碼來看,應該只有uCOS-III寫的最淺顯易懂了,怪不得市面上分析它的代碼的書籍特別多。
本篇持續更新。。。
閱讀更多 wityuan 的文章