摘 要:提出一種將開源實(shí)時操作系統(tǒng)μC/OSⅡ與文件系統(tǒng)、圖形界面等整合構(gòu)建成一個嵌入式應(yīng)用系統(tǒng)的設(shè)計(jì)方案。該方案通過分析μC/OSⅡ的啟動過程,重新配置和定義μC/OSⅡ的3個主要函數(shù),初始化S3C44B0X內(nèi)部LCD控制器的驅(qū)動程序,修改μC/GUI相關(guān)的配置文件和宏定義,總結(jié)出一套在S3C44B0X上具體的整合方法、移植步驟以及注意事項(xiàng)。最后測試表明該整合移植方法是可行的,系統(tǒng)平臺運(yùn)行穩(wěn)定可靠。
關(guān)鍵詞:S3C44B0X;μC/OSⅡ;μC/GUI;移植
中圖分類號:TP3141.54 文獻(xiàn)標(biāo)識碼:B 文章編號:1004373X(2008)1603303
Realization of Transplanting μC/OSⅡ with μC/GUI in S3C44B0X
ZHOU Bo.1,MA Wenwen.2
(1.PLA No.92601 Troops,Zhanjiang,524009,China;2.Information Science and Engineering,Central South University,Changsha,410083,China)
Abstract:This paper presents a design method of embedded application system which uses open source real time operation system μC/OSⅡ combing such as file system,graphic user interface and so on.Via analyzing startup process of μC/OSⅡ,reconfiguring and defining three main functions of μC/OSⅡ,initializing drivers of LCD controller inside,modifying correlative configuration file and macro definition of μC/GUI,text summarizes the technique of realization,the steps of transplant and special notices.The testing indicates that the transplanting method is feasible,system platform runs stability and reliably.
Keywords:S3C44B0X;μC/OSⅡ;μC/GUI;transplant
μC/OSⅡ是一個微型的實(shí)時操作系統(tǒng),包括一個操作系統(tǒng)最基本的一些特性,如任務(wù)調(diào)度、任務(wù)通信、內(nèi)存管理、中斷管理等,而且這是一個代碼完全開放的實(shí)時操作系統(tǒng),其源代碼相對其他操作系統(tǒng)來講是非常簡單的。但是就μC/OSⅡ本身而言,它僅是一個內(nèi)核,還不能直接用于一個復(fù)雜的工程項(xiàng)目,必須與其他一些模塊如TCPIP、文件系統(tǒng)(FS)、圖形界面(GUI)等等整合[1],其中圖形界面(GUI)是一個成熟的工程產(chǎn)品不可缺少的部分。目前較為流行的嵌入式GUI有miroWindows,MiniGUI,QTEmbeddedOpenGUI,LcGUI等,而基于μC/OSⅡ平臺的用的較多的是μC/GUI。μC/GUI是Micrium公司開發(fā)的一種基于嵌入式系統(tǒng)的圖形界面支持系統(tǒng)。可以用于任何使用LCD圖形顯示的應(yīng)用,提供高效的獨(dú)立于處理器及LCD控制器的圖形用戶接口,可以在單任務(wù)或是多任務(wù)系統(tǒng)上運(yùn)行,并適用于任意LCD控制器和CPU下任何尺寸的真實(shí)顯示或虛擬顯示。
S3C44B0X是三星(SAMSUNG)公司一款基于ARM7TDMI核的32位的微處理器。它一方面具有ARM處理器的所有優(yōu)點(diǎn):低功耗、高性能;同時又具有非常豐富的片上資源,還集成LCD控制器,非常適合嵌入式產(chǎn)品的開發(fā)。通過將μC/OSⅡ和μC/GUI整合移植到S3C44B0X上,在此基礎(chǔ)上進(jìn)行應(yīng)用軟件的開發(fā)與傳統(tǒng)的嵌入式系統(tǒng)的開發(fā)相比更加簡單。本系統(tǒng)移植過程在ARMSDT2.5仿真開發(fā)環(huán)境下進(jìn)行編譯,用JTAG仿真器進(jìn)行在線仿真調(diào)試。
1 BootLoader
BootLoader是操作系統(tǒng)內(nèi)核啟動之前運(yùn)行的一段小程序,其作用與PC機(jī)上的BIOS類似,通過這段程序,將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。在一個基于ARM7TDMICPU核的嵌入式系統(tǒng)中,系統(tǒng)在上電或復(fù)位時通常都從地址0x00000000處開始執(zhí)行。BootLoader可以分為3個部分:第一部分是匯編代碼,完成初始化中斷向量表和堆棧的功能;第二部分開始進(jìn)入C語言編程,完成一些與啟動操作系統(tǒng)相關(guān)的硬件的初始化工作,如內(nèi)存控制器、I/O控制和串口設(shè)備等;第三部分負(fù)責(zé)設(shè)置合適的硬、軟件環(huán)境,以便操作系統(tǒng)的內(nèi)核可以順利啟動。
BootLoader完成系統(tǒng)初始化工作后把內(nèi)核和文件系統(tǒng)的映像文件由存儲設(shè)備中拷貝到SDRAM中,再從SDRAM中執(zhí)行內(nèi)核的引導(dǎo)程序,自行加載內(nèi)核和根文件系統(tǒng)。S3C44B0X沒有存儲區(qū)重映射功能,所有存儲區(qū)地址固定;并且S3C44B0X提供矢量中斷功能,這樣減少了中斷延遲,但是在啟動程序中,須擴(kuò)展向量表。同時為了方便程序設(shè)計(jì)和在RAM中調(diào)試,中斷入口通過地址定義方式轉(zhuǎn)移到RAM區(qū)的最高端。圖1為S3C44B0X啟動程序流程圖[2]。
通過配置特殊功能寄存器完成存儲器的初始化,將編譯生成的二進(jìn)制文件bootloader.bin燒進(jìn)NOR FLASH里就完成了系統(tǒng)啟動。
2 μC/OSⅡ移植所需工作
要使μC/OSⅡ可以正常工作,必須滿足下面要求[3]:
(1) 處理器的C編譯器可以產(chǎn)生可重入代碼。這樣在多個任務(wù)被調(diào)用時,不必?fù)?dān)心數(shù)據(jù)被破壞,比如中斷執(zhí)行的時候。ARM SDT的集成開發(fā)環(huán)境可以生成可重入代碼。
(2) 程序中可以打開或者關(guān)閉中斷。在進(jìn)入臨界區(qū)時需要使用到這個功能。在ARM的處理器上,可以設(shè)置寄存器CPSR關(guān)閉或者打開系統(tǒng)的所有中斷。
(3) 處理器支持中斷,并且能夠產(chǎn)生定時中斷。多任務(wù)系統(tǒng)治之間的調(diào)度是通過定時器的調(diào)度。在ARM的處理器上可以產(chǎn)生定時器中斷。
(4) 處理器能夠支持一定數(shù)量數(shù)據(jù)的硬件堆棧。對于ARM這樣的可以使用大容量儲存器的處理器,這個不是問題。對于只能訪問1 kB大小存儲單元的處理器下移植比較困難。
(5) 處理器有將堆棧指針和其他CPU寄存器和讀出到堆?;蛘邇?nèi)存的指令。μC/OSⅡ在進(jìn)行任務(wù)調(diào)度時,會把當(dāng)前任務(wù)的CPU寄存器存放到此任務(wù)的堆棧中,然后,再從另一個任務(wù)的堆棧中恢復(fù)原來的工作寄存器,繼續(xù)運(yùn)行另一個任務(wù)。
根據(jù)上述要求進(jìn)行μC/OSⅡ的移植,主要對OS_CPU.H,OS_CPU_C.C和OS_CPU_A.ASM三個文件進(jìn)行修改[4]。3個文件所定義的函數(shù)在很多文獻(xiàn)中都作了介紹,本文主要說明以下幾個需要特殊注意的函數(shù)。
(1) OSTaskStkInit()函數(shù)。OSTaskStkInit()在任務(wù)創(chuàng)建的時候被調(diào)用,它負(fù)責(zé)初始化任務(wù)的堆棧結(jié)構(gòu)。任務(wù)的最初堆棧。μC/OSⅡ的任務(wù),在沒有執(zhí)行的時候就像是剛剛被中斷一樣,任務(wù)一經(jīng)CreateTask()創(chuàng)建,就是這樣的。堆棧則是任務(wù)上下文(contex)的一部分,CreateTask()調(diào)用OSTaskStkInit()來給任務(wù)做一個初始的任務(wù)上下文堆棧。任務(wù)堆棧結(jié)構(gòu)如圖2所示。
(2) OSCtxSw()函數(shù)。該函數(shù)由OS_TASK_SW()宏調(diào)用。OS_TASK_SW()由OSSched()函數(shù)調(diào)用。OSSched()函數(shù)負(fù)責(zé)任務(wù)之間的切換,OSCtxSw()函數(shù)在OSSched()函數(shù)中負(fù)責(zé)將當(dāng)前任務(wù)對應(yīng)的處理器寄存器保存到堆棧中,并將任務(wù)中需要恢復(fù)的處理器寄存器從堆棧中恢復(fù)出來。
(3) OSIntCtxSw()函數(shù)。該函數(shù)由OSIntExt()函數(shù)調(diào)用。OSIntExt()函數(shù)由OSTickISR()函數(shù)調(diào)用。OSIntCtxSw()負(fù)責(zé)在定時中斷之間的切換。OSCtxSw()函數(shù)和OSIntCtxSw()函數(shù)均負(fù)責(zé)任務(wù)之間的切換,區(qū)別主要在于是否在定時中斷期間負(fù)責(zé)任務(wù)切換。OSIntCtwSw()函數(shù)主要負(fù)責(zé)當(dāng)前任務(wù)堆棧指針,并將新任務(wù)對應(yīng)的處理器寄存器從堆棧中恢復(fù)出來。
不管是中斷級任務(wù)切換還是任務(wù)級任務(wù)切換,發(fā)生切換需求時處理器都將脫離原先的系統(tǒng)模式,進(jìn)入IRQ異常模式或SVC異常模式。由于這2種異常模式使用自己獨(dú)立的物理寄存器,進(jìn)入異常時當(dāng)前指針已經(jīng)不是剛才指向任務(wù)堆棧的指針,當(dāng)前也不是剛才系統(tǒng)模式下的寄存器,所以必須設(shè)法保存剛才系統(tǒng)模式下的R0~R12,LR,CPSR和指向下條指令地址的PC,使用的堆棧必須是系統(tǒng)模式下SP指向的任務(wù)堆棧,同時還要保證異常模式下的堆棧恢復(fù)原樣,不發(fā)生內(nèi)存泄漏。在操作上,為保證壓棧的是中斷剛發(fā)生時系統(tǒng)模式下寄存器的值,程序采用先用異常模式堆棧過渡、再切換模式、分批保存的策略。
(4) OSTickISR()函數(shù)。μC/OSⅡ要求用戶提供一個時鐘源來實(shí)現(xiàn)時鐘節(jié)拍的功能,時鐘節(jié)拍推薦為每秒發(fā)生10~100次。時間節(jié)拍函數(shù),由定時器中斷產(chǎn)生,主要完成的功能為保存處理器寄存器,調(diào)用OSIntEnter(),調(diào)用OSTimeTick(),調(diào)用OSIntExit(),恢復(fù)處理器寄存器,執(zhí)行中斷返回命令。
3 μC/OSⅡ和μC/GUI的整合
液晶模塊選用LFUBK909,STN型,每個像素通過3位數(shù)據(jù)來表示顏色狀態(tài),液晶屏大小
為320×240像素。S3C44B0X的LCD控制器設(shè)置8位單掃描,256色工作模式。為μC/GUI移植主要修改3個文件,包括LCDConfig.h,GUIConfig.h和LCDdriver.c。
(1) LCDConfig.h中定義可供配置的適用的宏。以下是S3C44B0X的LCD控制器的宏定義。
#define LCD_CONTROLLER (0)//控制器名稱
#define LCD_XSIZE (320)//x大小
#define LCD_YSIZE (240)//y大小
#define LCD_BITSPERPIXEL (8)//每像素適用的數(shù)據(jù)位
#define LCD_FIXEDPALETTE (332)//調(diào)色板模式
#define LCD_NUM_CONTROLLER (1)//控制器數(shù)量
#define LCD_MAX_LOG_COLORS (256)//最大邏輯顏色數(shù)
(2) GUIConfig.h主要對一些高級選項(xiàng)進(jìn)行控制和定義。定義對操作系統(tǒng)的有關(guān)配置、動態(tài)內(nèi)存空間、默認(rèn)字體以及是否使用觸摸屏、窗口管理和存儲器管理等選項(xiàng)。
#define GUI_OS (1) //支持操作系統(tǒng)
#define GUI_WINSUPPORT (1) //使用窗口管理器
#define GUI_SUPPORT_MEMDEV (1) //支持存儲器管理
#define GUI_SUPPORT_TOUCH (1) //使用觸摸屏
#define GUI_SUPPORT_UNICODE (1) //支持UNICODE
#define GUI_ALLOC_SIZE 12500 //動態(tài)內(nèi)存區(qū)大小
#define GUI_DEFAULT_FONT GUI_Font6x8//默認(rèn)字體
(3) LCDdriver.c主要定義μC/GUI與LCD的硬件接口函數(shù)。包括LCD的初始化函數(shù),畫點(diǎn)、線、多邊形、位圖等二維圖形的函數(shù)。主要定義以下函數(shù)。
int LCD_L0_Init(void)//初始化
void LCD_L0_SetPixelIndex(int x,int y,int ColorIndex)//用指定顏色在x,y處畫點(diǎn)
void LCD_L0_DrawHLine(int x0,int y,int x1)//畫水平線
void LCD_L0_DrawVLine(int x,int y0,int y1)//畫垂直線
void LCD_L0_FillRect(int x0,int y0,int x1,int y1)//用當(dāng)前顏色填充矩形區(qū)域
void LCD_L0_DrawBitmap(int x0,int y0,int xsize,int ysize,int BitsPerPixel,int BytesPerLine,const U8* pData,int Diff,const LCD_PIXELINDEX* pTrans)//畫位圖
在μC/OSⅡ系統(tǒng)中建立多個任務(wù),每個任務(wù)都有自己的優(yōu)先級。多個任務(wù)調(diào)用μC/GUI用于用戶界面,在任務(wù)系統(tǒng)中具有典型的低級別,不會影響系統(tǒng)的實(shí)時行為。μC/OSⅡ中為了防止數(shù)據(jù)別破壞,每個任務(wù)訪問共享資源時必須獨(dú)占該資源,應(yīng)該事先聲明。訪問結(jié)束后,應(yīng)交出對資源的訪問權(quán)。當(dāng)多個任務(wù)調(diào)用μC/GUI,液晶屏就是共享資源,當(dāng)每個任務(wù)訪問之前,就必須鎖定該資源;當(dāng)訪問完成后,對其進(jìn)行解鎖[5]。μC/OSⅡ下使用μC/GUI就需要提供一些內(nèi)核接口函數(shù),與硬件相關(guān)的同時與操作系統(tǒng)相匹配。
static OS_EVENT *DispSem;
void GUI_InitOS(void)//初始化內(nèi)核接口
void GUI_X_Lock(void)//鎖定
void GUI_X_Unlock(void)//解鎖
U32 GUI_X_GetTaskId(void)//返回當(dāng)前任務(wù)標(biāo)志符
在某些程序中,如果用到窗口工作機(jī)制的回調(diào)函數(shù),實(shí)現(xiàn)時間函數(shù)就非常必要。
void GUI_X_Delay(int Period)//延時
void GUI_X_ExecIdle(void)//空閑任務(wù)
通過函數(shù)void GUI_Exec(void)來完成屏幕的刷新工作。
完成以上工作,操作系統(tǒng)μC/OSⅡ中就可以使用μC/GUI。μC/GUI中除了與硬件相關(guān)的代碼,還包括其他代碼。文件目錄結(jié)構(gòu)如圖3所示。為了使開發(fā)過程變得更加簡單,這里將源文件編譯成ucgui.alf文件,即編譯成一個庫,直接添加在μC/OSⅡ下,如圖4所示。
在移植好的μC/OSⅡ和μC/GUI上建立自己的應(yīng)用程序,編譯生成system.bin文件,通過JTAG在線調(diào)試,成功后通過USB口直接下載到Nand Flash。程序就可以在硬件系統(tǒng)上正常運(yùn)行。
4 結(jié) 語
本文介紹BootLoader的編程方法,以及μC/OSⅡ和μC/GUI的整合移植具體方法。在此基礎(chǔ)上可以完成多任務(wù)調(diào)度。應(yīng)用表明,μC/OSⅡ在S3C44B0X上運(yùn)行穩(wěn)定,可以達(dá)到實(shí)時系統(tǒng)的要求,μC/GUI在多任務(wù)環(huán)境下工作穩(wěn)定,具有良好的顯示效果,其必將在嵌入式儀器儀表的設(shè)計(jì)中得到廣泛的應(yīng)用。
參 考 文 獻(xiàn)
[1]王田苗.嵌入式系統(tǒng)設(shè)計(jì)與實(shí)例開發(fā)[M].北京:清華大學(xué)出版社,2003.
[2]田澤.嵌入式系統(tǒng)開發(fā)與應(yīng)用教程[M].北京:北京航空航天大學(xué)出版社,2005.
[3]韓志耕,王健.實(shí)時內(nèi)核μC/OSⅡ在S3C44B0X上移植的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2006,27(5):828830.
[4]劉濱,劉兵,趙艷華.基于μC/GUI的嵌入式圖形界面的設(shè)計(jì)[J].液晶與顯示,2005,20(6):558563.
[5]陳進(jìn),周治國.嵌入式圖形用戶界面在S3C44B0X上的移植[J].工業(yè)控制技術(shù),2006(3):9799.
[6]趙瑞芳,唐焱,吳倚龍.μC/GUI中觸摸屏操作在S3C2410上的實(shí)現(xiàn)\\.現(xiàn)代電子技術(shù),2007,30(10):6365,99.