嵌入式實(shí)時(shí)操作系統μC/OS-II在LPC2378上的移植及

當時(shí)鐘節拍中斷發(fā)生時(shí),CPU會(huì )自動(dòng)把CPU寄存器推入堆棧,但并不包括存儲頁(yè)面寄存器PPAGE,如果單片機系統的尋址范圍超過(guò)64 KB,則需要通過(guò)給PPAGE賦值來(lái)區分不同的16 KB地址,需要把PPAGE也推入堆棧。當某任務(wù)的任務(wù)控制塊中時(shí)間延時(shí)項OSTCBDly減到了零,OSTi-mtick()就進(jìn)入了就緒態(tài)。 OSIntExit()會(huì )調用中斷級的任務(wù)切換函數OSIntCtxSw執行任務(wù)切換,而不再執行后面的指令。如果沒(méi)有更高優(yōu)先級的任務(wù)進(jìn)入就緒態(tài),則 CPU會(huì )返回中斷前狀態(tài)。
3.4.3 任務(wù)級任務(wù)切換
實(shí)際上任務(wù)級的切換就是通過(guò)執行軟中斷指令,或者根據處理器的不同,執行TRAP指令來(lái)實(shí)現。中斷服務(wù)子程序、TRAP或者異常處理的向量地址必須指向OSCtXSW(),利用系統在跳轉到中斷服務(wù)程序時(shí)會(huì )自動(dòng)把斷點(diǎn)指針壓入堆棧的功能,把斷點(diǎn)指針存入堆棧,而利用中斷返回指令I(lǐng)RET,能把斷點(diǎn)指針推入CPU的PC寄存器功能,恢復待運行任務(wù)的斷點(diǎn),這樣就可以實(shí)現斷點(diǎn)的保存和恢復。

3.4.4 中斷級任務(wù)切換
OSIntExit()通過(guò)調用OSIntSw(),在ISR中執行任務(wù)切換函數。因為OSIntCtxSw()是在ISR中被調用的,所以假定所有的處理器寄存器都被正確地保存到了被中斷任務(wù)的堆棧中。OSIntSw()函數的絕大多數代碼與OSCtxSw()函數是一樣的,區別只是:因為 ISR已經(jīng)保存了CPU的寄存器,而不再需要在OSIntSw()函數中保存CPU的寄存器。在進(jìn)行操作系統移植時(shí),該段程序的代碼如下:


3.5 移植中的問(wèn)題
ARM處理器的軟件調試通過(guò)JTAG口直接在系統的外部SRAM運行,因此在程序調試之前,ARM處理器的開(kāi)發(fā)環(huán)境軟件首先調用初始化文件 (*.ini),用戶(hù)可以根據自己系統的外部存儲器和設備的地址來(lái)修改文件。如果該文件有誤,開(kāi)發(fā)環(huán)境軟件將無(wú)法通過(guò)JTAG與處理器通信。系統調試過(guò)程中,經(jīng)常會(huì )出現程序跑飛的現象,經(jīng)過(guò)測試與分析,主要有4個(gè)方面原因:
(1)中斷處理程序的中斷矢量地址沒(méi)有正確賦值,從而導致發(fā)生中斷后CPU無(wú)法運行到中斷處理程序位置;
(2)在OsctxSw和OSIntctxSw中的任務(wù)切換語(yǔ)句后加人幾條NOP空語(yǔ)句,確保任務(wù)切換的相應指令執行結束,如果在這些位置沒(méi)有加相應的空操作指令,也會(huì )導致程序跑飛;
(3)由于堆棧的空間分配不夠,以及沒(méi)有給CPU的各個(gè)工作模式分配空間,導致任務(wù)切換時(shí),堆棧溢出;
(4)μC/OS-Ⅱ要求用戶(hù)提供一個(gè)時(shí)鐘資源來(lái)實(shí)現時(shí)鐘節拍,時(shí)鐘節拍應該每秒鐘發(fā)生10~100次,用戶(hù)必須在開(kāi)始多任務(wù)調度后(即調用 OSStart后)允許時(shí)鐘節拍中斷。通常的錯誤是在調用OSlnit()和OSStart()之間允許時(shí)鐘節拍中斷,同時(shí)用戶(hù)不要單純地追求實(shí)時(shí)性,而將系統的時(shí)鐘節拍頻率增加太高。以上幾個(gè)方面的問(wèn)題解決后,系統的工作非常穩定。
4 系統測試
移植完成后的系統包括4個(gè)部分:自啟動(dòng)程序、μC/OS-Ⅱ系統文件、移植代碼、應用程序。開(kāi)發(fā)環(huán)境是ARM公司提供的ADSl.2(ARM Dev-eloper Suite)。該系統創(chuàng )建了以下3個(gè)任務(wù)來(lái)驗證μC/OS-Ⅱ的移植成功:


在為自己的微處理器做完μC/OS-Ⅱ的移植后,首先建立3個(gè)任務(wù),之后不加任何其他應用代碼來(lái)測試移植好的μC/OS-Ⅱ,也就是說(shuō)應該先測試內核自身的運行狀況。這樣做有2個(gè)原因:不希望將事情復雜化;如果有些地方?jīng)]有工作可以明白是移植本身的問(wèn)題,而不是應用代碼產(chǎn)生的問(wèn)題。經(jīng)過(guò)測試和修改,無(wú)相關(guān)錯誤產(chǎn)生,說(shuō)明移植成功。
5 結語(yǔ)
μC/OS-Ⅱ具有很強的移植性,具有多任務(wù)實(shí)時(shí)可剝奪型內核,而且代碼量較小,源代碼開(kāi)放,可被廣泛移植到8位、16位等許多微處理器上。國外諸如APC,ROTEK等企業(yè)都在產(chǎn)品中成功地使用了μC/OS-Ⅱ內核,不僅開(kāi)發(fā)成本低,而且系統精簡(jiǎn),因此將μC/OS-Ⅱ移植到LPC-2378 這種工業(yè)級的芯片上,具有相當的商業(yè)價(jià)值。
評論