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