嵌入式系統(tǒng)設計-uCOS原理.ppt_第1頁
嵌入式系統(tǒng)設計-uCOS原理.ppt_第2頁
嵌入式系統(tǒng)設計-uCOS原理.ppt_第3頁
嵌入式系統(tǒng)設計-uCOS原理.ppt_第4頁
嵌入式系統(tǒng)設計-uCOS原理.ppt_第5頁
已閱讀5頁,還剩100頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、1,uCOS原理及移植,u: Micro C:control uCOS : 適合于小的、控制器的操作系統(tǒng)小巧 公開源代碼,詳細的注解 可剝奪實時內核 可移植性強 多任務 確定性,2,概要,內核結構-任務以及調度機制 任務間通信 uC/OS的移植 在PC機上運行uC/OS,3,任務task,典型的一個無限循環(huán)。 void mytask(void *pdata) for (;) do something; waiting; do something; 支持64個任務,每個任務一個特定的優(yōu)先級。優(yōu)先級越高,數字越小 系統(tǒng)占用了兩個任務,空閑任務和統(tǒng)計任務。,4,任務的數據結構任務控制塊,任務控制塊

2、OS_tcb,包括 任務堆棧指針,狀態(tài),優(yōu)先級,任務表位置,任務鏈表指針等。 所有的任務控制塊分為兩條鏈表,空閑鏈表和使用鏈表。,5,任務控制塊結構,Struct os_tcb OS_STK *OSTCBStkPtr; struct os_tcb *OSTCBNext; struct os_tcb *OSTCBprev; OS_EVENT *OSTCBEventPtr; void *OSTCBMsg; INT16U OSTCBDly; INT8U OSTCBStat; INT8U OSTCBPrio; INT8U OSTCBX, OSTCBY, OSTCBBitX, OSTCBBitY; OS

3、_TCB,6,任務的狀態(tài),7,任務的狀態(tài) OSTCBStat,運行,就緒,等待,掛起 可以有多個準備就緒的任務,但一個時刻只有一個任務可以運行,OSHighRdy,8,任務的調度-OSSched,uC/OS是占先式實時多任務內核,優(yōu)先級最高的任務一旦準備就緒,則擁有CPU的所有權開始投入運行。,就緒任務表:用于存貯每個任務的就緒狀態(tài)標志。由兩個變量組成: OSRedyGrp:8位,每位表示一組(8個)任務中是否有就緒的任務。 OSRdyTbl:位圖方式表示某個任務是否就緒。,9,任務隊列,對于就緒任務,如果采用上述隊列方式進行管理,在基于優(yōu)先級的調度處理中,要獲得當前具有最高優(yōu)先級的就緒任務:

4、 方式一:任務就緒時,把就緒任務的任務控制塊放在就緒隊列的末尾。 調度程序需要從就緒隊列的頭部到尾部進行一次遍歷,才能獲得就緒隊列中具有最高優(yōu)先級的任務; 方式二:就緒隊列按照優(yōu)先級從高到低的順序排列。 新的就緒任務到達時,需要插入到就緒隊列的合適位置,確保就緒隊列保持優(yōu)先級從高到低排列的順序性。,10,任務隊列,在這兩種處理方式中,所花費的時間與任務數量有密切的關系,具有不確定性。 為提高實時內核的確定性,可采用一種被稱為優(yōu)先級位圖的就緒任務處理算法。,11,Free TCBs after OS_TCBInit() in uCOS,12,優(yōu)先級位圖算法,OSRdyGrp: 優(yōu)先級就緒組 OS

5、RdyTbl: 優(yōu)先級就緒表,35: 00100011,char OSRdyGrp; char OSRdyTbl8;,13,優(yōu)先級映射表OSMapTbl,char OSMapTbl8 = 0 x01, 0 x02, 0 x04, 0 x08, 0 x10, 0 x20, 0 x40, 0 x80; OSMapTbl的數組元素的下標與任務優(yōu)先級的低三位相對應。 OSMapTbl的數組元素對應的二進制值中,位為1的位表示OSRdyGrp或是OSRdyTbl的對應位也為1。,35: 00100011,14,INT8U const OSUnMapTbl = ,0, 0, 1, 0, 2, 0, 1,

6、0, 3, 0, 1, 0, 2, 0, 1, 0,4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,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, 1, 0,6, 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, 1, 0,5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2,

7、0, 1, 0,4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,7, 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, 1, 0,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, 1, 0,6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,4, 0, 1, 0

8、, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,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, 1, 0,/* 0 x00 to 0 x0F */,/* 0 x00 to 0 x1F */,/* 0 x00 to 0 x6F */,/* 0 x00 to 0 x7F */,/* 0 x00 to 0 x8F */,/* 0 x00 to 0 x9F */,/* 0 x00 to 0 xAF */,/* 0 x00 to 0 xBF */,/

9、* 0 x00 to 0 xCF */,/* 0 x00 to 0 xDF */,/* 0 x00 to 0 xEF */,/* 0 x00 to 0 x2F */,/* 0 x00 to 0 x3F */,/* 0 x00 to 0 x4F */,/* 0 x00 to 0 x5F */,/* 0 x00 to 0 xFF */,OSRdyTbl3 contains 0 x88,OSRdyGrp contains 0 x50,;,4 = OSUnMapTbl 0 x50 ; 3 = OSUnMapTbl 0 x88 ; 35 = (4 3) + 3;,以OSRdyGrp或是OSRdyTbl數

10、組元素的值為索引,獲取該值對應二進制表示中1出現(xiàn)的最低二進制位的序號(0-7)。,優(yōu)先級判定表char OSUnMapTbl256,15,任務進入就緒態(tài) OSRdyGrp |= OSMapTblpriority 3; OSRdyTblpriority 3 |= OSMapTblpriority ,35: 00100 011,00010000,00001000,16,任務退出就緒態(tài) if(OSRdyTblpriority 3 ,35: 00100 011,OSRdyGrp,7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,23,22,21,20,19,18,17,16,

11、31,30,29,28,27,26,25,24,39,38,37,36,35,34,33,32,47,46,45,54,43,42,41,40,55,54,53,52,51,50,49,48,63,62,61,60,59,58,57,56,7,6,5,4,3,2,1,0,OSRdyTbl, 00001000-11110111, 00010000-11101111,OSRdyTbl0,OSRdyTbl1,OSRdyTbl2,OSRdyTbl3,OSRdyTbl4,OSRdyTbl5,OSRdyTbl6,OSRdyTbl7,17,獲取進入就緒態(tài)的最高優(yōu)先級 high3Bit = OSUnMapTb

12、lOSRdyGrp; low3Bit = OSUnMapTblOSRdyTblhigh3Bit; priority = (high3Bit 3) + low3Bit;,ucOS中,任務按優(yōu)先級進行組織,以優(yōu)先級為數組元素下標,通過OSTCBPrioTbl即可找到相應的TCB。,35: 00100 011,OSRdyGrp,7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,23,22,21,20,19,18,17,16,31,30,29,28,27,26,25,24,1,0,0,0,1,0,0,0,47,46,45,54,43,42,41,40,55,54,53,52,

13、51,50,49,48,63,62,61,60,59,58,57,56,0,1,0,1,0,0,0,0,OSRdyTbl, 0 x50-4/high3Bit, 0 x88-3/low3Bit,OSRdyTbl0,OSRdyTbl1,OSRdyTbl2,OSRdyTbl3,OSRdyTbl4,OSRdyTbl5,OSRdyTbl6,OSRdyTbl7,18,設計了Task0、Task1兩個任務:任務Task0不斷地掛起自己,再被任務Task1解掛,兩個任務不斷地切換執(zhí)行 。,任務的基本管理,19,一個任務通常是一個無限的循環(huán),C/OS-中的任務,必須給每個任務賦以不同的優(yōu)先級,C/OS-總是運行

14、進入就緒態(tài)的優(yōu)先級最高的任務,20,運行流程,運行流程,21,t1時刻后應用任務開始輪轉,運行流程,22,#define OS_LOWEST_PRIO 14 /*任務優(yōu)先級不可以大于14*/,#define OS_TASK_CREATE_EN 1 /*允許使用OSTaskCreate()*/,#define OS_TASK_SUSPEND_EN 1 /*允許使用OSTaskSuspend() and OSTaskResume()*/,#define OS_MAX_TASKS 3 /*最多可以創(chuàng)建3個任務*/,操作系統(tǒng)配置,23,OSTaskCreate():建立一個新任務,OSTaskSusp

15、end():無條件掛起一個任務,OSTaskResume():喚醒一個掛起的任務,OSTimeDly():將一個任務延時若干個時鐘節(jié)拍,24,、創(chuàng)建起始任務TaskStart,OSTaskCreate(TaskStart, (void *)0, ,源程序說明,25,TaskStart負責:,安裝時鐘中斷服務例程 ucos_x86_idt_set_handler(0 x20,(void *)OSTickISR,0 x8e00); 初始化操作系統(tǒng)時鐘 ucos_timer_init(); 創(chuàng)建應用任務 TaskStartCreateTasks();,源程序說明,26,2、創(chuàng)建應用任務Task0和T

16、ask1,OSTaskCreate(Task0, (void *),源程序說明,27,Task0功能:掛起自己,void Task0 (void *pdata) for (;) /* 無限循環(huán) */ err=OSTaskSuspend(5); /* suspend itself */ err=OSTaskResume(6); /* 喚醒任務1 */ ,3、應用任務,源程序說明,28,Task1功能:喚醒Task0,void Task1 (void *pdata) for (;) /* 無限循環(huán) */ . err=OSTaskResume(5); /* resume task0 */ err=O

17、STaskSuspend(6); /* 掛起任務1*/ ,源程序說明,29,輸出信息,30,高優(yōu)先級任務需要等待低優(yōu)先級任務釋放資源,而低優(yōu)先級任務又正在等待中等優(yōu)先級任務,這種現(xiàn)象就被稱為優(yōu)先級反轉 。,優(yōu)先級反轉原理,31,共有3個應用任務TA0,TA1,TA2; 優(yōu)先級: TA0TA1TA2; TA0和TA2互斥使用資源 mutex; TA2最先獲得mutex。,32,#define OS_LOWEST_PRIO 9 /*任務優(yōu)先級不可以大于9*/,#define OS_TASK_CREATE_EN 1 /*允許使用OSTaskCreate()*/,#define OS_MAX_TASK

18、S 4 /*最多可以創(chuàng)建4個任務*/,#define OS_TASK_STAT_EN 0 /* 禁止統(tǒng)計任務*/,操作系統(tǒng)配置,33,#define OS_TICKS_PER_SEC 200 /*設置每秒之內的時鐘節(jié)拍數目*/,#define OS_SEM_EN 1 /*是否允許使用信號量功能*/,#define OS_MAX_EVENTS 1 /*最多可以有1個事件*/,操作系統(tǒng)配置,34,OSTaskCreate():建立一個新任務,OSTimeDly():將一個任務延時若干個時鐘節(jié)拍,OSSemCreate():建立并初始化一個信號量,OSSemPend():申請信號量,OSemPost

19、():設置信號量,35,、創(chuàng)建起始任務TaskStart,OSTaskCreate(TaskStart, (void *)0, ,源程序說明,36,TaskStart負責:,安裝時鐘中斷服務例程 ucos_x86_idt_set_handler(0 x20,(void *)OSTickISR,0 x8e00); 初始化操作系統(tǒng)時鐘 ucos_timer_init(); 創(chuàng)建應用任務 TaskStartCreateTasks();,源程序說明,37,2、創(chuàng)建應用任務Task0、Task1、Task2,OSTaskCreate(Task0, (void *),源程序說明,38,void Task0

20、 (void *pdata) for (;) /* 無限循環(huán) */ OSTimeDly(200); /* Delay 200 clock tick */ OSSemPend(mutex,0, /* Release mutex */ ,3、應用任務,Task0功能:申請信號量mutex,39,Task1功能:中等優(yōu)先級任務,搶占Task2的CPU,void Task (void *pdata) for (;) /* 無限循環(huán) */ . OSTimeDly(100); . OSTimeDly(100); ,源程序說明,40,void Task (void *pdata) for (;) /* 無限

21、循環(huán) */ OSSemPend(mutex,0, /* Release mutex */ ,Task功能:申請信號量mutex,源程序說明,41,t1,t2,t4,t5,t6,t7,t8,t9,t10,t11,7,優(yōu)先級,6,5,t12,t13,1,0,1,0,2,2,2,1,2,t3,1,0,0,運行流程,42,屏幕輸出,43,當高優(yōu)先級任務因申請某共享資源失敗被阻塞時,把當前擁有該資源的、且優(yōu)先級較低的任務的優(yōu)先級提升,提升的高度等于這個高優(yōu)先級任務的優(yōu)先級(可以指定一個PIP) 。,優(yōu)先級繼承的主要思想,44,任務A申請共享資源S,S是否被占用,任務A獲得共享資源S,S被任務B占用,任務

22、A被掛起,Priority(B)Priority( A)?,提升B的優(yōu)先級到PIP,B釋放資源s并恢復原來的優(yōu)先級,等待隊列中優(yōu)先級最高的任務獲得s,任務A繼續(xù)執(zhí)行,N,Y,N,Y,45,它們的原始優(yōu)先級: TASK0 TASK1 TASK2。,3個應用任務競爭同一互斥資源 mutex;,使用mutex時采用優(yōu)先級繼承策略,PIP(優(yōu)先級繼承優(yōu)先級)為8;,46,#define OS_LOWEST_PRIO 14 /*任務優(yōu)先級不可以大于14*/,#define OS_TASK_CREATE_EN 1 /*允許使用OSTaskCreate()*/,#define OS_MAX_TASKS 6

23、/*最多可以創(chuàng)建6個任務*/,#define OS_MAX_EVENTS 1 /*最多可以有1個事件*/,操作系統(tǒng)配置,47,#define OS_MUTEX_EN 1 /*是否允許使用互斥信號量的功能*/,#define OS_TASK_CHANGE_PRIO_EN 1 /*是否允許使用 OSTaskChangePrio()*/,#define OS_TIME_DLY_HMSM_EN 1 /*是否允許使用OSTimeDlyHMSM()*/,#define OS_TICKS_PER_SEC 200 /*設置每秒之內的時鐘節(jié)拍數目*/,操作系統(tǒng)配置,48,OSTaskCreate():建立一個新

24、任務,OSMutexCreate():創(chuàng)建互斥信號量,OSMutexPend():申請互斥信號量,OSTimeDlyHMSM( ):將一個任務延時若干時間,OSMutexPost():釋放互斥信號量,49,、應用初始化,OSTaskCreate(TaskStart, (void *)0, ,mutex = OSMutexCreate(8,設置互斥信號量,其中8為PIP(優(yōu)先級繼承優(yōu)先級)的值,創(chuàng)建起始任務TaskStart,源程序說明,50,TaskStart負責:,安裝時鐘中斷服務例程 ucos_x86_idt_set_handler(0 x20,(void *)OSTickISR,0 x8

25、e00); 初始化操作系統(tǒng)時鐘 ucos_timer_init(); 創(chuàng)建應用任務 TaskStartCreateTasks();,源程序說明,51,2、創(chuàng)建應用任務,for (i = 0; i N_TASKS; i+) TaskDatai = i; /* Each task will pass its own id */ OSTaskCreate(Task, (void *) ,源程序說明,52,void Task (void *pdata) for (;) /* 無限循環(huán) */ OSMutexPend(mutex, 0, /*延時*/ ,3、應用任務,源程序說明,53,t1,t2,t3,t

26、4,t5,t6,t7,t8,t9,t10,t11,12,優(yōu)先級,11,10,8,t12,t13,t14,2,1,0,1,2,1,2,0,2,1,2,2,0,2,1,2,t1時刻任務Task2首先獲得mutex,運行流程,54,輸出信息,55,5個任務:Task0、Task1、 Task2、 Task3、 Task4 5個信號量:Sem0, Sem1, Sem2, Sem3, Sem4 優(yōu)先級: Task0Task1Task2Task3Task4 每個任務i均作相同的工作: 申請信號量i, (i+1) mod 5; 保持信號量; 釋放信號量(i+1) mod 5,i,用信號量來對共享資源進行互斥

27、訪問,56,57,1、Task0 Task4先后執(zhí)行,顯示“thinking” , 然后掛起; 2、Task0 Task4延時先后到期,顯示“hungry” ,然后掛起; 3、 Task0、2、4、1、3先后獲得信號量號,顯示“eating ”,然后掛起 ; 4、,運行流程,58,#define OS_TASK_CREATE_EN 1 /*允許使用OSTaskCreate()*/,#define OS_MAX_TASKS 6 /*最多可以創(chuàng)建6個任務*/,#define OS_TASK_STAT_EN 0 /* 禁止統(tǒng)計任務*/,#define OS_TASK_CREATE_EXT_EN 1

28、/*是否允許使用OSTaskCreateExt()*/,操作系統(tǒng)配置,59,#define OS_TICKS_PER_SEC 200 /*設置每秒之內的時鐘節(jié)拍數目*/,#define OS_SEM_EN 1 /*是否允許使用信號量功能*/,#define OS_MAX_EVENTS 5 /*最多可以有5個事件*/,#define OS_LOWEST_PRIO 7 /*任務優(yōu)先級不可以大于7*/,操作系統(tǒng)配置,60,OSSemCreate() :建立并初始化一個信號量,OSSemPend() :申請信號量,OSSemPost() :釋放信號量,OSTimeDly():將一個任務延時若干個時鐘節(jié)

29、拍,OSTaskCreateExt () : 創(chuàng)建一個任務,61,、創(chuàng)建起始任務TaskStart,OSTaskCreateExt(TaskStart, (void *)0, ,源程序說明,62,TaskStart負責:,安裝時鐘中斷服務例程 ucos_x86_idt_set_handler(0 x20,(void *)OSTickISR,0 x8e00); 初始化操作系統(tǒng)時鐘 ucos_timer_init(); 創(chuàng)建信號量 forki = OSSemCreate(1); 創(chuàng)建應用任務 TaskStartCreateTasks();,63,2、創(chuàng)建應用任務Task0, ,Task4,for

30、(i = 0; i N_TASKS; i+) TaskDatai = i; OSTaskCreate(Task, (void *) ,3、應用任務,源程序說明,64,void Task (void *pdata) for (;) /* 無限循環(huán) */ TASK_Thinking_To_Hungry(i); OSSemPend(forki, 0, /* Delay 100 clock tick */ ,65,輸出信息,66,在C/OS-II中,操作系統(tǒng)把連續(xù)的大塊內存按分區(qū)來管理。每個分區(qū)中包含有整數個大小相同的內存塊。用戶的應用程序就可以從不同的內存分區(qū)中得到不同大小的內存塊。但是,特定的內存

31、塊在釋放時必須重新放回它以前所屬于的內存分區(qū)。,內存管理,67,創(chuàng)建一個含有2個內存塊的內存分區(qū),然后在這個分區(qū)中申請3次內存塊,再釋放掉申請的內存塊。,68,#define OS_MAX_MEM_PART 5 /*最多可以劃分5個內存塊*/,#define OS_MEM_EN 1 /*是否允許使用內存管理的功能*/,#define OS_MEM_QUERY_EN 1 /*是否允許使用OSMemQuery()*/,操作系統(tǒng)配置,69,#define OS_LOWEST_PRIO 7 /*任務優(yōu)先級不可以大于7*/,#define OS_MAX_TASKS 2 /*最多可以創(chuàng)建2個任務*/,#d

32、efine OS_TASK_STAT_EN 0 /* 禁止統(tǒng)計任務*/,#define OS_TIME_DLY_HMSM_EN 1 /*是否允許使用OSTimeDlyHMSM()*/,#define OS_TICKS_PER_SEC 200 /*設置每秒之內的時鐘節(jié)拍數目*/,操作系統(tǒng)配置,70,OSTaskCreate():建立一個新任務,OSMemCreate():初始化一個用于動態(tài)內存分配的區(qū)域,OSMemGet() :從內存區(qū)域分配一個內存塊,OSMemQuery():得到內存區(qū)域的信息,OSMemPut():釋放一個內存塊,OSTimeDlyHMSM( ):將一個任務延時若干時間,7

33、1,、創(chuàng)建起始任務TaskStart,OSTaskCreate(TaskStart, (void *)0, ,源程序說明,72,TaskStart負責:,安裝時鐘中斷服務例程 ucos_x86_idt_set_handler(0 x20,(void *)OSTickISR,0 x8e00); 初始化操作系統(tǒng)時鐘 ucos_timer_init(); 初始化分區(qū) MemoryCreate(); 創(chuàng)建應用任務 TaskStartCreateTasks();,73,2、創(chuàng)建應用任務Task,OSTaskCreate(Task, (void *),3、應用任務,源程序說明,74,void Task (

34、void *pdata) for (;) /* 無限循環(huán) */ CommMsg1=OSMemGet(CommMem, /* 釋放內存塊 (i為 3,2,1) */ ,75,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,1,時間,2,3,試圖申請內存塊3,失敗。,試圖申請內存塊3,失敗。,未分配:,已分配:,內存塊,運行流程,76,輸出信息,77,時鐘節(jié)拍是特定的周期性中斷。這個中斷可以看作是系統(tǒng)心臟的脈動。時鐘的節(jié)拍式中斷使得內核可以將任務延時若干個整數時鐘節(jié)拍,以及當任務等待事件發(fā)生時,提供等待超時的依據。,時鐘節(jié)拍中斷,78,Task1和Task2獲得信號量Inte

35、rruptSem后延時,Task1延時200Tick,Task2延時500Tick, 利用Task3輸出的次數來對Task1和Task2的延時計數, Task3每100Tick產生一次輸出。,79,#define OS_LOWEST_PRIO 16 /*任務優(yōu)先級不可以大于16*/,#define OS_MAX_TASKS 4 /*最多可以創(chuàng)建4個任務*/,#define OS_TASK_STAT_EN 0 /* 禁止統(tǒng)計任務*/,#define OS_TASK_SUSPEND_EN 1 /*是否允許使用OSTaskSuspend() and OSTaskResume()*/,操作系統(tǒng)配置,8

36、0,#define OS_SEM_EN 1 /*是否允許使用信號量功能 */,#define OS_TICKS_PER_SEC 200 /*設置每秒之內的時鐘節(jié)拍數目*/,#define OS_MAX_EVENTS 1 /*最多可以有1個事件*/,操作系統(tǒng)配置,81,OSTaskCreate():建立一個新任務,本實驗中所用到的C/OS-II相關函數,OSTimeDly():將一個任務延時若干個時鐘節(jié)拍,OSSemCreate():建立并初始化一個信號量,OSSemPend():申請信號量,OSemPost():設置信號量,82,、創(chuàng)建起始任務TaskStart,OSTaskCreate(Ta

37、skStart, (void *)0, ,源程序說明,83,TaskStart負責:,安裝時鐘中斷服務例程 ucos_x86_idt_set_handler(0 x20,(void *)OSTickISR,0 x8e00); 初始化操作系統(tǒng)時鐘 ucos_timer_init(); 創(chuàng)建信號量 InterruptSem=OSSemCreate(1); 創(chuàng)建應用任務 TaskStartCreateTasks();,源程序說明,84,2、創(chuàng)建應用任務Task,OSTaskCreate(Task1,(void *)0,源程序說明,85,void Task1 (void *pdata) for (;)

38、 /* 無限循環(huán) */ OSSemPend(InterruptSem, 0, ,3、應用任務,86,void Task2 (void *pdata) for (;) /* 無限循環(huán) */ OSSemPend(InterruptSem, 0, ,源程序說明,87,void Task3 (void *pdata) for (;) /* 無限循環(huán)*/ printk(Task3 has got to the CPU:n); OSTimeDly(100); ,源程序說明,88,輸出信息,89,90,消息隊列是C/OS-II中的一種通訊機制,它可以使一個任務或者中斷服務子程序向另一個任務發(fā)送以指針方式定義

39、的變量。因具體的應用有所不同,每個指針指向的數據結構變量也有所不同。,消息隊列機制的基本原理和使用方法,91,2個應用任務: TAq1TAq2TaskCon(控制任務) 創(chuàng)建隊列 以FIFO方式釋放消息 以LIFO方式釋放消息 清空消息隊列、查詢消息隊列 刪除消息隊列,92,#define OS_LOWEST_PRIO 11 /*任務優(yōu)先級不可以大于11*/,#define OS_TASK_CREATE_EN 1 /*允許使用OSTaskCreate()*/,#define OS_MAX_TASKS 8 /*最多可以創(chuàng)建8個任務*/,#define OS_TASK_STAT_EN 0 /* 禁止統(tǒng)計任務*/,操作系統(tǒng)配置,93,#define OS_Q_EN 1 /*是否允許使用消息隊列功能*/,#define OS_Q_DEL_EN 1 /*是否允許使用OSQDel()*/ #define OS_Q_FLUSH_EN 1 /*是否允許使用 OSQFlush()*/ #define OS_Q_POST_EN 1 /*是否允許使用 OSQPost()*/,操作系統(tǒng)配置,94,#define OS_TICKS_PER_SEC 200 /*設置每秒之內的時鐘節(jié)拍數目*/,#define OS_MAX_EVENTS

溫馨提示

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

評論

0/150

提交評論