四、嵌入式實(shí)時(shí)操作系統(tǒng)分析_第1頁(yè)
四、嵌入式實(shí)時(shí)操作系統(tǒng)分析_第2頁(yè)
四、嵌入式實(shí)時(shí)操作系統(tǒng)分析_第3頁(yè)
四、嵌入式實(shí)時(shí)操作系統(tǒng)分析_第4頁(yè)
四、嵌入式實(shí)時(shí)操作系統(tǒng)分析_第5頁(yè)
已閱讀5頁(yè),還剩111頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

我入灰系統(tǒng)設(shè)計(jì)與實(shí)例開(kāi)發(fā)

——ARM與piC/OS-U

第四講實(shí)時(shí)操作余統(tǒng)|ic/c)s-n分析

北京航空航天大學(xué)

戰(zhàn)入式機(jī)電控制研究室

魏洪興

1

本節(jié)提要

①NC/OS-H簡(jiǎn)介

②|LiC/OS-II內(nèi)核結(jié)構(gòu)

③K/os-n任務(wù)管理

④^iC/OS-II時(shí)間管理

(5)inc/os-n任務(wù)通信與同步

?|LiC/os?n移植

2

RTOS是32位的嵌入式CPU的軟件基石

?RTOS內(nèi)核提供CPU的管理

?硬件初時(shí)化,MMU,定時(shí)器,中斷

?RTOS內(nèi)核提供任務(wù),內(nèi)存管理

?RTOS提供設(shè)備管理,文件和網(wǎng)絡(luò)的支持

?RTOS提供C/C++,JAVA,圖形模塊等編程接口

3

1>|LiC/OS------MicroControlIer0S,微控制器操作系統(tǒng)

2、展/OS簡(jiǎn)介

?美國(guó)人JeanLabrosse1992年完成

?應(yīng)用面覆蓋了諸多領(lǐng)域,如照相機(jī)、醫(yī)療器械、音響設(shè)備、發(fā)動(dòng)

機(jī)控制、高速公路電話系統(tǒng)、自動(dòng)提款機(jī)等

?1998年“/OS-II,目前的版本jiC/OS-IIV2.61

?2000年,得到美國(guó)航空管理局(FAA)的認(rèn)證,可以用于飛行器

?網(wǎng)立占www.ucos—11,com(www.micrium.com)

4

piC/OS的性能特點(diǎn)(一)

?公開(kāi)源代碼

?可移植性(Portable)

絕大部分RC/OS-II的源碼是用移植性很強(qiáng)的ANSIC寫的。和微處理器

硬件相關(guān)的那部分是用匯編語(yǔ)言寫的。匯編語(yǔ)言寫的部分已經(jīng)壓到最

低限度,使得NC/OS-II便于移植到其他微處理器上。RC/OS-II可以在

絕大多數(shù)8位、16位、32位以至64位微處理器、微控制器、數(shù)字信號(hào)處

理器(DSP)上運(yùn)行。

?可固化(ROMable)

jiC/OS-II是為嵌入式應(yīng)用而設(shè)計(jì)的,這就意味著,只要讀者有固化手

段(C編譯、連接、下載和固化),RC/OS-II可以嵌入到讀者的產(chǎn)品

中成為產(chǎn)品的一部分。

?可裁剪(Scalable)

可以只使用日C/OS-II中應(yīng)用程序需要的那些系統(tǒng)服務(wù)。也就是說(shuō)某產(chǎn)

品可以只使用很少幾個(gè)I1C/OS-II調(diào)用,而另一個(gè)產(chǎn)品則使用了幾乎所

有RC/OS-II的功能,這樣可以減少產(chǎn)品中的I1C/OS-H所需的存儲(chǔ)器空

間(RAM和ROM)o這種可剪裁性是靠條件編譯實(shí)現(xiàn)的。

5

piC/OS的性能特點(diǎn)(二)

?占先式(Preemptive)

?多任務(wù)

ILLC/OS-II可以管理64個(gè)任務(wù),然而,目前這一版本保留8個(gè)給系統(tǒng)。應(yīng)用程序最多

可以有56個(gè)任務(wù)

?可確定性

全部NC/OS-II的函數(shù)調(diào)用與服務(wù)的執(zhí)行時(shí)間具有可確定性。

?任務(wù)棧

每個(gè)任務(wù)有自己?jiǎn)为?dú)的棧,NC/OS-II允許每個(gè)任務(wù)有不同的??臻g,以便壓低應(yīng)

用程序?qū)AM的需求。

?系統(tǒng)服務(wù)

NC/OS-II提供很多系統(tǒng)服務(wù),例如郵箱、消息隊(duì)列、信號(hào)量、塊大小固定的內(nèi)存

的申請(qǐng)與釋放、時(shí)間相關(guān)函數(shù)等。

?中斷管理

中斷可以使正在執(zhí)行的任務(wù)暫時(shí)掛起,如果優(yōu)先級(jí)更高的任務(wù)被該中斷喚醒,則

高優(yōu)先級(jí)的任務(wù)在中斷嵌套全部退出后立即執(zhí)行,中斷嵌套層數(shù)可達(dá)255層。

?穩(wěn)定性與可靠性

6

J1C/0STI圖書

?描述了J1C/0S-H內(nèi)部的工作原理

?隨書的CD中包含了源代碼

■工業(yè)界最清晰的源代碼

?除英文版外,有中文和韓文版

nmtatrtmflTTO1Icevmala

嵌入式實(shí)時(shí)操作系統(tǒng)

MicroC/OS-npC/OS-llMicroC/OS-n

MicroC/OS-UTh?1tool-TinMiK?mt<

lecvndtdmoo

EnglishChineseKorean

ISBN1-57820-103-9ISBN7-81077-290-2ISBN89-951540-5-5

美國(guó)CMPBOOK北京航空航天大學(xué)出版社

7

J1C/0S-II的各種商業(yè)應(yīng)用

?全世界有數(shù)百種產(chǎn)品在應(yīng)用:

?Avionics

?Medical

?Cellphones

?Routersandswitches

?High-endaudioequipment

?Washingmachinesanddryers

?UPS(UninterruptiblePowerSupplies)

?Industrialcontrollers

?GPSNavigationSystems

?MicrowaveRadios

?Instrumentation

?Point-of-saleterminals

?更多

8

J1C/0S-II提供的系統(tǒng)服務(wù)

?信號(hào)量

?帶互斥機(jī)制的信號(hào)量

■減少優(yōu)先級(jí)倒置的問(wèn)題

?事件標(biāo)志

?消息信箱

?消息隊(duì)列

?內(nèi)存管理

?時(shí)鐘管理

?任務(wù)管理

9

pC/GUIandpC/FS

?pC/GUI

?嵌入式的用戶界面

?用ANSIC書寫

?支持任何8,16,32-bitsCPU

?彩色,灰、度,等級(jí)或黑白顯示

?代碼尺寸小

?J1C/FS

?嵌入式的文件系統(tǒng)WritteninANSIC

?用ANSIC書寫

?支持任何8,16,32-bitsCPU

?支持SMC,MMC,SD,CF,IDE,Flash,RAM其他介質(zhì)

io

本節(jié)提要

ILIC/OS-H簡(jiǎn)介

②NC/os-n內(nèi)核結(jié)構(gòu)

③K/OS-n任務(wù)管理

④^iC/OS-II時(shí)間管理

⑤|LiC/os-n任務(wù)通信與同步

?|LiC/os?n移植

11

ILiC/OS-lI的文件結(jié)構(gòu)

應(yīng)用程序軟件

uc/os-n

(與處理器無(wú)關(guān)的代碼)uC/OS-II設(shè)置

OS_CORE.CuCOS_Il.C(與應(yīng)用相關(guān)的代碼)

OS_MBOX.CuCOS_l!.C

OS_MEM.COS_Q,COS_CFG.H

OS_SEM.COS_TASK.CINCLUDES.H

OSTIME.C

uC/OS-H移植

(與處理器相關(guān)的代碼)

OS_CPU.H

OS_CUP_A.ASM

OS_CPU_C.C

軟件

硬件

CPU時(shí)鐘

12

四/OS-lI的內(nèi)核結(jié)構(gòu)

?內(nèi)核結(jié)構(gòu)

?任務(wù)管理

?時(shí)間管理

?任務(wù)之間通信與同步

?K/OS的移植

13

任務(wù)task

典型的任務(wù)一個(gè)無(wú)限循環(huán)。

voidmytask(void*pdata)

(

for(;;){

dosomething;

waiting;

dosomething;

)

)

?pC/OS-II2.5版本支持64個(gè)任務(wù),每個(gè)任務(wù)一個(gè)特定的優(yōu)先級(jí)。優(yōu)先級(jí)越高

,數(shù)字越小。

?系統(tǒng)占用了8個(gè)任務(wù),保留優(yōu)先級(jí)為0、1、2、3、0S_L0WEST_PRI0-3>

0S_L0WEST_PRI0-2.0S_L0WEST_PRI0-l.0S_L0WEST_PRI0-0o

14

「askStructure

voidYourTask(void*pdata)(1)

{

for(;;){(2)

/*用戶代碼*/

調(diào)用uC/OS-工工的某種系統(tǒng)服務(wù):

OSMboxPend();

OSQPend();

OSSemPend();

OSTaskDel(OS_PRIO_SELF);

OSTaskSuspend(OS_PRIO_SELF);

OSTimeDly();

OSTimeDlyHMSM();

/*用戶代碼*/

}

}

15

AlternateStructure

voidYourTask(void*pdata)

(

/*用戶代碼*/

OSTaskDel(OS_PRIO_SELF);

)

16

任務(wù)狀態(tài)

OSMBoxPostflOSMBoxPendi)

OSQPostOOSQP?nd()

OSQPostFroiit()

OSTaskDehiOSS?mPostOOSSemP?ndO

OSTaskR4sumvOOSTaskSusp^ndi)

OSTimeDlyR^sunwOOSTinwDlyi}

OSTim&Tick()OSTim^DlyHMSMi.

OSTaskC(oat?0

,OSTaskCr?Jt?Ext()OSStartii

OSIntExitn

OSTASKSM

DORMANREADYRUNNING

OSTaskD叫)

JaskisPi@@mpt9d

Figure3-LTaskStates

任務(wù)控制塊(TCB)

?任務(wù)控制塊OS_TCB是一個(gè)數(shù)據(jù)結(jié)構(gòu),保存該任務(wù)的相關(guān)

參數(shù),包括任務(wù)堆棧指針,狀態(tài),優(yōu)先級(jí),任務(wù)表位置,

任務(wù)鏈表指針等。

?所有的任務(wù)控制塊分為兩條鏈表,空閑鏈表和使用鏈表。

18

“/OSTI任務(wù)控制塊.

typedefstructos_tcb{

OS_STK*OSTCBStkPtr;

#ifOS_TASK_CREATE_EXT_EN>0

void*OSTCBExtPtr;

OS_STK*OSTCBStkBottom;

INT32UOSTCBStkSize;

INT16UOSTCBOpt;

INT16UOSTCBId;

#endif

structos_tcb*OSTCBNext;

structos_tcb*OSTCBPrev;

#if(OS_Q_EN&&(OS_J4AX_QS>=2))||OS_^4B0X_EN||

OS_SEM_EN

OS_EVENT*OSTCBEventPtr;

#endif

19

#if(OS_Q_EN&&(OS_MKK_QS>=2))||OS_MBOX_EN

void*OSTCBMsg;

#endif

INT16UOSTCBDly;

INT8UOSTCBStat;

INT8UOSTCBPrio;

INT8UOSTCBX;

INT8UOSTCBY;

INT8UOSTCBBitX;

INT8UOSTCBBitY;

#ifOS_TASK_DEL_EN

BOOLEANOSTCBDelReq;

#endif

}OSTCB;

20

任務(wù)控制塊0S_TCB中幾個(gè)成員的算法

OSTCBY=priority?3;

OSTCBBitY=OSMapTbl[priority?3];

OSTCBX=priority&0x07;

OSTCBBitX=OSMapTbl[priority&0x07];

21

空任務(wù)列表

所有的任務(wù)控制塊都被放置在任務(wù)控制塊列表數(shù)組OSTCBTbl[]中,

系統(tǒng)初始化時(shí),所有任務(wù)控制塊被鏈接成空任務(wù)控制塊的單向鏈表,

任務(wù)建立后,空任務(wù)控制塊指針OSTCBFreeList指向的任務(wù)控制塊

就賦給了該任務(wù),然后OSTCBFreeList的值調(diào)整為指向鏈表中的下

一個(gè)空任務(wù)控制塊。

Figure3.2ListoffreeOS_TCBs.

OSTCBTbl[OS_MAX_TASKS-?-OS_N_SYS_TASKS-1]

OSTCBTbl[01OSTCBTbl(1]OSTCBTbl[2]

OSTCBFreeList?osTCK^ext*——?osTCBNext?

22

任務(wù)控制塊初始化函數(shù)

INT8UOS_TCBInit

(INT8Uprio,OS_STK*ptos,OS_STK*pbos,

INT16Uid,

INT32Ustksize,void*pext,

INT16Uopf)

23

任務(wù)級(jí)的任務(wù)調(diào)度--OSSched

?戰(zhàn)/os是占先式實(shí)時(shí)多任務(wù)內(nèi)核,優(yōu)先級(jí)最高的任務(wù)一旦準(zhǔn)備就

緒,則擁有CPU的所有權(quán)開(kāi)始投入運(yùn)行。

?K/0S中不支持時(shí)間片輪轉(zhuǎn)法,每個(gè)任務(wù)的優(yōu)先級(jí)要求不一樣且

是唯一的,所以任務(wù)調(diào)度的工作就是:查找準(zhǔn)備就緒的最高優(yōu)先

級(jí)的任務(wù)并進(jìn)行上下文切換。

?戰(zhàn)/OS任務(wù)調(diào)度所花的時(shí)間為常數(shù),與應(yīng)用程序中建立的任務(wù)數(shù)

無(wú)關(guān)。

24

根據(jù)就緒表確定最高優(yōu)先名

兩個(gè)關(guān)鍵:

?優(yōu)先級(jí)數(shù)分解為高三位和低三位分別確定;

?高優(yōu)先級(jí)有著小的優(yōu)先級(jí)號(hào);

25

根據(jù)優(yōu)先級(jí)找到任務(wù)在就緒任務(wù)表中的代

每個(gè)就緒的任務(wù)都放入就緒表中(readylist)中,就緒表有兩個(gè)變

量:OSRdyGrp、OSRdyTbl[]

OSRdyTbl[7]優(yōu)先級(jí)最高工務(wù)

X---------H

[0]76543210

[1]15141312111098

⑵2322212019181716

[3]3130292827262524

[4]3938373635343332

[5]4746454443424140

[6]5554535251504948

[7]6362616059585756

任務(wù)優(yōu)先級(jí)優(yōu)先級(jí)最低任務(wù)

(空閑任務(wù))

00YYYX任務(wù)優(yōu)先級(jí)號(hào)

根據(jù)優(yōu)先級(jí)確定就緒表(1)

■假設(shè)優(yōu)先級(jí)為12的任務(wù)進(jìn)入就緒狀態(tài),12=1100b,貝lOSRdyTbl[1]

的第4位置1,且OSRdyGrp的第1位置1,相應(yīng)的數(shù)學(xué)表達(dá)式為:

OSRdyGrp1=0x02;

OSRdyTbl[1]1=0x10;

■而優(yōu)先級(jí)為21的任務(wù)就緒21=10101b,貝^OSRdyTbl[2]的第5位置

1,且OSRdyGrp的第2位置1,相應(yīng)的數(shù)學(xué)表達(dá)式為:

OSRdyGrp|=0x04;

OSRdyTbl[2]1=0x20;

27

根據(jù)優(yōu)先級(jí)確定就緒表(2)

?從上面的計(jì)算我們可以得到:若OSRdyGrp及OSRdyBbl[]的第n位置

1,則應(yīng)該把OSRdyGrp及OSRdyBbl口的值與2n相或。uC/OS中,把

2n的n=0-7的8個(gè)值先計(jì)算好存在數(shù)組OSMapTbl[7]中,也就是:

OSMapTbl[0]=2°=0x01(00000001)

OSMapTbl[1]=2」0x02(00000010)

OSMapTbl[7]=27=0x80(10000000)

28

使任務(wù)進(jìn)入就緒態(tài)

■如果pri。是任務(wù)是優(yōu)先級(jí),也是任務(wù)的識(shí)別號(hào),則將任務(wù)放入就緒表

,即使任務(wù)進(jìn)入就緒態(tài)的方法是:

OSRdyGrp|=OSMapTbl[prio>>3];

OSRdyTbl[prio?3]|=OSMapTbl[prio&0x07];

■假設(shè)優(yōu)先級(jí)為12——1100b

OSRdyGrp1=0x02;

OSRdyTbl[1]1=0x10;

29

使任務(wù)脫離就緒態(tài)

■將任務(wù)就緒表OSRdyTbl[prio>>3]相應(yīng)元素的相應(yīng)位清零,而且當(dāng)

OSRdyTbl[prio?3]中的所有位都為零時(shí),即全組任務(wù)中沒(méi)有一個(gè)進(jìn)

人就緒態(tài)時(shí),OSRdyGrp的相應(yīng)位才為零。

If((OSRdyTbl[prio?3]&=?OSMapTbl[prio&0x07])==0);

OSRdyGrp&=~OSMapTbl[prio>>3];

根據(jù)就緒表確定最高優(yōu)先級(jí)

?通過(guò)OSRdyGrp值確定高3位,假設(shè)為0x24=100100b,-->對(duì)應(yīng)

OSRdyTbl[2]和OSRdyTbl[5],高優(yōu)先級(jí)為2

?通過(guò)OSRdyTbl⑵的值來(lái)確定低3位,

假設(shè)為0x12=010010b,-->第2個(gè)和第5個(gè)任務(wù),取高優(yōu)先級(jí)

為2,則最高優(yōu)先級(jí)的任務(wù)號(hào)為17

OSRdyTbl[7]

X

[0]76543210

[1]15141312111098

[2]00010010

[3]3130292827262524

⑷3938373635343332Y

[5]4746454443424140

[6]5554535251504948

⑺6362616059585756

任務(wù)優(yōu)先級(jí)

00010010

31

源代碼中使用了查表法

查表法具有確定的時(shí)間,增加了系統(tǒng)的可預(yù)測(cè)性,uC/OS中所有的

系統(tǒng)調(diào)用時(shí)間都是確定的

High3=OSUnMapTbl[OSRdyGrp];

Low3=OSUnMapTbl[OSRdyTbl[High3]];

Prio=(Hign3<<3)+Low3;

OSRdyGrp

OSRdyTbl[7]

—X—

[0]76543210A

[1]15141312111098

⑵2322212019181716

[3]3130292827262524

Y

[4]3938373635343332

[5]4746454443424140

[6]5554535251504948

[7]6362616059585756

任務(wù)優(yōu)先級(jí)

o|o|Y|Y|Y|X|X|x

32

優(yōu)先級(jí)判定表OSUnMapTbl[256]

INT8UconstOSUnMapTbl[]={舉例:

0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,

如OSRdyGrp的值為01101000B

4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,,多0X68,則查得

5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,^StJnMapTbl[OSRdyGrp]的值是

4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/3,它相應(yīng)于OSRdyGrp中的第3

6,0,1,0,2,0,1,0,3,0,1,0,位置1;

4,0,1,0,2,0,1,0,3,0,1,0,

5,0,1,0,2,0,1,O(3X1,O,2,0,1,0,

如OSRdyTbl[3]的值是

4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,11100100B,肛0XE4,則查

7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,OSUnMapJXWRdyTbl[3]]的

值學(xué)/畫進(jìn)入就緒態(tài)的最高

4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,

任務(wù)優(yōu)先級(jí)

5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,

4,0,1,0,2,0,1,0,3,0,1,0,2,0,Prio=3*8+2=26

6,0,1,0,2,0,1,0,3,0,1,0,

4,0,1,0,2,0,1,0,2,0,1,0,

5,0,1,0,2,0,1,0,2,0,1,0,

4,0,1,0,@0,1,0,3,0,1,0,2,0,1,0

);

33

Taskscheduler

voidOSSched(void)

(

INT8Uy;

OS_ENTER_CRITICAL();

if((OSLockNesting=0)&&(OSIntNesting=0)){

y=OSUnMapTbl[OSRdyGrp];

OSPrioHighRdy=(INT8U)((y?3)+OSUnMapTbl[OSRdyTbl[y]])

if(OSPrioHighRdy!=OSPrioCur){

OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];

OSCtxSwCtr++;

OS_TASK_SW();

)

}

OS_EXIT_CRITICAL();

}

34

給調(diào)度器上鎖

voidOSSchedLock(void)

(

if(OSRunning==TRUE){

OS_ENTER_CRITICAL();

if(OSLockNesting<255){

OSLockNesting++;

)

OS_EXIT_CRITICAL();

)

)

35

給調(diào)度器開(kāi)鎖

voidOSSchedllnlock(void)

{

if(OSRunning==TRUE){

OS_ENTER_CRITICAL();

if(OSLockNesting>0){

OSLockNesting-;

if((OSLockNesting==0)&&(OSIntNesting==0)){

OS_EXIT_CRITICAL();

OSSched();

}else{

OS_EXIT_CRITICAL();

}

}else{

OS_EXIT_CRITICAL();

}

36

任務(wù)切換

?將被掛起的任務(wù)寄存器人棧

?將較高優(yōu)先級(jí)任務(wù)的寄存器出棧

37

任務(wù)級(jí)的任務(wù)切換OS_TASK_SW()

?OS_TASK_SW()是宏調(diào)用,含有微處理器的軟中斷指令

?OS.TASK.SW()將處理器相關(guān)的軟件中斷機(jī)制封裝起來(lái),便于操作

系統(tǒng)移植

38

調(diào)用OS_TASK_SW()前的數(shù)據(jù)結(jié)構(gòu)

低優(yōu)先級(jí)任務(wù)高優(yōu)先級(jí)任務(wù)

OSTCBHighRdy

(3)

堆棧方向

39

保存當(dāng)前CPU寄存器的值

低優(yōu)先級(jí)任務(wù)高優(yōu)先級(jí)任務(wù)

(4)

40

重新裝入要運(yùn)行的任務(wù)

低優(yōu)先級(jí)任務(wù)高優(yōu)先級(jí)任務(wù)

41

任務(wù)切換OS_TASK_SW()的代碼

VoidOSCtxSw(void)

(

將RI,R2,R3及R4推入當(dāng)前堆棧;

OSTCBCur^OSTCBStkPtr=SP;

OSTCBCur=OSTCBHighRdy;

SP=OSTCBHighRdy-^OSTCBSTKPtr;

將R4,R3,R2及RI從新堆棧中彈出;

執(zhí)行中斷返回指令;

42

|LiC/OS-1I中的中斷

?中斷:由于某種事件的發(fā)生,而導(dǎo)致程序流程的改變。產(chǎn)生中斷的

事件稱為中斷源。

?CPU響應(yīng)中斷的條件:

■至少有一個(gè)中斷源向CPU發(fā)出中斷信號(hào);

■系統(tǒng)允許中斷,且對(duì)此中斷信號(hào)未予屏蔽

?中斷類型:

■硬件中斷

■外部中斷

■陷井中斷

■現(xiàn)場(chǎng)控制量的中斷

43

|LiC/OS-lI中的中斷服務(wù)子程1

用戶中斷服務(wù)子程序:

保存全部CPU寄存器;

調(diào)用OSIntEnter()或OSIntNesting直接加1;

if(OSIntNesting==l){

OSTCBCur->OSTCBStkPtr=SP;

)

清中斷源;

重新開(kāi)中斷;

執(zhí)行用戶代碼做中斷服務(wù);

調(diào)用OSIntExit();

恢復(fù)所有CPU寄存器;

執(zhí)行中斷返回指令;

44

中斷服務(wù)

Time

TaskResponse?

Interrup(^Request⑴

v*/OS-11oryourapplication

▼hasInterruptsdlsablej.

InterruptRecovery

NoNewHPTor,

Vectoring■OSLockNestingReturnfrominterrupt

(3)J⑼

SavingContext!R^torecontext

t(8)

Notifykernel:

Notifykernel:OSInlExttO

OSIntEntert)or,

OSIntNesting++UserISRcode

InterruptResponseNotifykernel:OSIntExitO

(10)

Restorecontext

1di)

■Returnfrominterrupt

L-ISRsignalsatask

NewHP%(12)

TAWK

InterruptRecovery

TaskResponse

Figure3-5.Servicinganinterrupt

45

Listing3.16NotifyfiC/OS-HaboutbeginninganISR.

voidOSIntEncer(void)

{

OS_ENTER_CRITICAL();

OSIntNesting++;

OS_EXIT_CRITICAL();

46

Listing3.17Notify〃C/OS?〃aboutleavinganISR.

voidOSIntExit(void)

(

OS_ENTER_CRITICAL();(1)

if((--OSIntNesting|OSLockNesting)—0){(2)

OSIntExitY=OSUnMapTbl[OSRdyGrp];

SearchforHighest

OSPrioHighRdy=(INT8U)((OSIntExitY?3)+priority-similarto

scheduler

OSUnMapTbl[OSRdyTbl[OSIntExitY]]);

if(OSPrioHighRdy!=OSPrioCur){

OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];

OSCtxSwCtr++;

?----------Halfcontextswitchisdoneby

OSIntCtxSw();(4)

interruptresponse-i.e.registers

}saved

)

OS_EXIT_CRITICAL();

中斷與時(shí)鐘節(jié)拍

?時(shí)鐘節(jié)拍(時(shí)鐘滴答)Tick,是一種定時(shí)器中斷,可通過(guò)編程方

式實(shí)現(xiàn)

?時(shí)鐘節(jié)拍是一種特殊的中斷,操作系統(tǒng)的心臟。首先32位的整數(shù)

OSTime加一。對(duì)任務(wù)列表進(jìn)行掃描,判斷是否有延時(shí)任務(wù)應(yīng)該處

于準(zhǔn)備就緒狀態(tài),最后進(jìn)行上下文切換。

時(shí)鐘節(jié)拍中斷服務(wù)子程序

VoidOSTicklSR(void)

(

保存處理器寄存器的值;

調(diào)用OSIntEnter(),或是將OSIntNesting加1

if(OSIntNesting==l){

OSTCBCur->OSTCBStkPtr=SP;

}

調(diào)用OSTimeTickO;

清發(fā)出中斷設(shè)備的中斷;

重新允許中斷(可選用)

調(diào)用OS用tExit();

恢復(fù)處理器寄存器的值;

執(zhí)行中斷返回指令;

}

49

時(shí)鐘節(jié)拍函數(shù)OS77y77M0

voidOSTimeTick(void)

(

OS_TCB*ptcb;

OSTimeTickHook();(1)

ptcb=OSTCBList;(2)

while(ptcb->OSTCBPrio!=OSJDLE_PRIO){(3)

OS_ENTER_CRITICAL();

if(plcbAOSi'CBDIy!=0){

if(-ptcb->OSTCBDIy==0){

if(!(ptcb->OSTCBStat&OS_STAT_SUSPEND)){(4)

OSRdyGrp|=ptcb->OSTCBBitY;(5)

OSRdyTbl[ptcb->OSTCBY]|=ptcb->OSTCBBitX;

}else{

ptcb->OSTCBDIy=1;

}

}

}

ptcb=ptcb->OSTCBNext;

OS_EXIT_CRITICAL();

}

OS_ENTER_CRITICAL();(6)

OSTime++;(7)

OS_EXIT_CRITICAL();

50

空閑任務(wù)。SAsk/d/e。

voidOSTaskldle(void*pdata)

(

pdata=pdata;

for(;;){

OS_ENTER_CRITICAL();

OSIdleCtr++;

OS_EXIT_CRITICAL();

51

初始化統(tǒng)計(jì)任務(wù)

voidmain(void)

(

OSInit();/*初始化uC/OS-工工(1)*/

/*安裝uC/OS-工工的任務(wù)切換向量*/

/*創(chuàng)建用戶起始任務(wù)(以TaskStart()作為起始任務(wù))⑵*/

OSStartO;/*開(kāi)始多任務(wù)調(diào)度(3)*/

}

voidTaskStart(void*pdata)

(

/*安裝并啟動(dòng)uC/OS-工工的時(shí)鐘節(jié)拍(4)*/

OSStatlnitO;/*初始化統(tǒng)計(jì)任務(wù)(5)*/

/*創(chuàng)建用戶應(yīng)用程序任務(wù)*/

for(;;){

/*這里是TaskStar七()的代碼!*/

}

52

統(tǒng)計(jì)任務(wù)初始化

HighestPriorityOSLOWESTPRIO-1OSLOWESTPRIO

na1n>TaekEtart(|C'CTaekCtat(IC^TMhldle*::

0£Init<|::1|

InetallcantextavdtehrectM;12;

CreateTackstartIi:i1?

110)

114)

Figure3-4,Statistictaskinitialization

53

四/OS-lI初始化

?首先調(diào)用系統(tǒng)初始化函數(shù)OSHnt()。OSHnt()初始化piC/OS-n所有的

變量和數(shù)據(jù)結(jié)構(gòu)(見(jiàn)OS_CORE.C)。

?05111讓()建立空閑任務(wù)1€1薄1251這個(gè)任務(wù)總是處于就緒態(tài)的??臻e

任務(wù)OSTaskldle()的優(yōu)先級(jí)總是設(shè)成最低,即

OS_LOWEST_PRIOo

?如果統(tǒng)計(jì)任務(wù)允許OS_TASK_STAT_EN和任務(wù)建立擴(kuò)展允許都設(shè)為

1,則OSInit()還得建立統(tǒng)計(jì)存務(wù)OS^askStat。并且讓其進(jìn)入就緒態(tài)

oOSTaskStat的優(yōu)先級(jí)總是設(shè)為OS_LOWEST_PRIO-1

?空閑和統(tǒng)計(jì)任務(wù)的任務(wù)控制塊(OS_TCBs)是用雙向鏈表鏈接在一

起的。OSTCBList指向這個(gè)鏈表的反始處。當(dāng)建立一個(gè)任務(wù)時(shí),這

個(gè)任務(wù)總是被放在這個(gè)鏈表的起始處。

54

調(diào)用OSInitO之后的數(shù)據(jù)結(jié)構(gòu)

PHUME----------OSTCGSUPtr------------

CSTCGEXiPr:MJLI□STCGEJdPr-NUU

CGlCQSliDcttnm--------osrcsstiBottDm---------

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論