實時操作系統(tǒng)uC/OS一Ⅱ在ARM上的移植—軟件仿真 摘 要:介紹了實時操作系統(tǒng)uC/OS—II的特點 ,,討論了其在 LPC2106上移植的可能性,, 成功通過軟件仿真地將uC/OS—II移植到LPC2106上, 并通過例程驗證了移植代碼的正確性,。 注:本文是引用期刊“實時操作系統(tǒng)uC/OS—II在ARM上的移植,,作者:王曉鳴,、王樹新 、張宏偉”結(jié)合了網(wǎng)上的程序?qū)崿F(xiàn)了對系統(tǒng)移植的軟件仿真,。 0:引 言 目前嵌入式系統(tǒng)在家電,、移動電話、PDA等各種領(lǐng)域的應(yīng)用日益廣泛,,程序設(shè)計也越來越復(fù)雜,,這就需要采用一個通用的嵌入式操作系統(tǒng)來對其進行管理和控制。移植 了操作系統(tǒng) 的嵌入式系統(tǒng)開發(fā),,可大大減 輕程序員的負擔(dān),,操作系統(tǒng)提供了多任務(wù)的管理功能, 只需專注于每個任務(wù)的管理,。對于不同的應(yīng)用,,可以按照相同的步驟完成系統(tǒng)設(shè)計。如果更換硬件平臺,,則只需要對操作系統(tǒng)進行少量的移植工作,與硬件無關(guān)的應(yīng)用代碼完全無需修改,,同時,,可增強代碼的可讀性、可維護性和可擴展性,。uC/OS—II是一個可裁減的,、源代碼開放 的、結(jié)構(gòu)小巧,、可剝奪型的實時多任務(wù)內(nèi)核,,它提供任務(wù)調(diào)度、任務(wù)間的通信與同步,、 任務(wù)管理,、 時間管理和內(nèi)存管理 等基本功能。將uC/OS—II移植到嵌入式處理器上,, 對于提高產(chǎn)品質(zhì)量,、 縮短開發(fā)周期和降低成本等方面有著重 要的意 義。本 文主要介 紹uC/OS—II在飛利浦的一款AR M7TDMI的嵌入式處理器LPC2106應(yīng)用,。 1 嵌入式操作系統(tǒng) uC/OS—II 1.1 uC/OS—II簡介 uC/OS—II是一種性能優(yōu)良源碼公開且被廣泛應(yīng)用的免費嵌入式操作系統(tǒng),,它結(jié)構(gòu)小巧、具有基于優(yōu)先級的搶占式實時多任務(wù)內(nèi)核,,絕大部分代碼是用ANSI C語言編寫的,,與硬件相關(guān)部分用匯編語言編寫,使之可供不同構(gòu)架的微處理器使用,。只要有標(biāo)準(zhǔn)的ANSI C交叉編譯器,,有匯編器,、鏈接器等軟件工具,就可以將 uC/OS—II嵌入到開發(fā)的產(chǎn)品中,。 uC/OS—II是面向中小型嵌入式系統(tǒng),,具有執(zhí)行效率高、占用空間小,、實時性能優(yōu)良和可擴展性強等特點,,包含全部功能模塊的內(nèi)核大約為10kB。如果經(jīng)過裁減只保留核心代碼,,則可壓縮到3kB左右,。嚴格地 說uC/OS—II只是一個實時操作系統(tǒng)內(nèi)核,它僅僅包含了任務(wù)調(diào)度,、任務(wù)管理,、時間管理、內(nèi)存管理和任務(wù)間的通信和同步等基本功能,,沒有提供輸入輸出管理,、文件系統(tǒng)、網(wǎng)絡(luò)等額外的服務(wù),。但由于uC/OS—II良好的可擴展性和源碼開放,,這些非必需的功能完全可以由用戶自己根據(jù)需要分別實現(xiàn)。 1.2 uC/OS—II的工作原理 uC/OS—II的工作流程如圖 1所示:首先進行操作系統(tǒng)初始化,,主要完成任務(wù)控制塊(TCB)初始化,;然后就可以開始創(chuàng)建新任務(wù)、初始化任務(wù)堆棧區(qū),;最后調(diào)用OSSTART()函數(shù),, 啟動多任務(wù)調(diào)度 。在多任務(wù)調(diào)度開始后,,啟動時鐘節(jié)拍源開始計時,。此節(jié)拍源為系統(tǒng)提供周期性的時鐘中斷信號、實現(xiàn)延時和超時確認,。當(dāng)時鐘中斷來臨時,,系統(tǒng)把當(dāng)前正在執(zhí)行的任務(wù)掛起,保護現(xiàn)場,,進行中斷處理,,判斷有無任務(wù)延時到期。若有,,則使該任務(wù)進入就緒態(tài),,并對所有進入就緒態(tài)的任務(wù)的優(yōu)先級進行比較,通過任務(wù)切換去執(zhí)行最高優(yōu)先級的任務(wù),。若沒有別的任務(wù)進入就緒態(tài),,則恢復(fù)現(xiàn)場繼續(xù)執(zhí)行原任務(wù) ,。另一種調(diào)度方式是任務(wù)級的調(diào)度,即通過發(fā)軟中斷命令或依靠處理器在任務(wù)執(zhí)行中調(diào)度,。如任務(wù)要等待信號量或一個正在執(zhí)行的任務(wù)被掛起時,,就需要在此任務(wù)中調(diào)度,找出目前處于就緒態(tài)的優(yōu)先級最高的任務(wù)去執(zhí)行,。當(dāng)沒有任何任務(wù)進入就緒態(tài)時,,就去執(zhí)行空任務(wù)。 1.3 UC/OS的移植要求 UC/OS的正常運行需要處理器平臺滿足以下要求: 我們的KEIL和ADS均支持UC/OS的要求,。因此可以在LPC2000系列上移值。 2 基于LPC1602的軟件仿真電路 LPC1602是PHILIPS公司推出的一款功能強大,、超低功耗且具有ARM7TDMI內(nèi)核的32位微控制器,。 它具有豐富的片上資源,完全可以滿足一般的工業(yè)控制需要,,同時還可以減少系統(tǒng)硬件設(shè)計的復(fù)雜度,提高系統(tǒng)的穩(wěn)定性,。它的工作原理主要是用ARM7芯片LPC1602為內(nèi)核,,與一系列外圍器件連接起來。這里所用到的電路圖如下:
仿真是的結(jié)果: 將ADS1.2編譯運行后生成的test.hex文件導(dǎo)入到ARM芯片中去,,按下key1按鍵的結(jié)果,。 3 軟件部分 這次仿真我用了老師上課講的ADS1.2,和protues軟件來實現(xiàn)的,,ADS1.2是用來編寫程序并生成目標(biāo)代碼,。用Protues來模擬真實的開發(fā)板。 ADS1.2中的程序示意(編譯后屋錯誤): 主要看一下主函數(shù)程序: /**************************************************************************** * File:Main.C * 功能:計數(shù)器,通過兩個按鍵來控制加減計數(shù)器,并輸出數(shù)碼管顯示.,。 ****************************************************************************/ #include "config.h" #define CON 0x000000ff //控制P0.0~P0.7 #define TASK_STK_SIZE 64 OS_STK Main_TaskStk[TASK_STK_SIZE]; OS_STK Task0Stk[TASK_STK_SIZE]; void Main_Task(void *data); void Task0(void *data); /**************************************************************************** * 名稱:main() * 功能:主函數(shù),啟動多任務(wù)環(huán)境 ****************************************************************************/ int main (void) { OSInit(); OSTaskCreate(Main_Task, (void *)0, &Main_TaskStk[TASK_STK_SIZE - 1], 0); OSStart(); return 0; } /**************************************************************************** * 名稱:Main_Task() * 功能:初始化目標(biāo)板,建立其他任務(wù) ****************************************************************************/ void Main_Task(void *pdata) { pdata=pdata; TargetInit(); OSTaskCreate(Task0, (void *)0, &Task0Stk[TASK_STK_SIZE - 1], 1); PINSEL0=0x0; IODIR=CON; IOCLR=CON; OSTaskSuspend(OS_PRIO_SELF); } /**************************************************************************** * 名稱:Task0() * 功能:任務(wù) ****************************************************************************/ void Task0(void *pdata) { uint16 temp; pdata=pdata; temp=0; for(;;) { if((IOPIN&0x00030000)!=0x00030000) OSTimeDly(OS_TICKS_PER_SEC/50); if((IOPIN&0x00030000)!=0x00030000) { if((IOPIN&0x00030000)==0x00020000) temp++; if((IOPIN&0x00030000)==0x00010000) temp--; while((IOPIN&0x00030000)!=0x00030000); IOCLR=CON; IOSET=temp; } } OSTaskResume(0); } 該程序中一共啟用的兩個任務(wù): 第一個任務(wù),,其實只要是用來啟用第二個任務(wù)Task0(按鍵任務(wù)),然后就自己掛起了,。 void Main_Task(void *pdata) { pdata=pdata; TargetInit(); OSTaskCreate(Task0, (void *)0, &Task0Stk[TASK_STK_SIZE - 1], 1); PINSEL0=0x0; IODIR=CON; IOCLR=CON; OSTaskSuspend(OS_PRIO_SELF); } 第二個任務(wù):查詢兩個按鍵,,如果上面那個按鍵按下則顯示增1,按下下面的則相反,。 部分程序: if((IOPIN&0x00030000)!=0x00030000) { if((IOPIN&0x00030000)==0x00020000) temp++; if((IOPIN&0x00030000)==0x00010000) temp--; while((IOPIN&0x00030000)!=0x00030000); IOCLR=CON; IOSET=temp; } 這里顯示沒有用另外的任務(wù),,而是使用IOSET來實現(xiàn)的,。 4 總結(jié) 由于沒有開發(fā)板一直不能進行移植實驗,且之前沒有學(xué)習(xí)過操作系統(tǒng)移植方面知識,,對具體怎樣移植很是迷惑,,之前(考慮到電腦的裝系統(tǒng)和軟件安裝)認為系統(tǒng)移植是不是先把系統(tǒng)下載到RAM中,然后再把編寫好的程序再下載到ARM中,,思路很是混亂,。經(jīng)過長時間的上網(wǎng)查資料,下相關(guān)的文檔,、軟件以及程序現(xiàn)在才稍微理解了些,。 我對系統(tǒng)移植的理解: 系統(tǒng)移植就是利用一些編程好的程序來輔助運行我們要實現(xiàn)的功能。比如說那些OS_CPU.H,、OS_CPU_a.s,、OS_CPU.c函數(shù)并不是用來直接下載到ARM版中的,而是你編寫的具體函數(shù)在運行的時候會用到這些函數(shù),。而使用這些函數(shù)的好處時,,實現(xiàn)切換任務(wù)之間的控制,而不在是像單片機那時的中斷響應(yīng)方式,。
這里不能添加附件,,所以程序沒有全部給出,如果需要可以問我要,。,。。 |
|
來自: 寢鄉(xiāng)園 > 《電子通信類》