基于uCOS-II的嵌入式應(yīng)用程序開(kāi)發(fā)
,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,Click to edit Master title style,XUPT,嵌入式系統(tǒng),原理與應(yīng)用,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,Click to edit Master title style,*,第八章,基于,C/OS-II,的嵌入式應(yīng)用程序開(kāi)發(fā),目 錄,8.1,嵌入式應(yīng)用程序開(kāi)發(fā)的特點(diǎn),8.2 C/OS-II,應(yīng)用程序結(jié)構(gòu)分析,8.3 C/OS-II,程序設(shè)計(jì)技術(shù),8.4 C/OS-II,在,ARM,微處理器上的移植,8.5,應(yīng)用程序設(shè)計(jì)及實(shí)例,2,8.1,嵌入式應(yīng)用程序開(kāi)發(fā)的特點(diǎn),8.1.1,開(kāi)發(fā)調(diào)試環(huán)境的建立,在嵌入式系統(tǒng)開(kāi)發(fā)中,典型的調(diào)試環(huán)境一般通常由三部分構(gòu)成:一是通用計(jì)算機(jī)(用來(lái)運(yùn)行調(diào)試軟件,稱(chēng)為調(diào)試主機(jī));二是協(xié)議轉(zhuǎn)換器(連接調(diào)試主機(jī)發(fā)出的高級(jí)命令與微處理器,JTAG,接口的低級(jí)命令之間的接口);三是調(diào)試目標(biāo)。硬件調(diào)試環(huán)境如下圖:,3,8.1,嵌入式應(yīng)用程序開(kāi)發(fā)的特點(diǎn),8.1.2,基于嵌入式處理器的直接編程技術(shù),如果針對(duì)硬件電路直接設(shè)計(jì)應(yīng)用程序,那么應(yīng)用程序的代碼必須包括以下幾個(gè)部分:,啟動(dòng)部分:硬件加電后首先運(yùn)行(硬件檢測(cè)和資源分配),處理器管理部分:實(shí)現(xiàn)處理器狀態(tài)轉(zhuǎn)換和寄存器使用等,外圍設(shè)備訪問(wèn)部分:外圍設(shè)備(如串口)的初始化等,程序功能部分:實(shí)現(xiàn)程序所要完成的具體功能,這樣設(shè)計(jì)程序?qū)υO(shè)計(jì)人員的能力要求是很高的。,4,8.1,嵌入式應(yīng)用程序開(kāi)發(fā)的特點(diǎn),8.1.3,基于嵌入式操作系統(tǒng)的編程技術(shù),隨著嵌入式微處理器和程序設(shè)計(jì)技術(shù)的發(fā)展,人們把一個(gè)大的程序從功能上可劃分為三個(gè)部分:,板級(jí)支持包(,BSP,):其目的是屏蔽下層硬件,主要由,Boot Loader,和,Drivers,兩部分構(gòu)成。,嵌入式實(shí)時(shí)操作系統(tǒng)(,RTOS,)。,應(yīng)用程序:基于相應(yīng)操作系統(tǒng)、在相應(yīng)開(kāi)發(fā)環(huán)境下設(shè)計(jì)的并最終運(yùn)行在相應(yīng)目標(biāo)機(jī)上的程序。,這里,可由掌握不同技術(shù)的人去設(shè)計(jì)不同的部分,并在三部分之間設(shè)計(jì)相應(yīng)的接口以供三部分之間相互調(diào)用。,5,8.2 C/OS-II,應(yīng)用程序結(jié)構(gòu)分析,下面以一個(gè)簡(jiǎn)單實(shí)例來(lái)說(shuō)明基于,C/OS-II,操作系統(tǒng)設(shè)計(jì)的嵌入式應(yīng)用程序的結(jié)構(gòu)。,程序清單,8.1,兩個(gè),LED,交替閃爍,#include“config.h”(1),#define LED1 (118)/,定義,LED1,,,P1.18,控制,LED1(2),#define LED2 (119)/,定義,LED2,,,P1.19,控制,LED2(3),#define TASK_STACK_SIZE 128 /,定義用戶任務(wù)的堆棧長(zhǎng)度,(4),OS_STK task1StkTASK_STACK_SIZE;/,定義任務(wù),LED1,的堆棧,(5),OS_STK task2StkTASK_STACK_SIZE;/,定義任務(wù),LED2,的堆棧,(6),void task1(void*pdata);/LED1,任務(wù)函數(shù)聲明,(7),void task2(void*pdata);/LED2,任務(wù)函數(shù)聲明,(8),6,8.2 C/OS-II,應(yīng)用程序結(jié)構(gòu)分析,7,int main(void)/,主函數(shù),(9),OSInit();/,初始化,C/OS-II(10),OSTaskCreate(task1,(void*)0,/,創(chuàng)建,LED1,任務(wù),/,優(yōu)先級(jí)為,4 (11),OSTaskCreate(task2,(void*)0,/,創(chuàng)建,LED2,任務(wù),/,優(yōu)先級(jí)為,5 (12),OSStart();/,啟動(dòng),C/OS-II,任務(wù)開(kāi)始執(zhí)行,(13),return(0);(14),/main,函數(shù)中所調(diào)用的,OSInit,、,OSTaskCreate,和,OSStart,,,是,/C/OS-II,操作系統(tǒng)提供的,API,函數(shù)。,/main,函數(shù)并沒(méi)有直接調(diào)用,task1,和,task2,,只是在,main,中調(diào)用,/OSTaskCreate,創(chuàng)建兩個(gè)任務(wù)時(shí)分別把,task1,和,task2,作為參數(shù)。,8.2 C/OS-II,應(yīng)用程序結(jié)構(gòu)分析,8,void task1(void*pdata)/,任務(wù),LED1,函數(shù)定義,(15),pdata=pdata;/,防止出現(xiàn)編譯警告,(16),TargetInit();/,目標(biāo)板初始化,包括初始化中斷系統(tǒng),(17),PINSEL2&=,0 x08;/,選擇管腳,P1.18,25,為,GPIO(18),IO1DIR|=0 x0318;/,設(shè)置,LED(P1.18,、,P1.19),為輸出,(19),IO1SET=0 x03=0 x1fc,INFO 1,nThe data at 0 x000001fc must be 0 x87654321.nPlease delete some source before this line.,ENDIF,CrpData,WHILE.0 x1fc,NOP ;,循環(huán)用,NOP,填充,直到,0 x1fc,WEND,CrpData1,DCD 0 x87654321 ;,當(dāng)此數(shù)為,0 x87654321,時(shí),用戶程序被保護(hù),ENDIF,40,8.5,應(yīng)用程序設(shè)計(jì)及實(shí)例,;,各模式堆??臻g分配,AREA MyStacks,DATA,NOINIT,ALIGN=2;,通過(guò)分散加載文件定位,SvcStackSpace SPACE SVC_STACK_LEGTH*4 ;,管理模式堆??臻g,IrqStackSpace SPACE IRQ_STACK_LEGTH*4 ;,中斷模式堆??臻g,FiqStackSpace SPACE FIQ_STACK_LEGTH*4 ;,快速中斷模式堆棧空間,AbtStackSpace SPACE ABT_STACK_LEGTH*4 ;,中止模式堆??臻g,UndtStackSpace SPACE UND_STACK_LEGTH*4 ;,未定義模式堆棧空間,AREA Heap,DATA,NOINIT ;Heap,通過(guò)分散加載文件定位,bottom_of_heap SPACE 1,AREA Stacks,DATA,NOINIT ;Stacks,通過(guò)分散加載文件定位,StackUsr,END,41,8.5,應(yīng)用程序設(shè)計(jì)及實(shí)例,從前面知道,,ARM,芯片復(fù)位后,系統(tǒng)進(jìn)入管理模式、,ARM,狀態(tài),此時(shí),PC,寄存器的值為,0 x00000000,系統(tǒng)就從,0 x00000000,處開(kāi)始執(zhí)行程序。而,0 x00000000,處放置著異常向量表,程序?qū)⒏鶕?jù)異常向量表進(jìn)行跳轉(zhuǎn)。其執(zhí)行過(guò)程如下:,芯片根據(jù)異常處理程序地址表,得到復(fù)位處理程序(,ResetInit,)的地址,并跳轉(zhuǎn)到復(fù)位處理程序(,ResetInit,)處去執(zhí)行。,調(diào)用,InitStack(),函數(shù),初始化,ARM,處理器各工作模式的堆棧。,調(diào)用目標(biāo)板初始化函數(shù)(在,TARGET.C,中定義),初始化目標(biāo)板。,跳轉(zhuǎn)到用戶,C,程序入口,main(),處,執(zhí)行用戶程序。,在芯片啟動(dòng)過(guò)程中,在堆棧初始化(,InitStack(),函數(shù))的末尾,處理器切換到系統(tǒng)模式,因而用戶程序是在系統(tǒng)模式下運(yùn)行的。,42,8.5,應(yīng)用程序設(shè)計(jì)及實(shí)例,目標(biāo)板初始化(,TARGET.C,),目標(biāo)板初始化代碼文件是用,C,語(yǔ)言編寫(xiě)的,其內(nèi)容主要包括:?jiǎn)?dòng)代碼調(diào)用的初始化函數(shù)、用戶調(diào)用的初始化函數(shù)、一些異常處理函數(shù)以及一些系統(tǒng)庫(kù)函數(shù)的實(shí)現(xiàn)等。,有關(guān)的頭文件(*,.H,),要設(shè)計(jì)一個(gè)系統(tǒng),為了進(jìn)行必要類(lèi)型定義、常量與變量聲明以及函數(shù)聲明等,會(huì)有各種各樣的頭文件。如下:,用戶配置文件(,config.h,):包含一些類(lèi)型定義和系統(tǒng)時(shí)鐘定義。,target.h,文件:包含一些特殊定義和開(kāi),/,關(guān),IRQ,中斷、,FIQ,中斷的函數(shù)聲明。根據(jù)所用的目標(biāo)板和編譯器的要求來(lái)修改該文件。,LPC2294.h,文件:包含,LPC2000,系列芯片的特殊寄存器定義文件,其中包含特殊寄存器的定義及固件程序函數(shù)的聲明。,43,8.5,應(yīng)用程序設(shè)計(jì)及實(shí)例,44,分散加載文件(*,.scf,),有時(shí)候希望把不同的代碼放在不同的存儲(chǔ)空間上,也就是生成的映像文件需要包含多個(gè)域,每個(gè)域在加載和運(yùn)行時(shí)可以有不同的地址。要生成這樣的映像文件,必須通過(guò)某種方式告訴連接器相關(guān)的地址映射關(guān)系。在,ADS,中,可以通過(guò)分散加載機(jī)制實(shí)現(xiàn)。,8.5.2,應(yīng)用程序設(shè)計(jì),(參考書(shū)中相關(guān)實(shí)例),(完),