UCOS移植心得
1.弄懂UCOS,這是誰都知道的哦 ^_^
2. 弄懂你想要移植到的硬件平臺
3. 清楚你使用的編譯器是如何處理函數的局部變量和怎么樣處理函數間的參數傳遞
這里多廢話幾句第三點:在UCOS里面,所有函數都要求具有重入性(除了OSSTAR()外,只有這個函數我覺得是不需要的,它僅僅使用了一次);重入性是多任務的基礎,而所謂重入性從函數而言就是它的變量的保存問題,在中斷這個函數的執行時它使用的變量需要得到保存,以便返回后的執行是正確的,就我使用的編譯器而言,它通過堆棧傳遞函數參數,
重入性問題就很容易解決拉,在中斷任務時,它的參數已經在堆棧里面了,只要你保存好CPU寄存器和堆棧指針SP就好
任務可以是關中斷時被掛起,也可以是開中斷時被掛起,那么在任務切換回來后如何保證它的中斷狀況呢?問題可以通過給每個任務設置一個中斷計數器解決,并初始化為 0,記錄每個任務的開關中斷次數,關一次中斷加 1,開一次中斷減 1, 在任務調度的時候保存當前任務的中斷計數器,切換到新任務時查看新任務的中斷計數器,如果為 0就開中斷返回,不然就直接返回(任務級切換是在關中斷下進行的);而對于中斷級任務調度,肯定是發生在開中斷情況下的,就要查看是否需要關中斷處理
下面開始移植最重要的三個文件:
OS_CPU_C.C:
OSTaskStkInit():
別的就是空函數,比較簡單,這里略去
接著是OSCtxSw():
KAI: POP R1,R5 FROM [SP]
評論