薛晴
(北京郵電大學(xué) 信息與通信工程學(xué)院,北京100876)
μC/OS-II系統(tǒng)是一款源碼公開的,針對(duì)嵌入式系統(tǒng)的實(shí)時(shí)內(nèi)核操作系統(tǒng),與其它實(shí)時(shí)操作系統(tǒng)如Vxworks,Linux和Windows CE等相比,它比較適用于小型控制系統(tǒng),同時(shí)具有執(zhí)行效率高、占用空間小、實(shí)時(shí)性能優(yōu)良和可擴(kuò)展性強(qiáng)等優(yōu)點(diǎn)[4]。
LPC1788是恩智浦公司于2011年底推出的業(yè)界首款采用ARM?CortexTM-M3技術(shù)的微控制器,目前已批量上市。120 MHz的LPC178x系列擁有512 kB閃存、96 kB SRAM和4 kB EEPROM。32位外部存儲(chǔ)控制器支持SDRAM、NOR和SRAM器件,提供4種芯片選擇[2]。其先進(jìn)的低功耗工藝,特別適用于消費(fèi)電子、工業(yè)控制、安防、通訊系統(tǒng),以及需要高速計(jì)算的數(shù)據(jù)采集系統(tǒng)領(lǐng)域。
由于該款微處理器上市時(shí)間較短,目前還沒有μC/OS-II操作系統(tǒng)應(yīng)用于該款微處理器的移植代碼。文中詳細(xì)探討了在IAR6.3集成開發(fā)環(huán)境下,如何在LPC1788處理器上移植μC/OS-II操作系統(tǒng)的過(guò)程與實(shí)現(xiàn)步驟,該移植與開發(fā)過(guò)程已成功地在LPC1788目標(biāo)板上進(jìn)行了運(yùn)行測(cè)試。
圖1說(shuō)明了μC/OS-II的軟硬件體系結(jié)構(gòu)。應(yīng)用程序處于整個(gè)系統(tǒng)的頂層,每個(gè)任務(wù)都可以認(rèn)為自己獨(dú)占了CPU,因而可以設(shè)計(jì)成一個(gè)無(wú)限循環(huán)。μC/OS-II與處理器無(wú)關(guān)的代碼,提供了μC/OS-II的系統(tǒng)服務(wù),應(yīng)用程序可以使用這些API函數(shù)進(jìn)行內(nèi)存管理、任務(wù)間通信及創(chuàng)建、刪除任務(wù)。其中,μC/OS-II內(nèi)核最核心的作用就是對(duì)任務(wù)的管理。
圖1 μC/OS-II的系統(tǒng)總體結(jié)構(gòu)圖Fig.1 Structure diagram of μC/OS-II system
μC/OS—II的任務(wù)擁有自己的代碼和堆??臻g (保存該任務(wù)的寄存器、返回地址和臨時(shí)參數(shù)),一般都是空函數(shù),不會(huì)返回任何值。任務(wù)執(zhí)行一次后,設(shè)置延時(shí)參數(shù)OSTCBDly。表明在經(jīng)過(guò)OSTCBDly個(gè)時(shí)鐘周期后再次運(yùn)行,然后任務(wù)進(jìn)行切換.使其他任務(wù)運(yùn)行。
μC/OS-Ⅱ下的任務(wù)有 5種狀態(tài):睡眠態(tài)、就緒態(tài)、運(yùn)行態(tài)、等待狀態(tài)、中斷服務(wù)態(tài)。調(diào)度就是決定該輪到哪個(gè)任務(wù)運(yùn)行了,從而使一就緒的任務(wù)切換到運(yùn)行態(tài),這是內(nèi)核的主要職責(zé)之一。μC/OS-Ⅱ是基于優(yōu)先級(jí)調(diào)度算法的:也就是讓處于就緒態(tài)、優(yōu)先級(jí)最高的任務(wù)先運(yùn)行。
由圖 1可知,μC/OS-Ⅱ的接口文件是 OS_CPU.H,OS_CPU_C.C和OS_CPU_A.ASM,移植的主要任務(wù)是改寫這3個(gè)文件的代碼,使μC/OS-Ⅱ能在LPC1788上正常運(yùn)行。移植工作包括以下幾個(gè)內(nèi)容:
2.1 OS_CPU.H包括了用#defines定義的與處理器相關(guān)的常量,宏和類型定義,堆棧寬度和增長(zhǎng)方式以及開關(guān)中斷的宏定義[6]。
在IAR6.3環(huán)境下改寫該文件時(shí)的幾點(diǎn)說(shuō)明:
1)由于Cortex-M3內(nèi)核堆棧支持從上往下的生長(zhǎng)方式,所以L1根據(jù)所選芯片LPC1788支持的類型對(duì)宏OS_STK_GRWOTH進(jìn)行定義,
2)因LPC1788的狀態(tài)寄存器是32位寬,L2,L3定義的os_cpu_sr用于OS_CRITICAL_METHOD#3.中保存中斷狀態(tài)[3]。
3)OS_CPU.H文件中另外3個(gè)宏OS_CRITICAL_METHOD,OS_ENTER_CRITICAL (),OS_EXIT_CRITICAL()用于定義開關(guān)中斷的方式及開關(guān)中斷的實(shí)現(xiàn)。而OS_CPU_SR_Save()和 OS_CPU_SR_Restore(cpu_sr)的代碼則在OS_CPU_A.asm文件中匯編語(yǔ)言編寫,稍候會(huì)詳細(xì)介紹。
4)任務(wù)級(jí)的切換是通過(guò)調(diào)用L6的宏OS_TASK_SW()來(lái)實(shí)現(xiàn),OSCtxSw()的具體代碼在 OS_CPU_A.asm中用匯編語(yǔ)言實(shí)現(xiàn)。
在OS_CPU_C.C中要求用戶編寫8個(gè)簡(jiǎn)單的C函數(shù):OSTaskStkInit ()、OSTaskCreateHook ()、OSTaskDelHook ()、OSTaskSwHook ()、OSTaskStatHook ()、OSTimeTickHook ()、OS_TaskStkIni ()、OS_CPU_SysTickInit ()、OS_CPU_SysTick Handler(),除三個(gè)必須的函數(shù) OS_TaskStkIni,OS_CPU_SysTickInit和OS_CPU_SysTickHandler外,其它的5個(gè)函數(shù)是鉤子函數(shù),必須聲明但沒必要包含代碼。
1) OSTaskStkInit()函數(shù)
定義任務(wù)堆棧初始化函數(shù)OSTaskStkIni()的具體程序及注釋如下所示::
μC/OS-Ⅱ要求用戶提供一個(gè)周期性的時(shí)鐘源,以實(shí)現(xiàn)時(shí)間延遲和超時(shí)確認(rèn)功能,時(shí)鐘節(jié)拍每秒發(fā)生10~100次。必須在開始多任務(wù)后,啟動(dòng)時(shí)鐘節(jié)拍中斷,所以可以在OSStart()運(yùn)行之后,μC/OS啟動(dòng)的第1個(gè)任務(wù)中調(diào)用OS_CPU_SysTickInit()初始化節(jié)拍中斷?;贚PC1788移植下的時(shí)鐘初始化函數(shù)的OS_CPU_SysTickInit()的代碼如下所示:OSIntExit();} /*告訴 uC/OS-II退出中斷服務(wù)程序*/當(dāng)時(shí)鐘節(jié)拍中斷發(fā)生時(shí),CPU會(huì)自動(dòng)把CPU寄存器推人堆棧。當(dāng)某任務(wù)的任務(wù)控制塊中時(shí)間延時(shí)項(xiàng)OSTCBDly減到了零,OSTimtick()就進(jìn)入了就緒態(tài)。 OSIntExit()會(huì)調(diào)用中斷級(jí)的任務(wù)切換函數(shù)OSIntCtxSw執(zhí)行任務(wù)切換,而不再執(zhí)行后面的指令。
在OS_CPU_A.ASM中,因?yàn)镃語(yǔ)言不能直接存取寄存器,用戶在移植μC/OS-Ⅱ的時(shí)候,需要用匯編語(yǔ)言編寫5個(gè)函 數(shù) : OS_CPU_SR_Save ()、OS_CPU_SR_Restore ()、OSStartHighRdy ()、OSCtxSw ()、OS_CPU_PendSVHandler ()。如下所示:
1) OS_CPU_SR_Save()函數(shù)
OS_CPU_SR_Save()函數(shù)實(shí)現(xiàn)用R0保存中斷屏蔽寄存器PRIMASK的狀態(tài)值,該函數(shù)被OS_ENTER_CRITICAL()宏調(diào)用[3]。
4) OSCtxSw()函數(shù)
當(dāng)一個(gè)任務(wù)放棄對(duì)CPU的控制后,OSCtxSw()就會(huì)被調(diào)用以實(shí)現(xiàn)任務(wù)切換,但對(duì)于ARM Cortex-M3來(lái)說(shuō),所有的任務(wù)切換都是由PendSV中斷服務(wù)程序來(lái)實(shí)現(xiàn)的,所以O(shè)SCtxSw()只是簡(jiǎn)單觸發(fā)PendSV中斷,然后返回調(diào)用者。
OS_CPU_PendSVHandler()負(fù)責(zé)處理 ARM Cortex-M3 所有的任務(wù)切換[3],在該程序開始執(zhí)行時(shí),CPU首先把xPSR、PC、LR、R12,R0-R3和R4-R11寄存器保存到任務(wù)堆棧,然后獲得最高優(yōu)先級(jí)任務(wù)的堆棧指針,將最高優(yōu)先級(jí)任務(wù)的寄存器按順序從任務(wù)堆棧中恢復(fù)出來(lái),最后執(zhí)行中斷返回:
不同任務(wù)的切換會(huì)發(fā)生在停止當(dāng)前低優(yōu)先級(jí)的任務(wù)轉(zhuǎn)而去執(zhí)行較高優(yōu)先級(jí)任務(wù)的情形,這是由一個(gè)任務(wù)級(jí)切換函數(shù)OS_TASK_SW()實(shí)現(xiàn)的,該函數(shù)通過(guò)調(diào)用 OSCtxSw()函數(shù)觸 發(fā) PendSV中 斷 ,PendSV中 斷 服 務(wù) 程 序OS_CPU_PendSVHandler完成具體的任務(wù)切換操作。OS_CPU_PendSVHandler的編寫實(shí)質(zhì)上是通過(guò)改變PC中的內(nèi)容來(lái)實(shí)現(xiàn)的,首先將當(dāng)前任務(wù)環(huán)境保存到相應(yīng)的任務(wù)堆棧中,同時(shí)將PC指向新任務(wù)開始運(yùn)行的地方,然后將新任務(wù)環(huán)境從堆棧中恢復(fù)到相應(yīng)的寄存器中,最后執(zhí)行中斷返回。在中斷返回時(shí),Cortex-M3將從堆棧中恢復(fù)R3-R0,R12,LR,PC和xPSR寄存器,開始運(yùn)行新任務(wù),從而實(shí)現(xiàn)任務(wù)的切換。
文中使用LPC1788目標(biāo)板對(duì)上述移植進(jìn)行了實(shí)驗(yàn)測(cè)試,目標(biāo)板有四個(gè)按鍵和兩個(gè)LED,本測(cè)試建立了App_TaskStart()、App_TaskKbd()、App_TaskLed()三個(gè)任務(wù)。 App_TaskStart()負(fù)責(zé)硬件初始化及OS初始化,建立消息郵箱及另兩個(gè)任務(wù),然后進(jìn)入無(wú)限循環(huán),在循環(huán)體內(nèi)調(diào)用OSTimeDly(200)以實(shí)現(xiàn)延時(shí)和任務(wù)調(diào)度。App_TaskKbd()負(fù)責(zé)查詢按鍵并通過(guò)消息郵箱將鍵值發(fā)送給任務(wù)App_TaskLed(),App_TaskLed()根據(jù)鍵值改變LED的閃爍頻率。測(cè)試程序通過(guò)IAR6.3編譯,把生成的二進(jìn)制文件固化到LPC1788目標(biāo)板上,接通電源后可以準(zhǔn)確穩(wěn)定地運(yùn)行,說(shuō)明在IAR6.3環(huán)境下基于LPC1788的μC/OS-II移植成功。
文中分析了μC/OS-Ⅱ內(nèi)核的文件結(jié)構(gòu)及基本工作原理,成功實(shí)現(xiàn)了其在LPC1788上的移植。文中相應(yīng)的源代碼不用作任何改變,直接復(fù)制到μC/OS-Ⅱ相應(yīng)文件中,可順利實(shí)現(xiàn)多任務(wù)調(diào)度,且運(yùn)行穩(wěn)定、可靠,可以進(jìn)行ARM Cortex-M3微控制器LPC17xx系列的各種應(yīng)用系統(tǒng)的設(shè)計(jì)與開發(fā)。
[1]Jean J.Labrosse.嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-Ⅱ [M].2版.邵貝貝,譯.北京航空航天大學(xué)出版社,2003.
[2]NXP LPC178x/7x preliminary user manual,[EB.OL]2011.http://www.nxp.com
[3]Micriμm μC/OS-II and ARM Cortex-M3 Processors Application Note(2011)http://www.Micrium.com
[4]孫繼如,郭敏,張宇翔,等.嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-Ⅱ在LPC2378上的移植及應(yīng)用[J].現(xiàn)代電子技術(shù),2010(12):33-36.
SUN Ji-ru,GUO Min,ZHANG Yu-xiang,et al.Transplant and application of the embedded real-time OS μC/OS-Ⅱon LPC2378[J].Modern Electronics Technique,2010(12):33-36.
[5]顧鳳玉,施國(guó)梁,楊濤.基于LPC2478的μC/OS-II的移植及多任務(wù)的實(shí)現(xiàn)[J].電腦知識(shí)與技術(shù),2009(5):1736-1739.GU Feng-yu,SHI Guo-liang,YANG Tao.On the porting of μC/OS-II to LPC2478 ARM processor and the implementation of multitasks[J].Computer Knowledge and Technology,2009(5):1736-1739.
[6]韓明峰,李小濱,鄭永志.uC/OS-II內(nèi)核超時(shí)等待機(jī)制的分析與改進(jìn)[J].計(jì)算機(jī)工程, 2009,35(7):259-266.
HAN Ming-feng,LI Xiao-bin,ZHENG Yong-zhi.Analysis and improvement of waiting-timeout mechanism in uC/OS-II Kernel[J].Computer Engineering,2009,35(7):259-266.
[7]劉艷軍.基于C8051和μC/OS-Ⅱ的數(shù)控機(jī)床嵌入式執(zhí)行控制器實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2010(16):63-65.
LIU Yan-jun.Realization of embedded actuator&Controller for CNC machine tool based on C8051 and μC/OS-Ⅱ[J].Modern Electronics Technique,2010(16):63-65.
[8]汪獻(xiàn)忠,郭鳳華,田增國(guó).基于ARM和μC/OS-Ⅱ的在線磷酸根離子監(jiān)測(cè)儀設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2010(19):154-155,158.
WANG Xian-zhong,GUO Feng-hua,TIAN Zeng-guo.Design of phosphate ion online monitoring instrument based on ARM and μC/OS-Ⅱ[J].Modern Electronics Technique,2010(19):154-155,158.