嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-II在LPC2378上的移植及
當(dāng)時(shí)鐘節(jié)拍中斷發(fā)生時(shí),CPU會(huì)自動(dòng)把CPU寄存器推入堆棧,但并不包括存儲(chǔ)頁(yè)面寄存器PPAGE,如果單片機(jī)系統(tǒng)的尋址范圍超過(guò)64 KB,則需要通過(guò)給PPAGE賦值來(lái)區(qū)分不同的16 KB地址,需要把PPAGE也推入堆棧。當(dāng)某任務(wù)的任務(wù)控制塊中時(shí)間延時(shí)項(xiàng)OSTCBDly減到了零,OSTi-mtick()就進(jìn)入了就緒態(tài)。 OSIntExit()會(huì)調(diào)用中斷級(jí)的任務(wù)切換函數(shù)OSIntCtxSw執(zhí)行任務(wù)切換,而不再執(zhí)行后面的指令。如果沒(méi)有更高優(yōu)先級(jí)的任務(wù)進(jìn)入就緒態(tài),則 CPU會(huì)返回中斷前狀態(tài)。
3.4.3 任務(wù)級(jí)任務(wù)切換
實(shí)際上任務(wù)級(jí)的切換就是通過(guò)執(zhí)行軟中斷指令,或者根據(jù)處理器的不同,執(zhí)行TRAP指令來(lái)實(shí)現(xiàn)。中斷服務(wù)子程序、TRAP或者異常處理的向量地址必須指向OSCtXSW(),利用系統(tǒng)在跳轉(zhuǎn)到中斷服務(wù)程序時(shí)會(huì)自動(dòng)把斷點(diǎn)指針壓入堆棧的功能,把斷點(diǎn)指針存入堆棧,而利用中斷返回指令I(lǐng)RET,能把斷點(diǎn)指針推入CPU的PC寄存器功能,恢復(fù)待運(yùn)行任務(wù)的斷點(diǎn),這樣就可以實(shí)現(xiàn)斷點(diǎn)的保存和恢復(fù)。
3.4.4 中斷級(jí)任務(wù)切換
OSIntExit()通過(guò)調(diào)用OSIntSw(),在ISR中執(zhí)行任務(wù)切換函數(shù)。因?yàn)镺SIntCtxSw()是在ISR中被調(diào)用的,所以假定所有的處理器寄存器都被正確地保存到了被中斷任務(wù)的堆棧中。OSIntSw()函數(shù)的絕大多數(shù)代碼與OSCtxSw()函數(shù)是一樣的,區(qū)別只是:因?yàn)? ISR已經(jīng)保存了CPU的寄存器,而不再需要在OSIntSw()函數(shù)中保存CPU的寄存器。在進(jìn)行操作系統(tǒng)移植時(shí),該段程序的代碼如下:
3.5 移植中的問(wèn)題
ARM處理器的軟件調(diào)試通過(guò)JTAG口直接在系統(tǒng)的外部SRAM運(yùn)行,因此在程序調(diào)試之前,ARM處理器的開(kāi)發(fā)環(huán)境軟件首先調(diào)用初始化文件 (*.ini),用戶可以根據(jù)自己系統(tǒng)的外部存儲(chǔ)器和設(shè)備的地址來(lái)修改文件。如果該文件有誤,開(kāi)發(fā)環(huán)境軟件將無(wú)法通過(guò)JTAG與處理器通信。系統(tǒng)調(diào)試過(guò)程中,經(jīng)常會(huì)出現(xiàn)程序跑飛的現(xiàn)象,經(jīng)過(guò)測(cè)試與分析,主要有4個(gè)方面原因:
(1)中斷處理程序的中斷矢量地址沒(méi)有正確賦值,從而導(dǎo)致發(fā)生中斷后CPU無(wú)法運(yùn)行到中斷處理程序位置;
(2)在OsctxSw和OSIntctxSw中的任務(wù)切換語(yǔ)句后加人幾條NOP空語(yǔ)句,確保任務(wù)切換的相應(yīng)指令執(zhí)行結(jié)束,如果在這些位置沒(méi)有加相應(yīng)的空操作指令,也會(huì)導(dǎo)致程序跑飛;
(3)由于堆棧的空間分配不夠,以及沒(méi)有給CPU的各個(gè)工作模式分配空間,導(dǎo)致任務(wù)切換時(shí),堆棧溢出;
(4)μC/OS-Ⅱ要求用戶提供一個(gè)時(shí)鐘資源來(lái)實(shí)現(xiàn)時(shí)鐘節(jié)拍,時(shí)鐘節(jié)拍應(yīng)該每秒鐘發(fā)生10~100次,用戶必須在開(kāi)始多任務(wù)調(diào)度后(即調(diào)用 OSStart后)允許時(shí)鐘節(jié)拍中斷。通常的錯(cuò)誤是在調(diào)用OSlnit()和OSStart()之間允許時(shí)鐘節(jié)拍中斷,同時(shí)用戶不要單純地追求實(shí)時(shí)性,而將系統(tǒng)的時(shí)鐘節(jié)拍頻率增加太高。以上幾個(gè)方面的問(wèn)題解決后,系統(tǒng)的工作非常穩(wěn)定。
4 系統(tǒng)測(cè)試
移植完成后的系統(tǒng)包括4個(gè)部分:自啟動(dòng)程序、μC/OS-Ⅱ系統(tǒng)文件、移植代碼、應(yīng)用程序。開(kāi)發(fā)環(huán)境是ARM公司提供的ADSl.2(ARM Dev-eloper Suite)。該系統(tǒng)創(chuàng)建了以下3個(gè)任務(wù)來(lái)驗(yàn)證μC/OS-Ⅱ的移植成功:
在為自己的微處理器做完μC/OS-Ⅱ的移植后,首先建立3個(gè)任務(wù),之后不加任何其他應(yīng)用代碼來(lái)測(cè)試移植好的μC/OS-Ⅱ,也就是說(shuō)應(yīng)該先測(cè)試內(nèi)核自身的運(yùn)行狀況。這樣做有2個(gè)原因:不希望將事情復(fù)雜化;如果有些地方?jīng)]有工作可以明白是移植本身的問(wèn)題,而不是應(yīng)用代碼產(chǎn)生的問(wèn)題。經(jīng)過(guò)測(cè)試和修改,無(wú)相關(guān)錯(cuò)誤產(chǎn)生,說(shuō)明移植成功。
5 結(jié)語(yǔ)
μC/OS-Ⅱ具有很強(qiáng)的移植性,具有多任務(wù)實(shí)時(shí)可剝奪型內(nèi)核,而且代碼量較小,源代碼開(kāi)放,可被廣泛移植到8位、16位等許多微處理器上。國(guó)外諸如APC,ROTEK等企業(yè)都在產(chǎn)品中成功地使用了μC/OS-Ⅱ內(nèi)核,不僅開(kāi)發(fā)成本低,而且系統(tǒng)精簡(jiǎn),因此將μC/OS-Ⅱ移植到LPC-2378 這種工業(yè)級(jí)的芯片上,具有相當(dāng)?shù)纳虡I(yè)價(jià)值。
評(píng)論