版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度鐵路建設(shè)專用碎石料供應(yīng)保障協(xié)議3篇
- 鄉(xiāng)村民俗活動(dòng)與現(xiàn)代文明融合探索-洞察分析
- 2024年林業(yè)有害生物防治承包合同3篇
- 遺傳變異與沙培林關(guān)聯(lián)研究-洞察分析
- 無(wú)障礙設(shè)施設(shè)計(jì)中的人體工程學(xué)考量-洞察分析
- 采購(gòu)法務(wù)與合同的合同簽訂流程3篇
- 采購(gòu)合同制定合同的電子化管理3篇
- 網(wǎng)頁(yè)數(shù)據(jù)抓取技術(shù)優(yōu)化研究-洞察分析
- 2024年智能穿戴設(shè)備定制與供應(yīng)合同
- 采購(gòu)合同培訓(xùn)問(wèn)答環(huán)節(jié)3篇
- 2024年激光切割機(jī)市場(chǎng)需求分析報(bào)告
- 西餐原料知識(shí)理論知識(shí)考核試題及答案
- 加油站員工績(jī)效考核(標(biāo)準(zhǔn)版)
- 2024年國(guó)家開(kāi)放大學(xué)(電大)-國(guó)家開(kāi)放大學(xué)(國(guó)學(xué)經(jīng)典選讀)筆試歷年真題薈萃含答案
- 自動(dòng)泊車系統(tǒng)的使用說(shuō)明
- 文言文閱讀訓(xùn)練:曾鞏《隆平集-何承矩》(附答案解析與譯文)
- 《路德維?!べM(fèi)爾巴哈和德國(guó)古典哲學(xué)的終結(jié)》導(dǎo)讀
- 材料分揀plc控制系統(tǒng)設(shè)計(jì)
- 應(yīng)用經(jīng)方治療頑固性心力衰竭課件
- 金剛石切割線行業(yè)報(bào)告
- 籌建康復(fù)醫(yī)院項(xiàng)目計(jì)劃書
評(píng)論
0/150
提交評(píng)論