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

下載本文檔

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

文檔簡介

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

2、序部分全部由自己編寫完成。實驗原理:1 背景介紹(1)ARM9(S3C2440)ARM9系列處理器是英國ARM公司設計的主流嵌入式處理器。S3C2440是三星公司生產的基于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)先級調度的搶占式的實時內核,并在這個內核之上提供最基本的系統(tǒng)服務,如信號量,郵箱,消息隊

3、列,內存管理,中斷管理等。(3)uc-GUI uC/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在讀寫處理器寄存器時只能通過匯編語言來實現。由于uC/OS II在設計時就已經充分考慮了可移植性,所

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

5、INT16U;/*無符號16位*/uC/OS II需要先關中斷再訪問臨界區(qū)的代碼,并且在訪問完后重新允許中斷。uC/OS II定義了兩個宏來禁止和允許中斷:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL(),本移植實現這兩個宏的匯編代碼。 #defineOS_ENTER_CRITICAL()_asmbl ARMDisableInt/ARMDisableInt()#defineOS_EXIT_CRITICAL()_asmbl ARMEnableInt/ARMEnableInt()其中ARMDisableInt和ARMEnableInt兩個函數在2440slib.s里面實

6、現(b) 用C語言實現與處理器任務相關的函數OS_CPU_C.C這部分代碼最主要的功能是實現一個系統(tǒng)的堆棧初始化函數OS_STK * OSTaskStkInit (void (*task)(void *pd), void *pdata,OS_STK *ptos,INT16U opt)其他的一些操作系統(tǒng)的鉤子函數也在這里定義,如:void OSTaskCreateHook (OS_TCB *ptcb);等等,用來實現操作系統(tǒng)的擴展功能。由于本實驗沒有使用到這些鉤子函數,故在這里只定義成空函數即可。(c) 處理器相關部分匯編實現這部分代碼是移植的核心內容,主要實現操作系統(tǒng)的任務調度等核心功能。a)

7、OSStartHighRdy() 該函數在OSStart()多任務啟動之后,負責從最高優(yōu)先級任務的TCB控制塊中獲得該任務 的堆棧指針sp,通過sp依次將CPU現場恢復,此時系統(tǒng)就將控制權交給用戶創(chuàng)建的該任務的進程,直到該任務被阻塞或者被其他更高優(yōu)先級的任務搶占了 CPU。該函數僅僅在多任務啟動時被執(zhí)行一次,用來啟動第一個,也就是最高優(yōu)先級的任務執(zhí)行。 b)OSCtxSw() 該函數是任務級的上下文切換函數,在任務因為被阻塞而主動請求與CPU調度時執(zhí)行,主要工作是 先將當前任務的CPU現場保存到該任務堆棧中,然后獲得最高優(yōu)先級任務的堆棧指針,從該堆棧中恢復此任務的CPU現場,使之繼續(xù)執(zhí)行,從而

8、完成一次任務切 換。 c)OSIntExit() 該函數是中斷級的任務切換函數,在時鐘中斷ISR中發(fā)現有高優(yōu)先級任務在等待時,需要在中斷退 出后不返回被中斷的任務,而是直接調度就緒的高優(yōu)先級任務執(zhí)行。其目的在于能夠盡快讓高優(yōu)先級的任務得到響應,保證系統(tǒng)的實時性能。 d)OSTickISR() 該函數是時鐘中斷處理函數,主要任務是負責處理時鐘中斷,調用系統(tǒng)實現的OSTimeTick 函數,如果有等待時鐘信號的高優(yōu)先級任務,則需要在中斷級別上調度其執(zhí)行。另外兩個相關函數是OSIntEnter()和OSIntExit(),都需要 在ISR中執(zhí)行。2(2) uc-GUI移植移植uC/GUI主要集中在修

9、改三個頭文件和兩個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 LC

10、D_BITSPERPIXEL (16)   /16Bpp #define LCD_CONTROLLER 1375 LCD_XSIZE  ,LCD_YSIZE 是對應LCD的尺寸大小LCD_BISPERPIXEL  指定每象素的位的數量LCD_CONTROLLER是LCD控制器(b)修改頭文件GUI_Conf.h #ifndef GUICONF_H#define GUICONF_H #define GUI_OS         

11、           (1)/* 是否支持OS*/#define GUI_SUPPORT_TOUCH         (0) /*是否支持觸摸屏*/#define GUI_SUPPORT_UNICODE       (1) /*是否支持ASCII/UNICODE*/ #define GUI_DEFAULT_FONT&#

12、160;         &GUI_Font6x8 /*選擇一個默認的字體*/#define GUI_ALLOC_SIZE          1024*1024 /*動態(tài)內存的大小*/ #define GUI_WINSUPPORT            (1) /*是否支持 WM(

13、視窗管理器)*/#define GUI_SUPPORT_MEMDEV        (1) /*是否支持存儲設備*/#define GUI_SUPPORT_AA            (0) /*是否支持反鋸齒*/ #endif 在LCD的最基本操作就是在某一個坐標上畫點,其他的操作都是畫點操作延伸出來的。uC/GUI的所有對LCD的操作也是基于這個動作。在FL2440_LCD

14、_for_GUI.c文件中實現開發(fā)板LCD的基本操作函數,與uc-GUI中定義的函數對接。如:void FL2440_LCD_SetPixel(U32 x,U32 y,U16 c)PutPixel(x,y,c);/*基本的LCD畫點函數*/U16 FL2440_LCD_GetPixel(U32 x,U32 y)return (GUI_Point(x,y);/*基本的LCD讀點函數*/void FL2440_LCD_Off(void)Lcd_EnvidOnOff(0); /*LCD開關*/void FL2440_LCD_On(void)Lcd_EnvidOnOff(1); /*LCD開關*/3實

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

16、CD,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();voi

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

18、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任務在文本框上方滾動現實提示信息*/ OSTaskCreate(Task_Title, 0, &Task_Title_StkTaskStkLeath - 1, NormalTaskPrio+

19、6); /*Task_Uart任務,從Uart串口讀取數據顯示在文本框中*/OSTaskCreate(Task_Uart, 0, &Task_Uart_StkTaskStkLeath - 1, NormalTaskPrio+8);/*在文本框中現實位圖,(可選)*/ /OSTaskCreate(Task_Bmp, 0, &Task_Bmp_StkTaskStkLeath - 1, NormalTaskPrio+7); OSTaskDel(OS_PRIO_SELF); Uart_Printf("Exit TaskStart.n");實驗結果:經過多次實驗和調試

20、,最終實現了上述功能,以下是實驗結果截圖:ADS工程源文件組織結構附錄:1 uc/OS-II移植代碼(匯編函數部分):OSStartHighRdy BL OSTaskSwHook ; Call user-defined hook function LDR r4, =OSRunning ; Indicate that multitasking has started MOV r5, #1 STRB r5, r4 ; OSRunning = true LDR r4, =OSTCBHighRdy ; Get highest priority task TCB address LDR r4, r4 ;

21、 get stack pointer LDR sp, r4 ; switch to the new stack LDMFD sp!, r4 ; pop new task s spsr MSR spsr_c, r4 LDMFD sp!, r4 ; pop new task s psr MSR cpsr_c, r4 LDMFD sp!, r0-r12,lr,pc ; pop new task s r0-r12,lr & pc OSCtxSw STMFD sp!, lr STMFD sp!, r0-r12,lr ; push lr & register file MRS r4, cp

22、sr ; copy CPSR to R4 STMFD sp!, r4 ; push current psr MRS r4, spsr ; copy SPSR to R4 STMFD sp!, r4 ; push current spsr_OSCtxSw LDR r4, =OSPrioCur ; OSPrioCur = OSPrioHighRdy LDR r5, =OSPrioHighRdy LDRB r6, r5 STRB r6, r4 LDR r4, =OSTCBCur ; Get current task TCB address LDR r5, r4 STR sp, r5 ; store

23、sp in preempted tasks's TCB BL OSTaskSwHook ; call Task Switch Hook LDR r6, =OSTCBHighRdy ; Get highest priority task TCB address LDR r6, r6 LDR sp, r6 ; get new task s stack pointer STR r6, r4 ; set new current task TCB address LDMFD sp!, r4 ; pop new task spsr MSR spsr_c, r4 LDMFD sp!, r4 ; po

24、p new task cpsr MSR cpsr_c, r4 LDMFD sp!, r0-r12,lr,pc ; pop new task r0-r12,lr & pcOSIntCtxSw LDR r0, =OSIntCtxSwFlag ; OSIntCtxSwFlag = true MOV r1, #1 STR r1, r0 MOV pc, lr ;This is only change flag,return to OSIntExit/OSTickISRSUBlr, lr, #4 STMFDsp!, r0-r12, lr ; push r0-r12 register file an

25、d lr( pc return address ) MRS r4, spsr STMFD sp!, r4 ; push current spsr_irq ( =cpsr_svc )mov r0,#0x4000mov r1,#0x4a000000str r0,r1,#0mov r0,#0x4000mov r1,#0x4a000000str r0,r1,#0x10BLOSIntEnterBL OSTimeTickBL TmrSignalTmrBLOSIntExitLDRr0, =OSIntCtxSwFlag ; check if OSIntCtxFlag is marked as trueLDR

26、r1, r0CMPr1, #1BEQ_IntCtxSw ; if OSIntCtxFlag = true, then jump to _IntCtxSwLDMFD sp!, r4 ; get cpsr_svc from stackMSR spsr_c, r4 ; prepare spsr to return svc modeLDMFDsp!, r0-r12, pc ; recover r0-r12 and pc from stack, cpsr also _IntCtxSw MOV r1, #0 ; clear OSIntCtxSwFlag = flase STR r1, r0 LDMFD s

27、p!, r4 ; restore spsr_irq MSR spsr_c, r4 LDMFDsp!, r0-r12, lr ; recover the irq stack pointer LDR r5, =SAVED_LR_IRQ LDR r6, =SAVED_LR_SVCSTRlr, r5 ; save lr_irq to SAVED_LR_IRQ MOVlr, #0x00000093 ; change forcely cpsr to svc modeMSRcpsr_c, lrSTR lr, r6 ; save lr_svc to SAVED_LR_SVCLDRlr, r5 ; get lr

28、_irq value saved in SAVED_LR_IRQ STMFD sp!, lr LDRlr, r6 STMFD sp!, r0-r12,lr ; push lr & r0-r12 register file MRS r4, spsr STMFD sp!, r4 ; push current psr MRS r4, spsr STMFD sp!, r4 ; push spsr B_OSCtxSw ; jump to _OSCtxSwARMDisableIntMRSr0, cpsrSTMFDsp!, r0 ; push current PSRORRr0, r0, #0x80MSRcpsr_c, r0 ; disable IRQ Int sMOVpc, lrARMEnableIntLDMFDsp!, r0 ; pop current PSRMSRcpsr_c, r0 ; restore original cpsrMOVpc, lr2 uc/OS-II移植代碼(C語言函數部分):OS_STK * OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)

溫馨提示

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

評論

0/150

提交評論