摘 要:提出一種將開源實時操作系統(tǒng)μC/OSⅡ與文件系統(tǒng)、圖形界面等整合構建成一個嵌入式應用系統(tǒng)的設計方案。該方案通過分析μC/OSⅡ的啟動過程,重新配置和定義μC/OSⅡ的3個主要函數(shù),初始化S3C44B0X內(nèi)部LCD控制器的驅動程序,修改μC/GUI相關的配置文件和宏定義,總結出一套在S3C44B0X上具體的整合方法、移植步驟以及注意事項。最后測試表明該整合移植方法是可行的,系統(tǒng)平臺運行穩(wěn)定可靠。
關鍵詞:S3C44B0X;μC/OSⅡ;μC/GUI;移植
中圖分類號:TP3141.54 文獻標識碼: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Ⅱ是一個微型的實時操作系統(tǒng),包括一個操作系統(tǒng)最基本的一些特性,如任務調度、任務通信、內(nèi)存管理、中斷管理等,而且這是一個代碼完全開放的實時操作系統(tǒng),其源代碼相對其他操作系統(tǒng)來講是非常簡單的。但是就μC/OSⅡ本身而言,它僅是一個內(nèi)核,還不能直接用于一個復雜的工程項目,必須與其他一些模塊如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圖形顯示的應用,提供高效的獨立于處理器及LCD控制器的圖形用戶接口,可以在單任務或是多任務系統(tǒng)上運行,并適用于任意LCD控制器和CPU下任何尺寸的真實顯示或虛擬顯示。
S3C44B0X是三星(SAMSUNG)公司一款基于ARM7TDMI核的32位的微處理器。它一方面具有ARM處理器的所有優(yōu)點:低功耗、高性能;同時又具有非常豐富的片上資源,還集成LCD控制器,非常適合嵌入式產(chǎn)品的開發(fā)。通過將μC/OSⅡ和μC/GUI整合移植到S3C44B0X上,在此基礎上進行應用軟件的開發(fā)與傳統(tǒng)的嵌入式系統(tǒng)的開發(fā)相比更加簡單。本系統(tǒng)移植過程在ARMSDT2.5仿真開發(fā)環(huán)境下進行編譯,用JTAG仿真器進行在線仿真調試。
1 BootLoader
BootLoader是操作系統(tǒng)內(nèi)核啟動之前運行的一段小程序,其作用與PC機上的BIOS類似,通過這段程序,將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調用操作系統(tǒng)內(nèi)核準備好正確的環(huán)境。在一個基于ARM7TDMICPU核的嵌入式系統(tǒng)中,系統(tǒng)在上電或復位時通常都從地址0x00000000處開始執(zhí)行。BootLoader可以分為3個部分:第一部分是匯編代碼,完成初始化中斷向量表和堆棧的功能;第二部分開始進入C語言編程,完成一些與啟動操作系統(tǒng)相關的硬件的初始化工作,如內(nèi)存控制器、I/O控制和串口設備等;第三部分負責設置合適的硬、軟件環(huán)境,以便操作系統(tǒng)的內(nèi)核可以順利啟動。
BootLoader完成系統(tǒng)初始化工作后把內(nèi)核和文件系統(tǒng)的映像文件由存儲設備中拷貝到SDRAM中,再從SDRAM中執(zhí)行內(nèi)核的引導程序,自行加載內(nèi)核和根文件系統(tǒng)。S3C44B0X沒有存儲區(qū)重映射功能,所有存儲區(qū)地址固定;并且S3C44B0X提供矢量中斷功能,這樣減少了中斷延遲,但是在啟動程序中,須擴展向量表。同時為了方便程序設計和在RAM中調試,中斷入口通過地址定義方式轉移到RAM區(qū)的最高端。圖1為S3C44B0X啟動程序流程圖[2]。

通過配置特殊功能寄存器完成存儲器的初始化,將編譯生成的二進制文件bootloader.bin燒進NOR FLASH里就完成了系統(tǒng)啟動。
2 μC/OSⅡ移植所需工作
要使μC/OSⅡ可以正常工作,必須滿足下面要求[3]:
(1) 處理器的C編譯器可以產(chǎn)生可重入代碼。這樣在多個任務被調用時,不必擔心數(shù)據(jù)被破壞,比如中斷執(zhí)行的時候。ARM SDT的集成開發(fā)環(huán)境可以生成可重入代碼。
(2) 程序中可以打開或者關閉中斷。在進入臨界區(qū)時需要使用到這個功能。在ARM的處理器上,可以設置寄存器CPSR關閉或者打開系統(tǒng)的所有中斷。
(3) 處理器支持中斷,并且能夠產(chǎn)生定時中斷。多任務系統(tǒng)治之間的調度是通過定時器的調度。在ARM的處理器上可以產(chǎn)生定時器中斷。
(4) 處理器能夠支持一定數(shù)量數(shù)據(jù)的硬件堆棧。對于ARM這樣的可以使用大容量儲存器的處理器,這個不是問題。對于只能訪問1 kB大小存儲單元的處理器下移植比較困難。
(5) 處理器有將堆棧指針和其他CPU寄存器和讀出到堆棧或者內(nèi)存的指令。μC/OSⅡ在進行任務調度時,會把當前任務的CPU寄存器存放到此任務的堆棧中,然后,再從另一個任務的堆棧中恢復原來的工作寄存器,繼續(xù)運行另一個任務。
根據(jù)上述要求進行μC/OSⅡ的移植,主要對OS_CPU.H,OS_CPU_C.C和OS_CPU_A.ASM三個文件進行修改[4]。3個文件所定義的函數(shù)在很多文獻中都作了介紹,本文主要說明以下幾個需要特殊注意的函數(shù)。
(1) OSTaskStkInit()函數(shù)。OSTaskStkInit()在任務創(chuàng)建的時候被調用,它負責初始化任務的堆棧結構。任務的最初堆棧。μC/OSⅡ的任務,在沒有執(zhí)行的時候就像是剛剛被中斷一樣,任務一經(jīng)CreateTask()創(chuàng)建,就是這樣的。堆棧則是任務上下文(contex)的一部分,CreateTask()調用OSTaskStkInit()來給任務做一個初始的任務上下文堆棧。任務堆棧結構如圖2所示。

(2) OSCtxSw()函數(shù)。該函數(shù)由OS_TASK_SW()宏調用。OS_TASK_SW()由OSSched()函數(shù)調用。OSSched()函數(shù)負責任務之間的切換,OSCtxSw()函數(shù)在OSSched()函數(shù)中負責將當前任務對應的處理器寄存器保存到堆棧中,并將任務中需要恢復的處理器寄存器從堆棧中恢復出來。
(3) OSIntCtxSw()函數(shù)。該函數(shù)由OSIntExt()函數(shù)調用。OSIntExt()函數(shù)由OSTickISR()函數(shù)調用。OSIntCtxSw()負責在定時中斷之間的切換。OSCtxSw()函數(shù)和OSIntCtxSw()函數(shù)均負責任務之間的切換,區(qū)別主要在于是否在定時中斷期間負責任務切換。OSIntCtwSw()函數(shù)主要負責當前任務堆棧指針,并將新任務對應的處理器寄存器從堆棧中恢復出來。
不管是中斷級任務切換還是任務級任務切換,發(fā)生切換需求時處理器都將脫離原先的系統(tǒng)模式,進入IRQ異常模式或SVC異常模式。由于這2種異常模式使用自己獨立的物理寄存器,進入異常時當前指針已經(jīng)不是剛才指向任務堆棧的指針,當前也不是剛才系統(tǒng)模式下的寄存器,所以必須設法保存剛才系統(tǒng)模式下的R0~R12,LR,CPSR和指向下條指令地址的PC,使用的堆棧必須是系統(tǒng)模式下SP指向的任務堆棧,同時還要保證異常模式下的堆棧恢復原樣,不發(fā)生內(nèi)存泄漏。在操作上,為保證壓棧的是中斷剛發(fā)生時系統(tǒng)模式下寄存器的值,程序采用先用異常模式堆棧過渡、再切換模式、分批保存的策略。
(4) OSTickISR()函數(shù)。μC/OSⅡ要求用戶提供一個時鐘源來實現(xiàn)時鐘節(jié)拍的功能,時鐘節(jié)拍推薦為每秒發(fā)生10~100次。時間節(jié)拍函數(shù),由定時器中斷產(chǎn)生,主要完成的功能為保存處理器寄存器,調用OSIntEnter(),調用OSTimeTick(),調用OSIntExit(),恢復處理器寄存器,執(zhí)行中斷返回命令。
3 μC/OSⅡ和μC/GUI的整合
液晶模塊選用LFUBK909,STN型,每個像素通過3位數(shù)據(jù)來表示顏色狀態(tài),液晶屏大小
為320×240像素。S3C44B0X的LCD控制器設置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)//調色板模式
#define LCD_NUM_CONTROLLER (1)//控制器數(shù)量
#define LCD_MAX_LOG_COLORS (256)//最大邏輯顏色數(shù)
(2) GUIConfig.h主要對一些高級選項進行控制和定義。定義對操作系統(tǒng)的有關配置、動態(tài)內(nèi)存空間、默認字體以及是否使用觸摸屏、窗口管理和存儲器管理等選項。
#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//默認字體
(3) LCDdriver.c主要定義μC/GUI與LCD的硬件接口函數(shù)。包括LCD的初始化函數(shù),畫點、線、多邊形、位圖等二維圖形的函數(shù)。主要定義以下函數(shù)。
int LCD_L0_Init(void)//初始化
void LCD_L0_SetPixelIndex(int x,int y,int ColorIndex)//用指定顏色在x,y處畫點
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)//用當前顏色填充矩形區(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)中建立多個任務,每個任務都有自己的優(yōu)先級。多個任務調用μC/GUI用于用戶界面,在任務系統(tǒng)中具有典型的低級別,不會影響系統(tǒng)的實時行為。μC/OSⅡ中為了防止數(shù)據(jù)別破壞,每個任務訪問共享資源時必須獨占該資源,應該事先聲明。訪問結束后,應交出對資源的訪問權。當多個任務調用μC/GUI,液晶屏就是共享資源,當每個任務訪問之前,就必須鎖定該資源;當訪問完成后,對其進行解鎖[5]。μC/OSⅡ下使用μC/GUI就需要提供一些內(nèi)核接口函數(shù),與硬件相關的同時與操作系統(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)//返回當前任務標志符
在某些程序中,如果用到窗口工作機制的回調函數(shù),實現(xiàn)時間函數(shù)就非常必要。
void GUI_X_Delay(int Period)//延時
void GUI_X_ExecIdle(void)//空閑任務
通過函數(shù)void GUI_Exec(void)來完成屏幕的刷新工作。
完成以上工作,操作系統(tǒng)μC/OSⅡ中就可以使用μC/GUI。μC/GUI中除了與硬件相關的代碼,還包括其他代碼。文件目錄結構如圖3所示。為了使開發(fā)過程變得更加簡單,這里將源文件編譯成ucgui.alf文件,即編譯成一個庫,直接添加在μC/OSⅡ下,如圖4所示。

在移植好的μC/OSⅡ和μC/GUI上建立自己的應用程序,編譯生成system.bin文件,通過JTAG在線調試,成功后通過USB口直接下載到Nand Flash。程序就可以在硬件系統(tǒng)上正常運行。
4 結 語
本文介紹BootLoader的編程方法,以及μC/OSⅡ和μC/GUI的整合移植具體方法。在此基礎上可以完成多任務調度。應用表明,μC/OSⅡ在S3C44B0X上運行穩(wěn)定,可以達到實時系統(tǒng)的要求,μC/GUI在多任務環(huán)境下工作穩(wěn)定,具有良好的顯示效果,其必將在嵌入式儀器儀表的設計中得到廣泛的應用。
參 考 文 獻
[1]王田苗.嵌入式系統(tǒng)設計與實例開發(fā)[M].北京:清華大學出版社,2003.
[2]田澤.嵌入式系統(tǒng)開發(fā)與應用教程[M].北京:北京航空航天大學出版社,2005.
[3]韓志耕,王健.實時內(nèi)核μC/OSⅡ在S3C44B0X上移植的研究與實現(xiàn)[J].計算機工程與設計,2006,27(5):828830.
[4]劉濱,劉兵,趙艷華.基于μC/GUI的嵌入式圖形界面的設計[J].液晶與顯示,2005,20(6):558563.
[5]陳進,周治國.嵌入式圖形用戶界面在S3C44B0X上的移植[J].工業(yè)控制技術,2006(3):9799.
[6]趙瑞芳,唐焱,吳倚龍.μC/GUI中觸摸屏操作在S3C2410上的實現(xiàn)\\.現(xiàn)代電子技術,2007,30(10):6365,99.