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

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

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


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


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