吳愛平 (長江大學(xué)電子信息學(xué)院,湖北荊州434023)
李勇華 (中石化勝利石油管理局鉆井研究院,山東東營257000)
嵌入式系統(tǒng)是將先進的計算機技術(shù)、半導(dǎo)體技術(shù)和電子技術(shù)與各個行業(yè)的具體應(yīng)用相結(jié)合后的產(chǎn)物,目前嵌入式系統(tǒng)已經(jīng)滲透到日常生活的各個領(lǐng)域,其在工業(yè)、服務(wù)業(yè)、消費電子等領(lǐng)域的應(yīng)用范圍都在不斷擴大[1]。嵌入式系統(tǒng)由硬件和軟件兩大部分組成。通常軟件部分主要基于實時操作系統(tǒng) (簡稱RTOS),在特定的RTOS之上開發(fā)應(yīng)用軟件;硬件部分主要是以某一個硬核微處理器芯片為核心,如DSP,ARM,單片機等[2~4],這些硬核均來自于第3方公司,且無法裁剪處理器硬件資源,造成設(shè)計資源的浪費和設(shè)計的不便。筆者以Altera公司推出的NiosⅡ軟核處理器為例[5],闡述了基于NiosⅡ處理器的移植方法。該方法彌補了硬處理器的不足,大大促進了軟硬件協(xié)同設(shè)計?;贜iosⅡ處理器的實時操作系統(tǒng)具有可裁剪、可擴充、可升級的靈活設(shè)計方式及在系統(tǒng)可編程的靈活功能。
μ C/OS-Ⅱ是一款源代碼開放的實時操作系統(tǒng)內(nèi)核,是專為嵌入式應(yīng)用而設(shè)計的。其代碼大部分是用移植性很強的ANSI_C編寫;可通過條件編譯對提供的系統(tǒng)服務(wù)進行裁減;完全搶占式的內(nèi)核,總是運行處于就緒態(tài)的最高優(yōu)先級的任務(wù);每個任務(wù)被賦予唯一的優(yōu)先級并使用自己獨立的堆棧;還可提供多種系統(tǒng)服務(wù),如郵箱、消息隊列、信號量、內(nèi)存管理和時間管理等相關(guān)函數(shù)[6]。
NiosⅡ系列嵌入式處理器是一款采用流水線技術(shù)、單指令流的RISC CPU,廣泛應(yīng)用于嵌入式系統(tǒng)。NiosⅡ嵌入式CPU支持32位指令集、32位數(shù)據(jù)線寬度、32個通用寄存器、32個外部中斷源、2GB尋址空間,包含高達256個用戶自定義的CPU定制指令[7]。NiosⅡ的所有數(shù)據(jù)、程序都是通過Avalon總線傳輸?shù)摹Mㄟ^使用Altera的QuartusⅡ軟件以及SOPC Builder工具可以輕松地構(gòu)建NiosⅡ內(nèi)核。該設(shè)計中需添加NiosⅡCPU核、Avalon三態(tài)總線橋、系統(tǒng)ID、片內(nèi)存儲器、片外存儲器接口、PIO、定時器、液晶顯示接口等,同時定制和配置它們的功能、分配外設(shè)地址及中斷號、設(shè)定復(fù)位地址、最后生成NiosⅡ系統(tǒng)。定制好的NiosⅡ處理器軟核如圖1所示。
所謂移植就是使一個實時內(nèi)核能在其他微處理器或微控制器上運行,即編寫與處理器相關(guān)代碼。圖2所示為μ C/OS-Ⅱ的結(jié)構(gòu)以及與硬件的關(guān)系。從圖2中可以看出完成移植工作主要是將OS_CPU.H、OS_CPU_A.ASM、OS_CPU_C.C進行修改。
圖1 SOPC Builder中NiosⅡ系統(tǒng)組件
對基于NiosⅡ的軟核 CPU而言,其設(shè)計開發(fā)使用NiosⅡIDE軟件工具,該軟件開發(fā)工具為NiosⅡ核提供HAL系統(tǒng)庫[8]。HAL系統(tǒng)庫是一個簡化的運行環(huán)境,為底層硬件通信程序提供簡單器件驅(qū)動接口,HAL應(yīng)用程序接口(API)和ANSI C標準庫集成在一起,用戶可以通過HAL API通用設(shè)備模型訪問硬件資源,如圖3所示。ANSI C標準庫與HAL的緊密結(jié)合使得軟件開發(fā)成為可能[9]。例如可使用ANSI C標準庫的I/O函數(shù)來操作字符模式設(shè)備和文件,如printf()、scanf()等。
圖2 μ C/OS-Ⅱ硬件/軟件體系結(jié)構(gòu)
1)OS_CPU.H的編寫 在OS_CPU.H文件中定義了與處理器(實際上是與編譯器相關(guān))的數(shù)據(jù)類型、堆棧增長方向以及系統(tǒng)軟中斷。定義了與處理器相關(guān)的宏,主要是進入臨界區(qū)的OS_ENTER_CRITICAL()和退出臨界區(qū)的OS_EXIT_CRITICAL()。
2)OS_CPU_C.C的編寫 在OS_CPU_C.C文件中,需要編寫6個與操作系統(tǒng)有關(guān)的函數(shù)。這6個函數(shù)是:OSTaskStkInit()、OSTaskCreatHook()、OSTaskDelHook()、OSTaskSwHook()、OSTaskStatHook()和OSTaskTickHook()。在6個函數(shù)中只需對OSTaskStkInit()編寫代碼,后5個Hook函數(shù)必須聲明,它們是由系統(tǒng)函數(shù)調(diào)用的鉤掛函數(shù),讓用戶能在操作系統(tǒng)中加入自己需要的一些功能,也可以為空函數(shù),其內(nèi)部可以沒有代碼。
OSTaskCreate()和OSTaskCreateExt()通過調(diào)用OSTaskStkInit()來初始化任務(wù)的堆棧結(jié)構(gòu),它需要的參數(shù)是任務(wù)代碼起始地址、參數(shù)指針、任務(wù)堆棧頂端的地址。初始化任務(wù)的棧結(jié)構(gòu)工作結(jié)束后,堆??雌饋砭拖裰袛鄤偘l(fā)生過一樣,所有寄存器都保存在堆棧中,從而可以利用中斷返回指令使就緒的任務(wù)運轉(zhuǎn)起來。NiosⅡ處理器的堆棧方向是地址由高到低遞減方式。
圖3 HAL系統(tǒng)庫結(jié)構(gòu)
3)OS_CPU_A.ASM的編寫 該文件包括4個函數(shù)都涉及對寄存器的處理,跟處理器有關(guān),由于不同處理器有不同寄存器,所以操作系統(tǒng)在這個文件里給用戶留下4個函數(shù)接口,以便用戶根據(jù)所選處理器編寫相應(yīng)的匯編程序以完成固定功能。μ C/OS-Ⅱ的移植要求用戶編寫4個匯編語言函數(shù):OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()。OSStartHighRdy()函數(shù)由OSStart()調(diào)用,用來啟動優(yōu)先級最高的任務(wù)執(zhí)行,負責從最高優(yōu)先級任務(wù)的TCB控制塊中獲得該任務(wù)的堆棧指針sp,通過sp依次將CPU現(xiàn)場恢復(fù);OSCtxSw()函數(shù)是一個任務(wù)級的任務(wù)切換函數(shù),是在任務(wù)需要進行切換時被OS_TASK_SW()調(diào)用;OSIntCtxSw()函數(shù)是中斷級的任務(wù)切換函數(shù),被OSIntExit()調(diào)用,是在ISR中執(zhí)行中斷任務(wù)切換;OSTick ISR()函數(shù)是時鐘節(jié)拍中斷處理函數(shù),在調(diào)用OSStart()后才可啟動。它的主要任務(wù)是負責處理時鐘中斷,為內(nèi)核提供時鐘節(jié)拍。
μ C/OS-Ⅱ移植完成后,需要進行測試,以驗證移植的μ C/OS-Ⅱ是否能正常工作。測試中建立了10個任務(wù):INITIALIZE_TASK為初始化任務(wù);PRINT_STAT US_TASK為打印狀態(tài)任務(wù);light_led為點亮流水燈任務(wù);light_LCD為液晶顯示任務(wù);SEG_Display為數(shù)碼管顯示任務(wù);GETSEM_TASK1和GETSEM_TASK2任務(wù)是競爭由信號量保護的共享資源;RECEIVE_TASK1和RECEIVE_TASK2任務(wù)是周期性地從隊列中取出數(shù)據(jù);SEND_TASK任務(wù)是將增加的數(shù)據(jù)添加到消息隊列中。硬件系統(tǒng)在Quartus II中配置編譯完畢后,下載到DEⅡ板的FPGA芯片上,然后將在μ C/OS-Ⅱ內(nèi)核上添加了任務(wù)的軟件系統(tǒng)進行編譯,下載到FPGA芯片內(nèi)的NiosⅡ硬件系統(tǒng)中,系統(tǒng)開始運行。在NiosⅡIDE的控制臺上可以看到PRINT_STATUS_TASK任務(wù)的執(zhí)行情況如圖4(a)和圖4(b)所示;從DEⅡ板上可以看到light_led、light_LCD、SEG_Display這3個任務(wù)的執(zhí)行情況,測試效果如圖5所示。
圖4 NiosⅡ IDE的控制臺監(jiān)控圖
PRINT_STAT US_TASK任務(wù)的作用是在NiosⅡIDE的控制臺上周期性地顯示 “長江大學(xué)電子信息學(xué)院”、send_task發(fā)送的消息數(shù)、received_task1和received_task2接收到的消息數(shù)、得到信號量的任務(wù)名、getsem_task1和getsem_task1獲得信號量的次數(shù)。圖4(a)所示內(nèi)容與圖4(b)所示內(nèi)容間隔3s鐘交替出現(xiàn),唯獨變化的是其中的數(shù)據(jù),從圖4(a)和圖 4(b)中看到SEND_TASK發(fā)送的消息數(shù)是1170,3s后SEND_TASK發(fā)送的消息數(shù)是1182,從中可以知道SEND_TASK任務(wù)每3s發(fā)送12條消息。同樣可知RECEIVE_TASK1每3s接收9條消息,RECEIVE_TASK2每3s接收3條消息。
light_LCD任務(wù)使得在液晶上第1排顯示Beijing Olimpics,第2排滾動顯示Sichuan stand,Jiayou China!;SEG_Display任務(wù)使8個數(shù)碼管分別顯示12345678,1s后又顯示 87654321,1s后又同時顯示12345678,如此每一秒變化一次,無限循環(huán)下去;light_led任務(wù)讓LED從左到右依次流水顯示,每一秒變化一次,到頭后再從右端開始點亮,無限循環(huán)下去。
圖5 任務(wù)light_led、light_LCD、SEG_Display執(zhí)行情況靜態(tài)截圖
通過對NiosⅡIDE的控制臺監(jiān)測和DE II板的實際硬件測試可以看出每個任務(wù)都只是在執(zhí)行自己的操作,任務(wù)之間除了通過信號量、消息隊列通信外,互相之間沒有任何干擾,實時性非常好。
μ C/OS-Ⅱ作為優(yōu)秀的實時操作系統(tǒng)已經(jīng)被移植到許多體系結(jié)構(gòu)的硬核微處理器上,筆者成功地將μ C/OS-Ⅱ嵌入式操作系統(tǒng)移植到了NiosⅡ軟核微處理器上,實現(xiàn)了整個平臺穩(wěn)定可靠的運行。μ C/OS-Ⅱ和NiosⅡ相結(jié)合,可以構(gòu)成一種基于可配置的軟核處理器的嵌入式開發(fā)平臺,該平臺軟、硬件均可按照用戶需求進行剪裁配置,最大程度地提供了系統(tǒng)設(shè)計的靈活性,因此具有實際應(yīng)用價值。
[1]安輝,孫昌志.顎藽/OS-Ⅱ操作系統(tǒng)在DSP上的移植及應(yīng)用 [J].自動化技術(shù)與應(yīng)用,2008,27(1):65~69.
[2]徐杰,宋建成.μ C/OS-Ⅱ操作系統(tǒng)在ARM7上移植的實現(xiàn) [J].工礦自動化,2009,(6):49~52.
[3]周文.μ C/OS-Ⅱ在 AT89S51單片機上的移植 [J].計算機與現(xiàn)代化,2008,(4):17~22.
[4]孟慶峰.實時內(nèi)核μ C/OS在S3C44B0XII上移植的研究與實現(xiàn) [J],安徽電子信息職業(yè)技術(shù)學(xué)院學(xué)報,2008,(1):57~60.
[5]Altera.NiosⅡProcessor Reference Handbook[EB/OL].http://www.altera.com/literature/lit-nio2.jsp,2009.
[6]Labrosse J J.嵌入式實時操作系統(tǒng)uC/OS-Ⅱ[M].第2版.邵貝貝 譯.北京:北京航天航空大學(xué)出版社,2003.
[7]巨政權(quán),原亮.SOPC系統(tǒng)建立及μ Clinux移植實現(xiàn) [J].微計算機信息,2009,25(4):43~45.
[8]李蘭英.NiosⅡ嵌入式軟核SOPC設(shè)計原理及應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2006.
[9]任愛鋒.基于FPGA的嵌入式系統(tǒng)設(shè)計[M].西安:電子科技大學(xué)出版社,2004.