μC/OS-II 是美國(guó)學(xué)者Lacrosse 設(shè)計(jì)的一個(gè)優(yōu)秀的嵌入式實(shí)時(shí)操作系統(tǒng),其代碼絕大部分用ANSIC 語(yǔ)言編寫,可用于8 位、16 位、32 位、甚至64 位微處理器、微控制器、數(shù)字信號(hào)處理器等,具有操作系統(tǒng)最基本最核心的功能,非常適于在小型系統(tǒng)和片上系統(tǒng)(SOC)中使用。USB 為個(gè)人電腦與嵌入式設(shè)備之間的連接提供了一種標(biāo)準(zhǔn)化、單一化的接口,其高效性和可靠性使得它已經(jīng)成為嵌入式系統(tǒng)的首選接口。此LPC2378 讀卡器具有卡票檢測(cè)、消費(fèi)扣錢、系統(tǒng)升級(jí)、下發(fā)黑名單、在線充值、余額查詢等功能,但這些功能的實(shí)現(xiàn)都依賴于上位機(jī)的請(qǐng)求,業(yè)務(wù)應(yīng)用模塊只有在獲得相應(yīng)的請(qǐng)求后才能進(jìn)行相應(yīng)的處理并將處理結(jié)果返回給上位機(jī)。而USB 主機(jī)系統(tǒng)就是起銜接上位機(jī)和業(yè)務(wù)應(yīng)用模塊的功能,接收上位機(jī)請(qǐng)求以及將業(yè)務(wù)應(yīng)用模塊的結(jié)果返回給上位機(jī)。
1 構(gòu)建μC/OS-II系統(tǒng)環(huán)境
1.1 移植μC/OS-II 到LPC2378 開發(fā)板
嵌入式操作系統(tǒng)作為大多數(shù)嵌入式應(yīng)用系統(tǒng)的軟件平臺(tái),它管理著系統(tǒng)的資源,為應(yīng)用軟件提供各種必要的服務(wù)。在嵌入式應(yīng)用系統(tǒng)中使用嵌入式系統(tǒng),可以提升嵌入式應(yīng)用系統(tǒng)的開發(fā)效率,但是在得到嵌入式操作系統(tǒng)提供服務(wù)之前,關(guān)鍵是要將嵌入式操作系統(tǒng)移植到目標(biāo)板上。
移植條件:
移植μC/OS-II 之前需要注意,目標(biāo)處理器必須滿足以下五點(diǎn)要求:
1. 處理器的C 編譯器能產(chǎn)生可重入型代碼;2. 處理器支持中斷,并且能產(chǎn)生定時(shí)中斷(通常為10-100Hz);3. 用C 語(yǔ)言可以開/關(guān)中斷;4. 處理器能支持一定數(shù)量的數(shù)據(jù)存儲(chǔ)硬件堆棧(可能是幾KB);5. 處理器有將堆棧指針以及其他CPU 寄存器的內(nèi)容讀出并保存到堆?;騼?nèi)存中去的指令。
LPC2378 系列ARM7 微控制器可以滿第2、4 和5 點(diǎn)要求,使用ADS 的C 編譯器可以滿足1 和3 點(diǎn)要求。
移植步驟:
OS_CPU.H 的移植:
在OS_CPU.H 文件中定義與處理器相關(guān)的數(shù)據(jù)類型,例如BOOLEAN,INT8U 和INT8S 等。根據(jù)ADS1.2編譯器的特性定義。在OS_CPU.H 文件中定義與處理器相關(guān)的宏, 主要是進(jìn)出臨界區(qū)代碼OS_ENTRER_CRITICAL()、OS_EXIT_CRITICAL()。
將OS_ENTRER_CRITICAL()和OS_EXIT_CRITICAL()定義為軟件中斷函數(shù),所以還要編寫相應(yīng)的軟件中斷處理代碼(可以在OS_CPU_C.C 文件中編寫)實(shí)現(xiàn)開/關(guān)中斷。同樣定義OS_TASK_SW()為軟件中斷函數(shù),并編寫相應(yīng)的軟件中斷處理代碼(調(diào)用OS_IntCtxSw 函數(shù))實(shí)現(xiàn)任務(wù)切換。
OS_CPU_C.C 的移植:
在OS_CPU_C.C 中需要編寫10 個(gè)相關(guān)的函數(shù),為:OSTaskStkInit();OSTaskDellHook();OSTaskIdleHook ();OSTaskTickHook()等函數(shù)。其中9 個(gè)系統(tǒng)Hook函數(shù)可以為空函數(shù),也可以根據(jù)用戶自己的需要編寫相應(yīng)的操作代碼。任務(wù)棧結(jié)構(gòu)初始化函數(shù)OSTaskStkInit()必須根據(jù)移植時(shí)統(tǒng)一定義的任務(wù)堆棧結(jié)構(gòu)進(jìn)行初始化。
OS_CUP_A.ASM 的移植。
μC/OS-II 移植要求編寫的匯編語(yǔ)言函數(shù)為:
OSStartHightRdy();OSCtxSw();OSIntCtxSw();OS_TickISR()。當(dāng)然這些程序不一定非得用匯編,也可以用嵌入式C 語(yǔ)言來(lái)完成。
至此,完成μC/OS-II 在ARM7 處理器LPC2378上代碼的移植,其大部分代碼與μC/OS-II 在其他ARM7 處理器上的移植是通用的。
1.2 USB 驅(qū)動(dòng)程序設(shè)計(jì)
μC/OS-II 提供了多任務(wù)實(shí)時(shí)操作系統(tǒng)的內(nèi)核。在應(yīng)用這個(gè)操作系統(tǒng)時(shí)候,用戶通常需要自己編寫基于μC/OS-II 的外圍器件驅(qū)動(dòng)程序,以使外圍器件能在操作系統(tǒng)的協(xié)調(diào)下更好的為用戶服務(wù)。為了使軟件可移植性強(qiáng),易維護(hù),采用分層的方法編寫USB 的驅(qū)動(dòng)程序。綜合考慮USB 協(xié)議、USB 硬件接線、μC/OS-II的結(jié)構(gòu)來(lái)進(jìn)行分層,下表所列為USB 驅(qū)動(dòng)程序分層結(jié)構(gòu)。