詳細的S3C2440的ucOSII和ucGUI移植過程_第1頁
詳細的S3C2440的ucOSII和ucGUI移植過程_第2頁
詳細的S3C2440的ucOSII和ucGUI移植過程_第3頁
詳細的S3C2440的ucOSII和ucGUI移植過程_第4頁
詳細的S3C2440的ucOSII和ucGUI移植過程_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、基于S3C2440的uc/OS-II和uc-GUI移植和應用實驗目的:1. 熟悉ARM體系結構2. 深入學習操作系統(tǒng)原理3. 增強動手實踐能力實驗平臺:ARM9體系結構處理器一S3C2440飛凌嵌入式開發(fā)板 一FL2440 (由于本實驗大部分在宿舍完成,故采用了自己的嵌入式 開發(fā)板作為平臺,硬件與實驗箱基本相似)功能實現(xiàn)主要功能是利用uc/OS-II的多任務調度功能和 uc-GUI提供的圖形函數(shù)接口,編寫一 個Uart傳輸測試程序。通過Uart協(xié)議,傳輸PC機鍵盤輸入的數(shù)據(jù),在開發(fā)板的 LCD上顯示出來。同時實現(xiàn) 了字符串移動和現(xiàn)實系統(tǒng)信息的附加功能。應用程序部分全部由自己編寫注:本實驗中,移

2、植代碼部分參考了網(wǎng)絡上的一些相關文章, 完成。實驗原理:1. 背景介紹(1) ARM9 (S3C2440)ARM9系列處理器是英國 ARM公司設計的主流嵌入式處理器。 S3C2440是三星公司 生產(chǎn)的基于ARM9體系結構的處理器, 能夠運行l(wèi)inux、wince等大型操作系統(tǒng), 構成非 常典型的cpu+os嵌入式系統(tǒng)。1(2) uc/OS-IIuc/OS是一種免費公開源代碼、結構小巧、具有可剝奪實時內核的實時操作系統(tǒng)。uc/OS-II是一個實時操作系統(tǒng)內核,它包含了任務調度,任務管理,時間管理,內存管 理和任務間的通信和同步等基本功能。是一個基于優(yōu)先級調度的搶占式的實時內核,并在這個內核之上提

3、供最基本的系統(tǒng)服務,如信號量,郵箱,消息隊列,內存管理,中斷管理等。(3) uc-GUIuC/GUI是Micrium 公司開發(fā)的通用的嵌入式用戶圖形界面軟件。它給任何使用圖形 LCD的應用程序提供獨立于處理器和LCD控制器之外的有效的圖形用戶接口??梢詰糜趩我蝗蝿窄h(huán)境,也可以應用于多任務環(huán)境中。uC/GUI能夠應用于任何 LCD控制器和CPU的任何尺寸的物理顯示或者模擬顯示中。2. 移植原理(1) uc/OS-II 移植為了方便移植,大部分的uC/OS II代碼是用c語言寫的,但仍需要用c和匯編語言寫一 些與處理器相關的代碼,這是因為uC/OS II在讀寫處理器寄存器時只能通過匯編語言來實現(xiàn)

4、。由于uC/OS II在設計時就已經(jīng)充分考慮了可移植性,所以 uC/OS II的移植相對來說是 比較容易的。移植主要涉及的文件。(具體移植代碼見后文附錄)(a)設置與處理器及編譯器相關的代碼OS_CPU.H這部分代碼主要實現(xiàn)一些數(shù)據(jù)類型的定義。不同的編譯器會使用不同的字節(jié)長度來表示同一數(shù)據(jù)類型,所以要定義一系列數(shù)據(jù)類型以確保移植的正確性。下面是uC/OS II定義的一部分數(shù)據(jù)類型。typedef unsigned char BOOLEAN ; /*布爾型數(shù)據(jù)類型 */typedef unsigned char INT8U ; /* 無符號 8 位*/typedef signed char IN

5、T16S ; /* 帶符號 8 位 */typedef unsigned int INT16U ; /*無符號 16 位*/uC/OS II需要先關中斷再訪問臨界區(qū)的代碼, 并且在訪問完后重新允許中斷。 uC/OS II 定義了 兩個宏來禁止和允許中斷:OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL(),本移植實現(xiàn)這兩個宏的匯編代碼。#define OS_ENTER_CRITICAL() _asmbl ARMDisableInt/ARMDisableInt() #define OS_EXIT_CRITICAL() _asmbl ARMEnableInt/ARMEn

6、ableInt() 其中ARMDisableInt和ARMEnableInt兩個函數(shù)在 2440slib.s里面實現(xiàn)(b) 用C語言實現(xiàn)與處理器任務相關的函數(shù)OS_CPU_C.C這部分代碼最主要的功能是實現(xiàn)一個系統(tǒng)的堆棧初始化函數(shù)OS_STK * OSTaskStkInit ( void (*task)(void *pd),void *pdata,OS_STK *ptos, INT16U opt)其他的一些操作系統(tǒng)的鉤子函數(shù)也在這里定義,如:void OSTaskCreateHook (OS_TCB *ptcb);等等,用來實現(xiàn)操作系統(tǒng)的擴展功能。由于本實驗沒有使用到這些鉤子函數(shù),故在這里只定

7、義成空函數(shù)即可。(c) 處理器相關部分匯編實現(xiàn)這部分代碼是移植的核心內容,主要實現(xiàn)操作系統(tǒng)的任務調度等核心功能。a) OSStartHighRdy()該函數(shù)在OSStart()多任務啟動之后,負責從最高優(yōu)先級任務的TCB控制塊中獲得該任務 的堆棧指針sp,通過sp依次將CPU現(xiàn)場恢復,此時系統(tǒng)就將控制權 交給用戶創(chuàng)建的該任務的進程,直到該任務被阻塞或者被其他更高優(yōu)先級的任務搶 占了 CPU。該函數(shù)僅僅在多任務啟動時被執(zhí)行一次,用來啟動第一個,也就是最 高優(yōu)先級的任務執(zhí)行。b) OSCtxSw()該函數(shù)是任務級的上下文切換函數(shù),在任務因為被阻塞而主動請求與CPU調度時執(zhí)行,主要工作是先將當前任務

8、的CPU現(xiàn)場保存到該任務堆棧中,然后獲得CPU現(xiàn)場,使之繼續(xù)執(zhí)行,最高優(yōu)先級任務的堆棧指針,從該堆棧中恢復此任務的 從而完成一次任務切換。c) OSIntExit()該函數(shù)是中斷級的任務切換函數(shù),在時鐘中斷ISR中發(fā)現(xiàn)有高優(yōu)先級任務在等待時,需要在中斷退出后不返回被中斷的任務,而是直接調度就緒的高優(yōu)先級任務執(zhí)行。其目的在于能夠盡快讓高優(yōu)先級的任務得到響應,保證系統(tǒng)的實時性能。d) OSTickISR()該函數(shù)是時鐘中斷處理函數(shù),主要任務是負責處理時鐘中斷,調用系統(tǒng)實現(xiàn)的 OSTimeTick函數(shù),如果有等待時鐘信號的高優(yōu)先級任務,則需要在中斷級別上調 度其執(zhí)行。另外兩個相關函數(shù)是 OSIntE

9、nter()和OSIntExit(),都需要 在ISR中執(zhí)行。2(2) uc-GUI 移植移植uC/GUI主要集中在修改三個頭文件和兩個C文件。三個頭文件都在Config下,分 別 是 GUICon.h ,GUITouchConf.h,LCDConf.h ; 兩個 C 文件 一個是GUI_X.C(SampleGUI_X.C),.另外一個在 GUILCDDriver 目錄下(LCDWin.c )(a) 修改頭文件LCConf.h主要修改的地方:#define LCD_XSIZE(320)#define LCD_YSIZE(240)#define LCD_BITSPERPIXEL (16)/16B

10、pp#define LCD_CONTROLLER 1375LCD_XSIZE ,LCD_YSIZE 是對應LCD的尺寸大小LCD_BISPERPIXEL 指定每象素的位的數(shù)量LCD_CONTROLLER 是 LCD 控制器(b) 修改頭文件GUI_Conf.h#ifndef GUICONF_H#define GUICONFH#define GUI_OS(1) /*#define GUI_SUPPORT_TOUCH#define GUI_SUPPORT_UNICODE#define GUIDEFAULTFONT*/是否支持OS*/(0) /*是否支持觸摸屏(1)/*是否支持 ASCII/UNIC

11、ODE*/&GUI Font6x8 /*選擇一個默認的字體 */#define GUI_ALLOC_SIZE1024*1024 /*動態(tài)內存的大小 */#define GUI_WINSUPPORT#define GUI_SUPPORT_MEMDEV#define GUI_SUPPORT_AA(1)/*是否支持 WM (視窗管理器)(1)/*是否支持存儲設備*/(0)/*是否支持反鋸齒*/*/#endif在LCD的最基本操作就是在某一個坐標上畫點,其他的操作都是畫點操作延伸出來的。uC/GUI的所有對LCD的操作也是基于這個動作。在FL2440_LCD_for_GUI.c文件中實現(xiàn)開發(fā)板

12、 LCD的基本操作函數(shù),與uc-GUI中定義 的函數(shù)對接。如:void FL2440_LCD_SetPixel(U32 x,U32 y,U16 c)(PutPixel(x,y,c);/* 基本的 LCD 畫點函數(shù) */U16 FL2440_LCD_GetPixel(U32 x,U32 y)(return (GUI_Point(x,y);/* 基本的 LCD 讀點函數(shù) */ void FL2440_LCD_Off(void)(Lcd_EnvidOnOff(0); /*LCD 開關 */void FL2440_LCD_On(void)( Lcd_EnvidOnOff(1); /*LCD 開關 */

13、3實驗過程:前面介紹了基本的移植原理,要想讓開發(fā)板能夠正常工作,還需要一些額外的工作。1. 啟動代碼采用三星公司針對 2440的啟動代碼,基本無需修改。2. 應用程序前面介紹的uc/OS-II只是一個操作系統(tǒng)的最基本內核,要實現(xiàn)具體功能,要求開發(fā)人員自己編寫相關的應用程序。本實驗中,應用程序在主函數(shù)文件finalmain.c中實現(xiàn)。主要功能是利用uc/OS-II的多任務調度功能和uc-GUI提供的圖形函數(shù)接口,編寫一個Uart傳輸測試程序。通過Uart協(xié)議,傳輸PC機鍵盤輸入的數(shù)據(jù),在開發(fā)板的 LCD上顯示出來。同時實現(xiàn) 了字符串移動和現(xiàn)實系統(tǒng)信息的附加功能。主函數(shù)如下:void Main()

14、(系統(tǒng)時鐘,LCD , Uart, GUI以及uc/OS-II的初始化cpu_init();FL_Lcd_Init();Uart_Init(0,115200);Uart_Printf("begin!n");GUI_Init();GUITASK_Init();OSInit();OSTimeSet(0);/創(chuàng)建起始任務OSTaskCreate(TaskStart, 0, &TaskStartSTKTaskStkLeath-1, NormalTaskPrio+13);/創(chuàng)建信號量,用于在文本框輸入滿后清除文本框內容使用Cls=OSSemCreate(1);OSStart(

15、);void TaskStart (void *pdata) / 起始任務(/設置系統(tǒng)時鐘節(jié)拍Init_Timer4();/初始化統(tǒng)計任務OSStatInit();/創(chuàng)建任務/*Task_Text為創(chuàng)建文本框任務,在 LCD上畫出一個文本框,同時實現(xiàn)在文本框輸 入滿的時候清楚文本框內容*/OSTaskCreate(Task_Text,0, &Task_Text_StkTaskStkLeath - 1, NormalTaskPrio);/*Task_SideText任務,在LCD側邊處現(xiàn)實操作系統(tǒng)名稱及版本,并向上移動 */OSTaskCreate(Task_SideText,0,&am

16、p;Task_SideText_StkTaskStkLeath-1,NormalTaskPrio+3);/*Task_Info任務,在文本框下方顯示系統(tǒng)信息,包括CPU使用率,系統(tǒng)任務切換頻率,系統(tǒng)開機時間*/OSTaskCreate(Task_Info, 0, &Task_Info_StkTaskStkLeath - 1, NormalTaskPrio+5);/*Task_Title任務在文本框上方滾動現(xiàn)實提示信息*/OSTaskCreate(Task_Title, 0, &Task_Title_StkTaskStkLeath - 1, NormalTaskPrio+6);/

17、*Task_Uart任務,從Uart串口讀取數(shù)據(jù)顯示在文本框中*/OSTaskCreate(Task_Uart, 0, &Task_Uart_StkTaskStkLeath - 1, NormalTaskPrio+8);/*在文本框中現(xiàn)實位圖,(可選)*/OSTaskCreate(Task_Bmp, 0, &Task_Bmp_StkTaskStkLeath - 1, NormalTaskPrio+7);OSTaskDel(OS_PRIO_SELF);Uart_Printf("Exit TaskStart.n");實驗結果:經(jīng)過多次實驗和調試,最終實現(xiàn)了上述功

18、能,以下是實驗結果截圖: Input Chr*«ot«rvfuput testCh«ngzh« 902384 1 e - 0 6 - 04UG/OS_n u&AXII MrsiontZSlStatic infam»ion>CPU Urn* 心Tack Switch Tirw®l7»Svstwi TirwtMieSiOS«rt Tv*t.P】*» Input CharKt«r«!-II I ioni251PC k »wbQ«rd inputWei Ch&

19、#171;n«zh*n9 sce9023e41 seie-e6-e4Static inforH«Lon>CPU U*W«8X T«*k Sultch Tirtwx?* SwsUn Tirwi84105114Uart TZ,11 II icni2SlU « r t t s tPC k«wboard 1nV 1 Ch>n«zh«nv SC09e23e41 2810-06-048t«tiG InForasiontCPU Um9«iqx Txk Switch Tir»wt7/w S

20、u*t«n Tine>04iesi29ADS工程源文件組織結構+ Qjl c &re+ £jG 心+ |_j N emDev+匚|聊-&I£DDri“r勵 FL2440_I£D_for_GUI. cI 七曲 LCDWin. c十匚|W】d炭t+ 匚| St+ ClCrkvertMcna+ Cl CtColor+ ucosii-configE LCDConf H的 GUICONP.H021 GUTT nuchC cmE h- applicaliens圜 fi Hal exp_pai£i. C2 slamdunkl_tiny.

21、 c2 si am durJ_t i ny. c時 k 呀一Eint c+ Q e3c244O附錄:1.uc/OS-II移植代碼(匯編函數(shù)部分);Call user-defined hook functionOSStartHighRdy BL OSTaskSwHookLDMFD sp!, r4MSRspsr_c, r4LDMFD sp!, r4MSRcpsr_c, r4LDMFD sp!, r0-r12,lr,pc; pop new task s spsr; pop new task s psr; pop new task s r0-r12,lr & pcLDRr4, =OSRunni

22、ng; Indicate that multitasking has startedMOVr5, #1STRBr5, r4; OSRunning = trueLDRr4, =OSTCBHighRdy; Get highest priority task TCB addressLDRr4, r4; get stack pointerLDRsp, r4; switch to the new stackOSCtxSwSTMFDsp!, lrSTMFDsp!, r0-r12,lr; push lr & register fileMRSr4, cpsr; copy CPSR to R4STMFD

23、sp!, r4; push current psrMRSr4, spsr; copy SPSR to R4STMFDsp!, r4; push current spsr;OSPrioCur = OSPrioHighRdyOSCtxSwLDRr4, =OSPrioCurLDRr5, =OSPrioHighRdyLDRBr6, r5LDRr4, =OSTCBCurLDRr5, r4STRsp, r5STRBr6, r4 ;Get current task TCB address;store sp in preempted tasks's TCBBL OSTaskSwHook;call Ta

24、sk Switch HookLDRr6, =OSTCBHighRdyLDRr6, r6;Get highest priority task TCB addressLDR sp, r6;get new task s stack pointerSTR r6, r4;set new current task TCB addressLDMFD sp!, r4MSRspsr_c, r4LDMFD sp!, r4MSRcpsr_c, r4LDMFD sp!, r0-r12,lr,pc; pop new task spsr; pop new task cpsr; pop new task r0-r12,lr

25、 & pcOSIntCtxSwLDR r0, =OSIntCtxSwFlag; OSIntCtxSwFlag = trueMOVSTRMOVr1, #1r1, r0pc, lr;This is only change flag,return to OSIntExit/OSTickISRSUB lr, lr, #4STMFDsp!, r0-r12, lr;push r0-r12 register file and lr( pc return address )MRSr4, spsrSTMFDsp!, r4;push current spsr_irq ( =cpsr_svc )movr0,

26、#0x4000movr1,#0x4a000000strr0,r1,#0movr0,#0x4000movr1,#0x4a000000strr0,r1,#0x10BL OSIntEnterBL OSTimeTickBL TmrSignalTmr;check if OSIntCtxFlag is marked as true;if OSIntCtxFlag = true, then jump to _IntCtxSw;get cpsr_svc from stack;prepare spsr to return svc mode;recover r0-r12 and pc from stack, cp

27、sr alsoBL OSIntExitLDRr0, =OSIntCtxSwFlagLDRr1, r0CMPr1, #1BEQ_IntCtxSwLDMFD sp!, r4MSRspsr_c, r4LDMFD sp!, r0-r12, pcA_IntCtxSwMOVSTRLDMFDMSRLDMFDr1, #0; clear OSIntCtxSwFlag = flaser1, r0sp!, r4; restore spsr_irqspsr_c, r4sp!, r0-r12, lr; recover the irq stack pointerLDR r5, =SA VED_LR_IRQLDR r6,

28、=SA VED_LR_SVCSTR Ir, r5; save lr_irq to SA VED_LR_IRQMOVMSRSTRLDRSTMFDLDRSTMFDMRSSTMFDMRSSTMFDlr, #0x00000093; change forcely cpsr to svc modecpsr_c, lrlr, r6; save lr_svc to SAVED_LR_SVClr, r5; get lr_irq value saved in SA VED_LR_IRQsp!, lrlr, r6sp!, r0-r12,lr; push lr & r0-r12 register filer4

29、, spsrsp!, r4; push current psrr4, spsrsp!, r4; push spsrB _OSCtxSw; jump to _OSCtxSwARMDisableIntMRSSTMFDORRMSRMOVr0, cpsrsp!, r0; push current PSRr0, r0, #0x80cpsr_c, r0; disable IRQ Int spc, lrARMEnableIntLDMFDMSRsp!, r0; pop current PSRcpsr_c, r0; restore original cpsrMOVpc, lr2. uc/OS-II移植代碼(C語言函數(shù)部分)OS_STK * OSTaskStkInit (vo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論