基于uCOS-II的嵌入式應(yīng)用程序開發(fā)



《基于uCOS-II的嵌入式應(yīng)用程序開發(fā)》由會(huì)員分享,可在線閱讀,更多相關(guān)《基于uCOS-II的嵌入式應(yīng)用程序開發(fā)(44頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、,,,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 tex
2、t styles,,Second level,,Third level,,Fourth level,,Fifth level,,Click to edit Master title style,,,*,第八章,基于,μC/OS-II,的嵌入式應(yīng)用程序開發(fā),,目 錄,8.1,嵌入式應(yīng)用程序開發(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)用程序開發(fā)的特點(diǎn),8.1.1,開發(fā)調(diào)試環(huán)境的建立,,,在嵌入式系統(tǒng)開發(fā)中,典型的調(diào)試環(huán)境一般通常由三部
3、分構(gòu)成:一是通用計(jì)算機(jī)(用來運(yùn)行調(diào)試軟件,稱為調(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)用程序開發(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è)備訪問部分:外圍設(shè)備(如串口)的初始化等,,④程序功能部分:實(shí)現(xiàn)程序所要完成的具體功能,,這樣設(shè)計(jì)程序?qū)υO(shè)計(jì)人員的能力要求是很高的。
4、,,4,8.1,嵌入式應(yīng)用程序開發(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)開發(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í)例來說明基
5、于,μC/OS-II,操作系統(tǒng)設(shè)計(jì)的嵌入式應(yīng)用程序的結(jié)構(gòu)。,,程序清單,8.1,兩個(gè),LED,交替閃爍,,#include “config.h” (1),,#define LED1 (1<<18) //,定義,LED1,,,P1.18,控制,LED1 (2),,#define LED2 (1<<19) //,定義,LED2,,,P1.19,控制,LED2 (3),,#define TASK_STACK_SIZE 128 //,定義用戶任務(wù)的堆棧長(zhǎng)度,(4),,OS_ST
6、K task1Stk[TASK_STACK_SIZE]; //,定義任務(wù),LED1,的堆棧,(5),,OS_STK task2Stk[TASK_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ù),(
7、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ù)開始執(zhí)行,(13),,return(0);
8、 (14),,},,// main,函數(shù)中所調(diào)用的,OSInit,、,OSTaskCreate,和,OSStart,,,是,,//μC/OS-II,操作系統(tǒng)提供的,API,函數(shù)。,,// main,函數(shù)并沒有直接調(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)
9、,,{,,pdata=pdata; //,防止出現(xiàn)編譯警告,(16),,TargetInit(); //,目標(biāo)板初始化,包括初始化中斷系統(tǒng),(17),,PINSEL2 &=,~,0x08; //,選擇管腳,P1.18,~,25,為,GPIO (18),,IO1DIR |= 0x03<<18; //,設(shè)置,LED(P1.18,、,P1.19),為輸出,(19),,IO1SET = 0x03<<18; //LED1,和,LED2,熄滅,(20),,while(1)
10、 //,超級(jí)循環(huán),(21),,{,,IO1CLR=LED1; //,點(diǎn)亮,LED1 (22),,OSTimeDly(OS_TICKS_PER_SEC/4); //,延時(shí),1/4,秒,(23),,IO1SET=LED1; //,熄滅,LED1 (24),,OSTimeDly(OS_TICKS_PER_SEC/4); //,延時(shí),1/4,秒,(25),,},,},8.2 μC/OS-II,應(yīng)用程序結(jié)構(gòu)分析,9,void task2(void *pdat
11、a) //,任務(wù),LED2,函數(shù)定義,(26),,{,,pdata=pdata; (27),,while(1) //,超級(jí)循環(huán),(28),,{,,IO1CLR=LED2; //,點(diǎn)亮,LED2 (29),,OSTimeDly(OS_TICKS_PER_SEC/3); //,延時(shí),1/3,秒,(30),,IO1SET=LED2; //,熄滅,LED2
12、(31),,OSTimeDly(OS_TICKS_PER_SEC/3); //,延時(shí),1/3,秒,(32),,},,},,//task1,和,task2,中的“,pdata=pdata;”,是防止在編譯時(shí)出現(xiàn)警告。,,//task1,和,task2,中調(diào)用的,OSTimeDly,,是,μC/OS-II,提供的,API,函數(shù)。,,// PINSEL2,、,IO1DIR,等都是宏定義,代表寄存器地址,,給該寄,,//,存器賦值可以實(shí)現(xiàn)不同的功能,它們都在(*,.h,)文件中定義。,8.2 μC/OS-II,應(yīng)用程序結(jié)構(gòu)分析,10,上述程序的功能是讓,2,個(gè),LED,燈以不同的速度閃爍,其執(zhí)行
13、流程如下圖:,,8.2 μC/OS-II,應(yīng)用程序結(jié)構(gòu)分析,11,關(guān)于該程序的執(zhí)行過程作以下說明:,,①該程序首先從,main,函數(shù)開始執(zhí)行,初始化,μC/OS-II,,創(chuàng)建任務(wù),task1,和,task2,,最后啟動(dòng),μC/OS-II,中任務(wù)調(diào)度程序的執(zhí)行。,,②任務(wù)調(diào)度程序、任務(wù),task1,和,task2,、空閑任務(wù)(,μC/OS-II,中)等的交替執(zhí)行。當(dāng)任務(wù)調(diào)度程序執(zhí)行后,任務(wù)調(diào)度程序會(huì)選擇當(dāng)前處于就緒態(tài)的最高優(yōu)先級(jí)的任務(wù)來執(zhí)行;當(dāng)正在執(zhí)行的任務(wù)調(diào)用延時(shí)函數(shù)延時(shí)時(shí),就會(huì)掛起該任務(wù),程序又會(huì)執(zhí)行調(diào)度程序來調(diào)度其它任務(wù)的執(zhí)行。,,③main,函數(shù)最后一條語(yǔ)句是,return(0),,但程
14、序一直在任務(wù)調(diào)度程序、任務(wù),task1,和,task2,等之間交替執(zhí)行,永遠(yuǎn)也不會(huì)返回到,main,函數(shù),所以永遠(yuǎn)也不會(huì)執(zhí)行,return(0),。,,由以上分析可知,在使用,μC/OS-II,操作系統(tǒng)的嵌入式應(yīng)用程序中,程序的基本結(jié)構(gòu)除,main,函數(shù)外,還包括一個(gè)個(gè)任務(wù)函數(shù),當(dāng)然也包括非任務(wù)函數(shù)。設(shè)計(jì)程序的任務(wù)主要是劃分和設(shè)計(jì)一個(gè)個(gè)任務(wù)函數(shù)。,8.3 μC/OS-II,程序設(shè)計(jì)技術(shù),8.3.1,任務(wù)的劃分與設(shè)計(jì),,⒈ 任務(wù)的特性,,,任務(wù)的基本特性有:動(dòng)態(tài)性、獨(dú)立性和并發(fā)性,,① 任務(wù)的動(dòng)態(tài)性是指:在程序的運(yùn)行過程中,各個(gè)任務(wù)的狀態(tài)是動(dòng)態(tài)變化的。這些狀態(tài)有就緒態(tài)、運(yùn)行態(tài)和等待態(tài)等。,,②
15、任務(wù)的獨(dú)立性是指:程序中的所有任務(wù)在邏輯上都是平等的。它們的執(zhí)行是由調(diào)度程序調(diào)度來實(shí)現(xiàn)的,這樣,在每個(gè)任務(wù)看來,,CPU,為自己獨(dú)占。任務(wù)之間要傳輸信息時(shí)必須通過第三方來完成,如消息郵箱等。,,③ 任務(wù)的并發(fā)性是指:所有任務(wù)共有一個(gè),CPU,,但在某一時(shí)刻,一個(gè),CPU,只能運(yùn)行一個(gè)任務(wù)。高優(yōu)先級(jí)的任務(wù)可以剝奪另一個(gè)正在運(yùn)行的低優(yōu)先級(jí)任務(wù)的運(yùn)行權(quán)而進(jìn)入運(yùn)行狀態(tài)。高優(yōu)先級(jí)任務(wù)在運(yùn)行一段時(shí)間后必須將自己掛起(如調(diào)用延時(shí)函數(shù)等) 以讓出,CPU,而讓處于就緒態(tài)的低優(yōu)先級(jí)的任務(wù)得到執(zhí)行。這樣所有任務(wù)的運(yùn)行時(shí)間就會(huì)相互重疊,表面上看起來好象同時(shí)運(yùn)行一樣。,12,8.3 μC/OS-II,程序設(shè)計(jì)技術(shù),⒉
16、 任務(wù)的劃分方法,,在進(jìn)行任務(wù)劃分時(shí),可以有不同的方案,但其要達(dá)到的目標(biāo)都是一致的。首先要滿足系統(tǒng)對(duì)“實(shí)時(shí)性”的要求,其次要使任務(wù)數(shù)目合理和簡(jiǎn)化軟件系統(tǒng),最后要降低系統(tǒng)對(duì)資源的需求。任務(wù)的劃分有下列一些基本原則:,,① 設(shè)備依賴性任務(wù)的劃分:以,CPU,為中心,將與各種輸入,/,輸出設(shè)備相關(guān)的功能 分別劃分為獨(dú)立的任務(wù)(如鍵盤任務(wù)、顯示任務(wù)等)。,,② 關(guān)鍵任務(wù)的劃分:“關(guān)鍵性”是指某種功能在應(yīng)用系統(tǒng)中的重要性。若該功能不能正常實(shí)現(xiàn),將會(huì)造成重大影響,如火災(zāi)報(bào)警中傳感器信號(hào)的檢測(cè)。,,③ 緊迫任務(wù)的劃分:“緊迫性”是指某種功能必須在規(guī)定的時(shí)間內(nèi)得到運(yùn)行,并在規(guī)定的時(shí)刻前執(zhí)行完畢。,,此外,
17、還有:數(shù)據(jù)處理任務(wù)的劃分、功能聚合任務(wù)的劃分、觸發(fā)條件相同任務(wù)的劃分、運(yùn)行周期相同任務(wù)的劃分、順序操作任務(wù)的劃分等原則。這些原則只是一般性原則,設(shè)計(jì)任務(wù)時(shí)必須具體問題具體分析。,13,8.3 μC/OS-II,程序設(shè)計(jì)技術(shù),⒊ 任務(wù)函數(shù)的代碼結(jié)構(gòu),,在任務(wù)函數(shù)中,必須至少調(diào)用一次操作系統(tǒng)的服務(wù)函數(shù),否則低優(yōu)先級(jí)的任務(wù)將永遠(yuǎn)無法得到運(yùn)行。按照?qǐng)?zhí)行方式可以將任務(wù)函數(shù)的結(jié)構(gòu)分為三類。,,① 單次執(zhí)行的任務(wù):此類任務(wù)在創(chuàng)建后只執(zhí)行一次,執(zhí)行結(jié)束后即自行刪除。其任務(wù)函數(shù)的代碼結(jié)構(gòu)如下:,,void MyTask(void *pdata) //,單次執(zhí)行的任務(wù)函數(shù),,{,,,進(jìn)行準(zhǔn)備工作的
18、代碼;,,任務(wù)實(shí)體代碼;,,調(diào)用任務(wù)刪除函數(shù);,//,調(diào)用,OSTaskDel(OS_PRIO_SELF),,},,“進(jìn)行準(zhǔn)備工作的代碼”完成各項(xiàng)準(zhǔn)備工作,如定義和初始化變量等;“任務(wù)實(shí)體代碼”完成該任務(wù)的具體功能,通常包含對(duì)系統(tǒng)函數(shù)的調(diào)用,除若干臨界段代碼(中斷被關(guān)閉)外,其它代碼均可以被中斷,用以保證高優(yōu)先級(jí)的就緒任務(wù)能夠及時(shí)得到運(yùn)行;“調(diào)用任務(wù)刪除函數(shù)”將自己刪除。,14,8.3 μC/OS-II,程序設(shè)計(jì)技術(shù),② 周期性執(zhí)行的任務(wù),,此類任務(wù)在創(chuàng)建后按一個(gè)固定的周期來執(zhí)行。其任務(wù)函數(shù)的結(jié)構(gòu)如下:,,void MyTask(void *pdata) //,周期性執(zhí)行的任務(wù)
19、函數(shù),,{,,,進(jìn)行準(zhǔn)備工作的代碼;,,,while (1) //,無限循環(huán),,{,,任務(wù)實(shí)體代碼;,,調(diào)用系統(tǒng)延時(shí)函數(shù);,//,調(diào)用,OSTimeDly(),或,OSTimeDlyHMSM(),,},,},,“調(diào)用系統(tǒng)延時(shí)函數(shù)”使自己掛起,把,CPU,的控制權(quán)交給操作系統(tǒng),由操作系統(tǒng)(中的調(diào)度程序)來調(diào)度其它已經(jīng)就緒的最高優(yōu)先級(jí)的任務(wù)運(yùn)行。當(dāng)延時(shí)時(shí)間到后,該周期性任務(wù)重新進(jìn)入就緒狀態(tài)。,15,8.3 μC/OS-II,程序設(shè)計(jì)技術(shù),③ 事件觸發(fā)執(zhí)行的任務(wù),,此類任務(wù)在創(chuàng)建后,很快可以獲得運(yùn)行權(quán),但實(shí)體代碼的執(zhí)行需要等待某種事件的發(fā)生,在相關(guān)事件發(fā)生之前,
20、該任務(wù)則被,μC/OS-II,掛起。其結(jié)構(gòu)如下:,,void MyTask(void *pdata) //,事件觸發(fā)執(zhí)行的任務(wù)函數(shù),,{,,,進(jìn)行準(zhǔn)備工作的代碼;,,,while (1) //,無限循環(huán),,{,,調(diào)用獲取事件的函數(shù);,//,如等待信號(hào)量等,,任務(wù)實(shí)體代碼;,,,},,},,“調(diào)用獲取事件的函數(shù)”調(diào)用,μC/OS-II,提供的獲取某種事件(如信號(hào)量)的函數(shù),來等待另外一個(gè)任務(wù)(或,ISR,)發(fā)出的信息,此后該任務(wù)處于掛起狀態(tài);當(dāng)另外一個(gè)任務(wù)(或,ISR,)調(diào)用了,μC/OS-II,提供的通信函數(shù)發(fā)出相關(guān)信息時(shí),,μC/
21、OS-II,就使該任務(wù)進(jìn)入就緒狀態(tài),并且通過任務(wù)調(diào)度,使該任務(wù)的實(shí)體代碼得到執(zhí)行。相關(guān)事件發(fā)生一次,任務(wù)實(shí)體代碼就執(zhí)行一次。,16,8.3 μC/OS-II,程序設(shè)計(jì)技術(shù),8.3.2,任務(wù)間的行為同步方法,,在實(shí)時(shí)操作系統(tǒng),μC/OS-II,的支持下,系統(tǒng)的整體功能是通過各個(gè)任務(wù)(包括,ISR,)的協(xié)同運(yùn)行來實(shí)現(xiàn)的。一個(gè)任務(wù)的運(yùn)行,往往需要和其它的任務(wù)配合才能達(dá)到預(yù)期的效果,任務(wù)之間的這種配合和協(xié)調(diào)關(guān)系就稱為任務(wù)間的行為同步。,,μC/OS-II,所提供的控制任務(wù)間行為同步的通信手段有:計(jì)數(shù)信號(hào)量、事件標(biāo)志組、消息郵箱和消息隊(duì)列。,,通常使用的行為同步方法有:,,① 兩個(gè)任務(wù)之間的單向同步:即
22、一個(gè)任務(wù)為控制方,它發(fā)出控制信息;而另一個(gè)任務(wù)為被控制方,它獲得控制方發(fā)出的控制信息后即進(jìn)入就緒狀態(tài)。這可使用信號(hào)量來實(shí)現(xiàn)。,17,8.3 μC/OS-II,程序設(shè)計(jì)技術(shù),② 兩個(gè)任務(wù)之間的雙向同步:即兩個(gè)任務(wù)同為控制方和被控制方。在這種情況下,首先一個(gè)任務(wù)必須為控制方,它發(fā)出控制信息后就變?yōu)楸豢刂品?,此時(shí)其需等待另一個(gè)任務(wù)發(fā)出的控制信息后才能繼續(xù)運(yùn)行;而另一個(gè)任務(wù)首先為被控制方,當(dāng)它獲得控制方發(fā)出的控制信息后才能運(yùn)行,并變?yōu)榭刂品?。這可使用消息郵箱來實(shí)現(xiàn)。,,③ 一個(gè)任務(wù)同步多個(gè)任務(wù):即一個(gè)任務(wù)為控制方,它發(fā)出控制信息,來控制多個(gè)任務(wù)的執(zhí)行。此時(shí)可采用具有消息分發(fā)功能的通信機(jī)制(當(dāng)然也可采用
23、多個(gè)通信工具)來實(shí)現(xiàn)。,,④ 兩個(gè)以上任務(wù)同步一個(gè)任務(wù):即多個(gè)任務(wù)為控制方,它們發(fā)出控制信息來控制一個(gè)任務(wù)的執(zhí)行。此時(shí)可采用“事件標(biāo)志組”來實(shí)現(xiàn)。,,18,8.3 μC/OS-II,程序設(shè)計(jì)技術(shù),8.3.3,共享資源的同步方法,,被兩個(gè)以上并發(fā)程序單元(任務(wù)或,ISR,)訪問的資源稱為共享資源(如全局變量、外設(shè)等)。任務(wù)對(duì)共享資源進(jìn)行訪問的代碼段落稱為關(guān)鍵段落。各個(gè)任務(wù)訪問同一共享資源的關(guān)鍵段落必須互斥,才能保障共享資源信息的可靠性和完整性。這種使得不同任務(wù)訪問共享資源時(shí)能夠確保共享資源信息可靠和完整的措施稱為共享資源同步。,,實(shí)現(xiàn)共享資源同步的方法有:關(guān)中斷、關(guān)調(diào)度、使用互斥信號(hào)量等。,,中
24、斷有可能會(huì)引起任務(wù)切換,使某個(gè)低優(yōu)先級(jí)的任務(wù)掛起,使某個(gè)高優(yōu)先級(jí)的任務(wù)得到執(zhí)行。如果這兩個(gè)任務(wù)對(duì)同一個(gè)共享資源進(jìn)行訪問,這就有可能引起錯(cuò)誤的結(jié)果。此時(shí)可以關(guān)閉中斷。,,當(dāng)共享資源的使用者全部是任務(wù)(即不包含,ISR,)時(shí),就可以采用“關(guān)調(diào)度”的方法來訪問共享資源。關(guān)調(diào)度可使,μC/OS-II,的任務(wù)調(diào)度器停止工作,不能進(jìn)行任務(wù)切換,從而保證關(guān)鍵段落代碼的執(zhí)行不會(huì)受到其它任務(wù)的干擾。,,當(dāng)需要訪問的共享資源比較復(fù)雜,且訪問過程比較費(fèi)時(shí)時(shí),關(guān)中斷和關(guān)調(diào)度措施都會(huì)嚴(yán)重影響到系統(tǒng)的實(shí)時(shí)性。當(dāng)該共享資源的使用者全部是任務(wù)(即不包含,ISR,)時(shí),就可以采用互斥信號(hào)量的方法來訪問這個(gè)共享資源。,8.3 μ
25、C/OS-II,程序設(shè)計(jì)技術(shù),8.3.4,任務(wù)間的數(shù)據(jù)通信方法,,ISR,與任務(wù)函數(shù)在形式上與普通,C,函數(shù)沒有什么區(qū)別。,ISR,的運(yùn)行是由異步事件引起的,任務(wù)函數(shù)的運(yùn)行是由,μC/OS-II,中的調(diào)度器調(diào)度的,它們之間不能直接調(diào)用,其數(shù)據(jù)通信是通過以下幾種方法實(shí)現(xiàn)的。,,① 全局變量:,提供數(shù),據(jù)的任務(wù)或,ISR,向全局變量中寫數(shù)據(jù),使用數(shù)據(jù)的任務(wù)或,ISR,從全局變量中讀數(shù)據(jù),對(duì)全局變量的訪問必須遵循“共享資源同步”的規(guī)則。任務(wù)或,ISR,向全局變量中寫入數(shù)據(jù)后,并不能通知相關(guān)的任務(wù),也就是不能實(shí)現(xiàn)“行為同步”。,,② 內(nèi)存數(shù)據(jù)塊:當(dāng)需要傳輸?shù)臄?shù)據(jù)量很大時(shí),采用內(nèi)存數(shù)據(jù)塊來存放這些數(shù)據(jù)是
26、最方便的。內(nèi)存數(shù)據(jù)塊是共享資源,也不能用來實(shí)現(xiàn)“行為同步”。,,③ 消息郵箱:當(dāng)每次發(fā)送的數(shù)據(jù)都要求接收方及時(shí)接收時(shí),在數(shù)據(jù)通信的同時(shí)必然發(fā)生“行為同步”,此時(shí)可使用消息郵箱,并,要求接收消息的任務(wù)總是在等待消息。,,④ 消息隊(duì)列:消息隊(duì)列是具有“行為同步”功能和緩沖功能的數(shù)據(jù)通信手段,它與消息郵箱的不同之處是可以存放多條消息。,20,8.4 μC/OS-II,在,ARM,微處理器上的移植,,所謂移植,就是使一個(gè)實(shí)時(shí)內(nèi)核能夠在某個(gè)微處理器或微控制器上運(yùn)行。,μC/OS-Ⅱ,在設(shè)計(jì)時(shí)就已經(jīng)充分考慮了可移植性。,,8.4.1 μC/OS-II,對(duì)處理器的要求,,要使,μC/OS-Ⅱ,能正常運(yùn)行,
27、處理器平臺(tái)必須滿足以下要求:,,① 處理器的,C,編譯器能夠產(chǎn)生可重入代碼。,,② 用,C,語(yǔ)言就可以打開和關(guān)閉中斷。,,③ 處理器支持中斷,并且能產(chǎn)生定時(shí)中斷,(,通常在,10,至,100Hz,之間,),。,,④ 處理器支持能夠容納一定量數(shù)據(jù),(,一般是幾千字節(jié),),的硬件堆棧。,,⑤ 處理器有將堆棧指針和其它,CPU,寄存器讀出和存儲(chǔ)到堆棧(或內(nèi)存) 的指令。,,,LPC2000,系列微控制器(,ARM7,)可以滿足第③、④和⑤點(diǎn)的要求,所使用的,ADS1.2,的,C,編譯器可以滿足第①和②點(diǎn)要求。,21,8.4 μC/OS-II,在,ARM,微處理器上的移植,,8.4.2 μC/
28、OS-II,移植所涉及的文件,,移植,μC/OS-Ⅱ,涉及到三個(gè)文件:,,⒈,OS_CPU.H,文件,,OS_CPU.H,文件是操作系統(tǒng)移植頭文件。其中包括了用,#define,定義的與處理器相關(guān)的常量、宏和數(shù)據(jù)類型等。其文件結(jié)構(gòu)如下:,,…… //,數(shù)據(jù)類型,(,與編譯器相關(guān),),,,typedef,unsigned char INT8U; /*,無符號(hào),8,位整數(shù) *,/,,,typedef,unsigned,int,OS_STK; /*,堆棧入口寬度為,16,位 *,/,,……
29、 //,與處理器相關(guān)的代碼,,#define OS_ENTER_CRITICAL() ??? /*,禁止中斷 *,/,,#define OS_STK_GROWTH 1 //,堆棧增長(zhǎng)方向:,1=,向下,, 0=,向上,,……,22,8.4 μC/OS-II,在,ARM,微處理器上的移植,,⒉,OS_CPU_A.ASM,文件,,OS_CPU_A.ASM,是與處理器有關(guān)的匯編語(yǔ)言代碼文件,,,主要進(jìn)行任務(wù)切換。它在,ADS,中的后綴名為“,.S”,,即文件名為,OS_CPU_A.S,。其中要求用戶編寫的四個(gè)匯編語(yǔ)言函數(shù)為:,,①,OSStar
30、tHighRdy(),:,μC/OS-Ⅱ,啟動(dòng)時(shí)運(yùn)行優(yōu)先級(jí)最高的任務(wù),,②,OSCtxSw(),:任務(wù)級(jí)的任務(wù)切換函數(shù),,③,OSIntCtxSw(),:中斷級(jí)的任務(wù)切換函數(shù),,④,OSTickISR(),:時(shí)鐘中斷處理函數(shù),,如果用戶的編譯器支持在,C,語(yǔ)言代碼中插入?yún)R編語(yǔ)言代碼的話,用戶就可以將所有與處理器相關(guān)的代碼放到,OS_CPU_C.C,文件中,而不必再擁有一些分散的匯編文件。,23,8.4 μC/OS-II,在,ARM,微處理器上的移植,,⒊,OS_CPU_C.C,文件,,OS_CPU_C.C,是移植中要修改的,C,語(yǔ)言程序文件。其中要求用戶編寫六個(gè),C,語(yǔ)言函數(shù):,,①,OSTa
31、skStkInit(),:初始化任務(wù)的堆棧結(jié)構(gòu),,②,OSTaskCreateHook(),:創(chuàng)建任務(wù)鉤子函數(shù),允許用戶擴(kuò)展,μC/OS-Ⅱ,功能,,③,OSTaskDelHook(),:刪除任務(wù)鉤子函數(shù),,④,OSTaskSwHook(),:任務(wù)切換鉤子函數(shù),,⑤,OSTaskStatHook(),:統(tǒng)計(jì)任務(wù)鉤子函數(shù),用來擴(kuò)展統(tǒng)計(jì)任務(wù)的功能,,⑥,OSTimeTickHook(),:時(shí)鐘節(jié)拍鉤子函數(shù),,,用戶必須編寫的唯一函數(shù)是,OSTaskStkInit(),,其它五個(gè)鉤子函數(shù)是用來擴(kuò)展相應(yīng)的功能,必須聲明但不一定要包含代碼。,24,8.4 μC/OS-II,在,ARM,微處理器上的移植,
32、,8.4.3 μC/OS-II,的移植過程及內(nèi)容,,移植,μC/OS-Ⅱ,到一個(gè)具體處理器的過程如下:,,第一步:設(shè)置,OS_CPU.H,文件中的數(shù)據(jù)類型等,,① 定義與編譯器無關(guān)的數(shù)據(jù)類型,,,μC/OS-Ⅱ,中沒有使用與編譯器相關(guān)的,C,中的,short,等數(shù)據(jù)類型,而是使用了如,INT16U,代表,16,位的無符號(hào)整數(shù)類型等。所以要對(duì),INT16U,等進(jìn)行重新定義。,,,typedef,unsigned short INT16U; /*,無符號(hào),16,位整數(shù) *,/,,,② 用,#define,設(shè)置一個(gè)常量的值,,根據(jù)微處理器和,C,編譯器支持的堆棧增長(zhǎng)方向來定義,μC/O
33、S-Ⅱ,中的堆棧增長(zhǎng)方向常量,,#define OS_STK_GROWTH 1 /*,堆棧是從上往下增長(zhǎng)的 *,/,,③ 用,#define,聲明三個(gè)宏,,OS_ENTER_CRITICAL(),和,OS_EXIT_CRITICAL(),的功能分別是關(guān)中斷和開中斷。而宏,OS_TASK_SW(),的功能是在任務(wù)級(jí)進(jìn)行任務(wù)調(diào)度。,25,8.4 μC/OS-II,在,ARM,微處理器上的移植,,第二步:編寫四個(gè)匯編語(yǔ)言函數(shù),(OS_CPU_A.ASM),,① OSStartHighRdy(),,在調(diào)用,OSStart(),之前,用戶必須至少已經(jīng)建立了自己的一個(gè)任務(wù)。當(dāng)調(diào)用
34、,OSStart(),時(shí),它會(huì)調(diào)用,OSStartHighRdy(),運(yùn)行優(yōu)先級(jí)最高的任務(wù)。,,②,OSCtxSw(),,該函數(shù)是任務(wù)級(jí)的任務(wù)切換函數(shù),在任務(wù)因?yàn)楸蛔枞鲃?dòng)請(qǐng)求或,CPU,調(diào)度時(shí)執(zhí)行。主要工作是先將當(dāng)前任務(wù)的,CPU,現(xiàn)場(chǎng)保存到該任務(wù)堆棧中,然后獲得就緒的最高優(yōu)先級(jí)任務(wù)的堆棧指針,從該堆棧中恢復(fù)此,CPU,現(xiàn)場(chǎng),使之繼續(xù)執(zhí)行,從而完成一次任務(wù)切換。,,③,OSIntCtxSw(),,該函數(shù)是中斷級(jí)的任務(wù)切換函數(shù),在時(shí)鐘中斷,ISR,中發(fā)現(xiàn)有高優(yōu)先級(jí)任務(wù)在等待時(shí),不必返回被中斷的任務(wù),而是直接調(diào)度就緒的高優(yōu)先級(jí)任務(wù)執(zhí)行。,,④,OSTickISR(),,該函數(shù)是時(shí)鐘中斷處理函數(shù)
35、,主要負(fù)責(zé)處理時(shí)鐘中斷,調(diào)用系統(tǒng)實(shí)現(xiàn)的,OSTimeTick(),函數(shù)。如果有等待時(shí)鐘信號(hào)的高優(yōu)先級(jí)的任務(wù),則需要在中斷級(jí)別上調(diào)用其執(zhí)行。,26,8.4 μC/OS-II,在,ARM,微處理器上的移植,,第三步:用,C,語(yǔ)言編寫六個(gè)簡(jiǎn)單的函數(shù),(OS_CPU_C.C),,在這些函數(shù)中,,OSTaskStkInit(),是最重要的,其功能是初始化任務(wù)的棧結(jié)構(gòu)。,OSTaskStkInit(),的代碼如下:,,OS_STK *OSTaskStkInit(void (*task)(void *pd),void *pdata,OS_STK *ptos, INT16U opt),,{,,OS_STK *
36、stk;,,opt = opt; // 'opt',沒使用,作用是避免編譯器警告,,stk = ptos; //,獲取堆棧指針,,*stk = (OS_STK) task; /* pc */ //,建立任務(wù)環(huán)境,,ADS1.2,使用滿遞減堆棧,,*--stk = (OS_STK) task; /* lr */,,*--stk = 0; /* r12 */,,*--stk = 0; /* r11 */,,*--stk = 0;
37、 /* r10 */,,*--stk = 0; /* r9 */,,*--stk = 0; /* r8 */,,*--stk = 0; /* r7 */,,*--stk = 0; /* r6 */,,*--stk = 0; /* r5 */,27,8.4 μC/OS-II,在,ARM,微處理器上的移植,,*,--stk = 0; /* r4 */,,*--stk = 0;
38、 /* r3 */,,*--stk = 0; /* r2 */,,*--stk = 0; /* r1 */,,*--stk = (unsigned int) pdata; /* r0,,第一個(gè)參數(shù)使用,R0,傳遞 *,/,,*--stk = (USER_USING_MODE|0x00); /* CPSR,,允許,IRQ,FIQ,中斷 *,/,,*--stk = 0; /*,關(guān)中斷計(jì)數(shù)器,O
39、sEnterSum; */,,return (stk);,,},,,除,OSTaskStkInit(),之外,其余函數(shù)必須聲明,但不一定要包含代碼。,,第四步:測(cè)試,,一旦代碼移植結(jié)束,下一步工作就是測(cè)試。測(cè)試首先可以在沒有應(yīng)用程序的情況下測(cè)試,也就是讓內(nèi)核自己測(cè)試自己。這樣做有兩個(gè)好處:第一,避免使問題復(fù)雜化;第二,如果出現(xiàn)問題,可以知道問題出在內(nèi)核代碼上。其次可以運(yùn)行一些簡(jiǎn)單的任務(wù)和時(shí)鐘節(jié)拍中斷服務(wù)例程。最后,一旦多任務(wù)調(diào)度成功地運(yùn)行了,再添加應(yīng)用程序的任務(wù)就是非常簡(jiǎn)單的工作了。,28,8.4 μC/OS-II,在,ARM,微處理器上的移植,,8.4.4 μC/OS-II,的裁剪,,每個(gè)
40、具體的嵌入式應(yīng)用系統(tǒng)對(duì)實(shí)時(shí)操作系統(tǒng)的要求并不完全相同。可以根據(jù)實(shí)際情況,把不需要的系統(tǒng)服務(wù)刪除掉,即對(duì)其進(jìn)行裁減。,,對(duì),μC/OS-II,的裁剪是在配置文件,OS_CFG.H,中進(jìn)行的,其配置項(xiàng)是由一系列,#define constant,語(yǔ)句構(gòu)成。通過設(shè)置不同的配置項(xiàng),可以達(dá)到保留或裁剪不同功能、降低系統(tǒng)對(duì)存儲(chǔ)空間要求的目的。,,下面給出幾個(gè)常用的配置項(xiàng):,,①,OS_MAX_EVENTS,:定義系統(tǒng)中最大的事件控制塊數(shù)量。,,②,OS_MAX_TASKS,:定義用戶程序中最大的任務(wù)數(shù)。其值不能大于,62,。,,③,OS_LOWEST_PRIO,:設(shè)定系統(tǒng)中的任務(wù)最低優(yōu)先級(jí)(,0,最高,,
41、63,最低)。,,④,OS_MAX_QS,:定義系統(tǒng)中最大的消息隊(duì)列數(shù)。,,⑤,OS_CPU_HOOKS_EN,:此常量設(shè)定是否在文件,OS_CPU_C.C,中聲明對(duì)外接口函數(shù)。,29,8.5,應(yīng)用程序設(shè)計(jì)及實(shí)例,要讓,μC/OS-Ⅱ,能夠在,ARM,處理器上運(yùn)行,就要對(duì)其進(jìn)行移植,編寫移植代碼;而要在,μC/OS-Ⅱ,操作系統(tǒng)基礎(chǔ)上設(shè)計(jì)應(yīng)用程序,并且讓其能夠在,ARM,處理器上運(yùn)行,還需要做那些工作呢?,,當(dāng),ARM,芯片加電復(fù)位后,系統(tǒng)就會(huì)進(jìn)入管理模式、,ARM,狀態(tài),其,PC,(,R15,)寄存器的初始值為,0x00000000,,此時(shí)系統(tǒng)從,0x00000000,處開始執(zhí)行程序。程序首
42、先應(yīng)該對(duì)硬件及其運(yùn)行環(huán)境進(jìn)行初始化,然后才能轉(zhuǎn)入相應(yīng)的功能處理程序去運(yùn)行。因此所設(shè)計(jì)程序分為兩部分:硬件及其運(yùn)行環(huán)境初始化部分和應(yīng)用程序部分。,30,8.5,應(yīng)用程序設(shè)計(jì)及實(shí)例,8.5.1,硬件及其運(yùn)行環(huán)境初始化,,ARM,公司只設(shè)計(jì)內(nèi)核,并不生產(chǎn)芯片,它把內(nèi)核授權(quán)給其他廠商,其他廠商購(gòu)買了授權(quán)后加入自己的外設(shè),生產(chǎn)出各具特色的芯片。依據(jù)這種情況,并不容易設(shè)計(jì)出統(tǒng)一的初始化代碼。,,在一般,32,位,ARM,應(yīng)用系統(tǒng)中,軟件大多數(shù)采用,C,語(yǔ)言進(jìn)行編寫,但為了能夠進(jìn)行系統(tǒng)初始化,通常會(huì)用一個(gè)匯編文件作為啟動(dòng)代碼。根據(jù)具體設(shè)計(jì)方法不同,一個(gè)應(yīng)用系統(tǒng)中會(huì)包含多個(gè)文件。下面分別介紹可能的各個(gè)文件。,
43、,⒈ 啟動(dòng)代碼(,STARTUP.S,),,啟動(dòng)代碼文件是用匯編語(yǔ)言編寫的,內(nèi)容包括:中斷異常向量表的定義、各異常處理函數(shù)的定義、,ARM,控制器各工作模式堆棧的定義、芯片加密處理以及相關(guān)常量的定義、標(biāo)識(shí)符的引入與導(dǎo)出等。,31,8.5,應(yīng)用程序設(shè)計(jì)及實(shí)例,下面給出,LPC2131,的部分初始化代碼:,,;,各模式堆棧大小的常量定義,,SVC_STACK_LEGTH EQU 0,,FIQ_STACK_LEGTH EQU 0,,IRQ_STACK_LEGTH EQU 256,,ABT_STACK_LEGTH EQU 0,,U
44、ND_STACK_LEGTH EQU 0,,;,各模式常量定義,,NoFIQ EQU 0x40 ;F,位,,Bit6,,NoInt EQU 0x80 ;I,位,,Bit7,,USR32Mode EQU 0x10 ;,用戶模式:,10000,,SVC32Mode EQU 0x13 ;,管理模式:,10011,,SYS32Mode EQU 0x1f ;,系統(tǒng)模式:,11111,,FIQ32Mode EQ
45、U 0x11 ;FIQ,中斷模式:,10001,,IRQ32Mode EQU 0x12 ;IRQ,中斷模式:,10010,32,8.5,應(yīng)用程序設(shè)計(jì)及實(shí)例,;,引入的外部標(biāo)識(shí)符(在本文件中使用而在其他文件中定義),,IMPORT __use_no_semihosting_swi,,,IMPORT FIQ_Exception ;,快速中斷異常處理程序,,,IMPORT TargetResetInit ;,目標(biāo)板基本初始化,,,IMPORT __main
46、 ;C,語(yǔ)言主程序入口,,;,輸出到外部的標(biāo)識(shí)符(在本文件定義而在其他文件中可以使用),,EXPORT bottom_of_heap,,EXPORT StackUsr,,EXPORT Reset,,EXPORT __user_initial_stackheap,,,CODE32,,AREA vectors,CODE,READONLY,,ENTRY,33,8.5,應(yīng)用程序設(shè)計(jì)及實(shí)例,;,中斷異常向量表定義,,Reset,,LDR PC, ResetAddr ;0x00,:復(fù)位,,,LDR PC, UndefinedAddr ;0x04,:未定義
47、地址,,,LDR PC, SWI_Addr ;0x08,:軟件中斷,,,LDR PC, PrefetchAddr ;0x0C,:預(yù)取指中止,,,LDR PC, DataAbortAddr ;0x10,:數(shù)據(jù)中止,,,DCD 0xb9205f80 ;0x14,:保留,,,LDR PC, [PC, #-0xff0] ;0x18,:,IRQ,中斷,,,LDR PC, FIQ_Addr ;0x1C,:,FIQ,中斷,,;,各異常處理程序地址,,ResetAddr DCD
48、 ResetInit ;,復(fù)位初始化處理程序地址,,UndefinedAddr DCD Undefined ;,未定義指令處理程序地址,,SWI_Addr DCD SoftwareInterrupt ;,軟件中斷處理程序地址,,PrefetchAddr DCD PrefetchAbort ;,預(yù)取指中止處理程序地址,,DataAbortAddr DCD DataAbort ;,數(shù)據(jù)中止處理程序地址,34,8.5,應(yīng)用程序設(shè)計(jì)及實(shí)例,Nouse DCD 0
49、 ;,未使用,,IRQ_Addr DCD 0 ;IRQ,中斷,在“,LDR PC,[PC, #-0xff0]”,中處理,,FIQ_Addr DCD FIQ_Handler ;FIQ,中斷處理程序地址,,;,各異常處理程序、開,/,關(guān)中斷處理程序,(SWI),定義,,Undefined ;,未定義指令,,,B Undefined ;,死循環(huán),,PrefetchAbort ;,取指令中止,,
50、,B PrefetchAbort ;,死循環(huán),,DataAbort ;,取數(shù)據(jù)中止,,,B DataAbort,,FIQ_Handler ;,快速中斷,,,STMFD SP!, {R0-R3, LR} ;,寄存器,R0-R3,,,LR,入棧,,,BL FIQ_Exception ;,調(diào)用,FIQ,異常處理程序(,Target.c,),,,LDMFD SP!, {R0-R3, LR} ;,寄存器,R0
51、-R3,,,LR,出棧,,,SUBS PC, LR, #4 ;,計(jì)算返回地址,35,8.5,應(yīng)用程序設(shè)計(jì)及實(shí)例,SoftwareInterrupt ;,軟中斷,中斷號(hào)為,0,~,3,,CMP R0, #4 ;,判斷傳過來的參數(shù)是否大于,4,,LDRLO PC, [PC,R0,LSL #2] ;,如果小于,4,,參數(shù)正確,進(jìn)行查表,,,MOVS PC, LR ;,否則,參數(shù)出錯(cuò),返回,,SwiFunction,,DCD IRQDisable ;0,號(hào)調(diào)用,禁止
52、,IRQ,中斷,,,DCD IRQEnable ;1,號(hào)調(diào)用,使能,IRQ,中斷,,,DCD FIQDisable ;2,號(hào)調(diào)用,禁止,FIQ,中斷,,,DCD FIQEnable ;3,號(hào)調(diào)用,使能,FIQ,中斷,,IRQDisable ;,禁止,IRQ,中斷,,,MRS R0, SPSR ;,讀取,SPSR,的值,,,ORR R0, R0, #NoInt ;,設(shè)置關(guān),IRQ,中斷(置位,I,位),,,MSR SPSR_c,
53、R0 ;,回寫,SPSR,,MOVS PC, LR ;,返回,36,8.5,應(yīng)用程序設(shè)計(jì)及實(shí)例,IRQEnable ;,使能,IRQ,中斷,,,MRS R0, SPSR ;,讀取,SPSR,的值,,,BIC R0, R0, #NoInt ;,設(shè)置開,IRQ,中斷(清零,I,位),,,MSR SPSR_c, R0 ;,回寫,SPSR,,MOVS PC, LR ;,返回,,FIQDisable
54、 ;,禁止,FIQ,中斷,,,MRS R0, SPSR ;,讀取,SPSR,的值,,,ORR R0, R0, #NoFIQ ;,(置位,F,位),,,MSR SPSR_c, R0 ;,回寫,SPSR,(設(shè)置關(guān),FIQ,中斷),,,MOVS PC, LR ;,返回,,FIQEnable ;,使能,FIQ,中斷,,,MRS R0, SPSR ;,讀取,SPSR,的值,,,BIC R0, R0, #NoFIQ ;,(清零,F
55、,位),,,MSR SPSR_c, R0 ;,回寫,SPSR,(設(shè)置開,FIQ,中斷),,,MOVS PC, LR ;,返回,37,8.5,應(yīng)用程序設(shè)計(jì)及實(shí)例,;,各模式堆棧初始化,,InitStack ;,此時(shí)禁止,IRQ,(,I=1,)和,FIQ,(,F=1,),且為,ARM,狀態(tài)(,T=0,),,,MOV R0, LR,,MSR CPSR_c, #0xd3 ;,設(shè)置管理模式堆棧,,,LDR SP, StackSvc,,MSR CPSR_c, #0xd2 ;,設(shè)置中斷模式
56、堆棧,,,LDR SP, StackIrq,,MSR CPSR_c, #0xd1 ;,設(shè)置快速中斷模式堆棧,,,LDR SP, StackFiq,,MSR CPSR_c, #0xd7 ;,設(shè)置中止模式堆棧,,,LDR SP, StackAbt,,MSR CPSR_c, #0xdb ;,設(shè)置未定義模式堆棧,,,LDR SP, StackUnd,,MSR CPSR_c, #0xdf ;,設(shè)置系統(tǒng)模式堆棧,38,8.5,應(yīng)用程序設(shè)計(jì)及實(shí)例,;,切換到系統(tǒng)模式之后,除非進(jìn)行模式切換,否則將在系統(tǒng)模式
57、下運(yùn)行。,,,LDR SP, =StackUsr,,MOV PC, R0 ;,返回,,;,復(fù)位異常處理程序,,ResetInit,,BL InitStack ;,初始化堆棧,,,BL TargetResetInit ;,目標(biāo)板基本初始化,(target.c),,B __main ;,跳轉(zhuǎn)到,C,語(yǔ)言入口,,;,庫(kù)函數(shù)初始化堆和棧,不能刪除,,__user_initial_stackheap,,LDR R0,=bottom_of_heap,,MOV PC,LR,
58、,StackSvc DCD SvcStackSpace+(SVC_STACK_LEGTH - 1)* 4 ;,管理模式堆棧,,StackIrq DCD IrqStackSpace+(IRQ_STACK_LEGTH - 1)* 4 ;IRQ,模式堆棧,,StackFiq DCD FiqStackSpace+(FIQ_STACK_LEGTH - 1)* 4 ;FIQ,模式堆棧,,StackAbt DCD AbtStackSpace+(ABT_STACK_LEGTH - 1)* 4 ;,中止模式堆棧,,StackUnd DCD UndtStackSpace+(UND_STACK_
59、LEGTH - 1)* 4 ;,未定義模式堆棧,39,8.5,應(yīng)用程序設(shè)計(jì)及實(shí)例,;,芯片加密處理,,,IF :DEF: EN_CRP,,IF . >= 0x1fc,,INFO 1,"\nThe data at 0x000001fc must be 0x87654321.\nPlease delete some source before this line.",,ENDIF,,CrpData,,WHILE . < 0x1fc,,NOP ;,循環(huán)用,NOP,填充,直到,0x1fc,,WEND,,CrpData1,,DCD 0x8765432
60、1 ;,當(dāng)此數(shù)為,0x87654321,時(shí),用戶程序被保護(hù),,,ENDIF,40,8.5,應(yīng)用程序設(shè)計(jì)及實(shí)例,;,各模式堆??臻g分配,,,AREA MyStacks, DATA, NOINIT, ALIGN=2 ;,通過分散加載文件定位,,SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;,管理模式堆??臻g,,IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ;,中斷模式堆??臻g,,FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ;,快
61、速中斷模式堆??臻g,,AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;,中止模式堆??臻g,,UndtStackSpace SPACE UND_STACK_LEGTH * 4 ;,未定義模式堆??臻g,,,AREA Heap, DATA, NOINIT ;Heap,通過分散加載文件定位,,bottom_of_heap SPACE 1,,AREA Stacks, DATA, NOINIT ;Stacks,通過分散加載文件定位,,StackUsr,,END,41,8.5,應(yīng)用程序設(shè)計(jì)及實(shí)例,從前
62、面知道,,ARM,芯片復(fù)位后,系統(tǒng)進(jìn)入管理模式、,ARM,狀態(tài),此時(shí),PC,寄存器的值為,0x00000000,,系統(tǒng)就從,0x00000000,處開始執(zhí)行程序。而,0x00000000,處放置著異常向量表,程序?qū)⒏鶕?jù)異常向量表進(jìn)行跳轉(zhuǎn)。其執(zhí)行過程如下:,,① 芯片根據(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(
63、),處,執(zhí)行用戶程序。,,在芯片啟動(dòng)過程中,在堆棧初始化(,InitStack(),函數(shù))的末尾,處理器切換到系統(tǒng)模式,因而用戶程序是在系統(tǒng)模式下運(yùn)行的。,42,8.5,應(yīng)用程序設(shè)計(jì)及實(shí)例,⒉ 目標(biāo)板初始化(,TARGET.C,),,目標(biāo)板初始化代碼文件是用,C,語(yǔ)言編寫的,其內(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)行必要類型定義、常量與變量聲明以及函數(shù)聲明等,會(huì)有各種各樣的頭文件。如下:,,① 用戶配置文件(,config.h,):包含一些類型定義和系統(tǒng)時(shí)鐘定義。,,
64、②,target.h,文件:包含一些特殊定義和開,/,關(guān),IRQ,中斷、,FIQ,中斷的函數(shù)聲明。根據(jù)所用的目標(biāo)板和編譯器的要求來修改該文件。,,③,LPC2294.h,文件:包含,LPC2000,系列芯片的特殊寄存器定義文件,其中包含特殊寄存器的定義及固件程序函數(shù)的聲明。,43,8.5,應(yīng)用程序設(shè)計(jì)及實(shí)例,44,⒋ 分散加載文件(*,.scf,),,有時(shí)候希望把不同的代碼放在不同的存儲(chǔ)空間上,也就是生成的映像文件需要包含多個(gè)域,每個(gè)域在加載和運(yùn)行時(shí)可以有不同的地址。要生成這樣的映像文件,必須通過某種方式告訴連接器相關(guān)的地址映射關(guān)系。在,ADS,中,可以通過分散加載機(jī)制實(shí)現(xiàn)。,,8.5.2,應(yīng)用程序設(shè)計(jì),,(參考書中相關(guān)實(shí)例),,,,,(完),
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 專題黨課講稿:以高質(zhì)量黨建保障國(guó)有企業(yè)高質(zhì)量發(fā)展
- 廉政黨課講稿材料:堅(jiān)決打好反腐敗斗爭(zhēng)攻堅(jiān)戰(zhàn)持久戰(zhàn)總體戰(zhàn)涵養(yǎng)風(fēng)清氣正的政治生態(tài)
- 在新錄用選調(diào)生公務(wù)員座談會(huì)上和基層單位調(diào)研座談會(huì)上的發(fā)言材料
- 總工會(huì)關(guān)于2025年維護(hù)勞動(dòng)領(lǐng)域政治安全的工作匯報(bào)材料
- 基層黨建工作交流研討會(huì)上的講話發(fā)言材料
- 糧食和物資儲(chǔ)備學(xué)習(xí)教育工作部署會(huì)上的講話發(fā)言材料
- 市工業(yè)園區(qū)、市直機(jī)關(guān)單位、市紀(jì)委監(jiān)委2025年工作計(jì)劃
- 檢察院政治部關(guān)于2025年工作計(jì)劃
- 辦公室主任2025年現(xiàn)實(shí)表現(xiàn)材料
- 2025年~村農(nóng)村保潔員規(guī)范管理工作方案
- 在深入貫徹中央8項(xiàng)規(guī)定精神學(xué)習(xí)教育工作部署會(huì)議上的講話發(fā)言材料4篇
- 開展深入貫徹規(guī)定精神學(xué)習(xí)教育動(dòng)員部署會(huì)上的講話發(fā)言材料3篇
- 在司法黨組中心學(xué)習(xí)組學(xué)習(xí)會(huì)上的發(fā)言材料
- 國(guó)企黨委關(guān)于推動(dòng)基層黨建與生產(chǎn)經(jīng)營(yíng)深度融合工作情況的報(bào)告材料
- 副書記在2025年工作務(wù)虛會(huì)上的發(fā)言材料2篇
相關(guān)資源
更多