2 Task 0 Task 1 t 0 t

  • Slides: 153
Download presentation

运行流程(2) 起始 任务 Task 0 Task 1 t 0 t 1 t 2 Task

运行流程(2) 起始 任务 Task 0 Task 1 t 0 t 1 t 2 Task 0 Task 1 t 3 t 4 Task 1 t 5 t 6 t 7 t 8 t 1时刻后应用任务开始轮转 12

操作系统配置 #define OS_MAX_TASKS /*最多可以创建 3个任务*/ 3 #define OS_LOWEST_PRIO /*任务优先级不可以大于14*/ 14 #define OS_TASK_CREATE_EN /*允许使用OSTask. Create()*/

操作系统配置 #define OS_MAX_TASKS /*最多可以创建 3个任务*/ 3 #define OS_LOWEST_PRIO /*任务优先级不可以大于14*/ 14 #define OS_TASK_CREATE_EN /*允许使用OSTask. Create()*/ 1 #define OS_TASK_SUSPEND_EN 1 /*允许使用OSTask. Suspend() and OSTask. Resume()*/ 13

源程序说明(1) 1、创建起始任务Task. Start OSTask. Create(Task. Start, (void *)0, Task. Start. Stk[TASK_STK_SIZE - 1], 4);

源程序说明(1) 1、创建起始任务Task. Start OSTask. Create(Task. Start, (void *)0, Task. Start. Stk[TASK_STK_SIZE - 1], 4); Task. Start负责: • 安装时钟中断服务例程 • ucos_x 86_idt_set_handler(0 x 20, (void *)OSTick. ISR, 0 x 8 e 00); • 初始化操作系统时钟 • ucos_timer_init(); • 创建应用任务 • Task. Start. Create. Tasks(); 15

源程序说明(2) 2、创建应用任务Task 0和Task 1 OSTask. Create(Task 0, (void *)&Task. Data[i], &Task. Stk[i][TASK_STK_SIZE - 1],

源程序说明(2) 2、创建应用任务Task 0和Task 1 OSTask. Create(Task 0, (void *)&Task. Data[i], &Task. Stk[i][TASK_STK_SIZE - 1], 5); OSTask. Create(Task 1, (void *)&Task. Data[i], &Task. Stk[1][TASK_STK_SIZE - 1], 6); 16

源程序说明(4) Task 1功能:唤醒Task 0 void Task 0 (void *pdata) { …… for (; ;

源程序说明(4) Task 1功能:唤醒Task 0 void Task 0 (void *pdata) { …… for (; ; ) { /* 无限循环 */ …. . err=OSTask. Resume(5); /* resume task 0 */ …. . } } 18

多任务 最高�先� Task 重要性 Task 最低�先� Task Each Task Event Task Infinite Loop 21

多任务 最高�先� Task 重要性 Task 最低�先� Task Each Task Event Task Infinite Loop 21

int main(void) { // Initialize u. COS-II. OSInit(); // Create the first task OSTask.

int main(void) { // Initialize u. COS-II. OSInit(); // Create the first task OSTask. Create(Test. Task 1, (void *) 11, &Test. Task. Stk 1[TASK_STK_SIZE], 11); // Start multitasking. OSStart(); return 0; } void Test. Task 1(void *pdata) { printf("%4 u: ***** Test Task 1 First call *****n", OSTime); //Create 3 other tasks OSTask. Create(Test. Task 2, (void *) 22, &Test. Task. Stk 2[TASK_STK_SIZE], 22); OSTask. Create(Test. Task 3, (void *) 33, &Test. Task. Stk 3[TASK_STK_SIZE], 33); OSTask. Create(Test. Task 4, (void *) 10, &Test. Task. Stk 3[TASK_STK_SIZE], 10); while (1) { printf("%4 u: ***** Test Task 11 *****n", OSTime); OSTime. Dly(1); } } 22

void Test. Task 2(void *pdata) { while (1) { printf("%4 u: ***** Test Task

void Test. Task 2(void *pdata) { while (1) { printf("%4 u: ***** Test Task 22 *****n", OSTime); OSTime. Dly(1); } } void Test. Task 3(void *pdata) { while (1) { printf("%4 u: ***** Test Task 33 *****n", OSTime); OSTime. Dly(1); } } void Test. Task 4(void *pdata) { while (1) { printf("%4 u: +++++ Test Task 10 +++++n", OSTime); OSTask. Suspend(10); //Suspend yourself } } 23

任务的内容 • 任务通常包含一个具有无限循环的程序 /*io. Task implements data obtaining and handling continuously*/ void io. Task(void)

任务的内容 • 任务通常包含一个具有无限循环的程序 /*io. Task implements data obtaining and handling continuously*/ void io. Task(void) { int data; initial(); /*The following sentences get data and handle data continuously*/ while(TRUE) { data = get. Data(); handle. Data(data); } } 28

void Your. Task (void *pdata) { for (; ; ){ /* USER CODE */

void Your. Task (void *pdata) { for (; ; ){ /* USER CODE */ Call one of u. C/OS-II’s services: OSFlag. Pend(); OSMbox. Pend(); OSMutex. Pend(); OSQPend(); OSSem. Pend(); OSTask. Del(OS_PRIO_SELF); OSTask. Suspend(OS_PRIO_SELF); OSTime. Dly(); OSTime. Dly. HMSM(); /* USER CODE */ } } void Your. Task (void *pdata) { /* USER CODE */ OSTask. Del(OS_PRIO_SELF); } 29

任务参数: 优先级(priority) 周期(period) 计算时间(computation time) 就绪时间(ready time) 截止时间(deadline) 36

任务参数: 优先级(priority) 周期(period) 计算时间(computation time) 就绪时间(ready time) 截止时间(deadline) 36

空闲任务 void OS_Task. Idle (void *pdata) { /* Prevent compiler warning for not using

空闲任务 void OS_Task. Idle (void *pdata) { /* Prevent compiler warning for not using 'pdata‘ */ pdata = pdata; for (; ; ) { OS_ENTER_CRITICAL(); OSIdle. Ctr++; OS_EXIT_CRITICAL(); /* Call user definable HOOK */ OSTask. Idle. Hook(); } } OSIdle. Ctr is used by the statistics task to determine how much CPU time (in percentage) is actually being consumed by the application software. 46

任务控制块 task name task ID task status task priority task context( registers and flags

任务控制块 task name task ID task status task priority task context( registers and flags of CPU) …… 任务控制块示意图 48

任务控制块 typedef struct os_tcb { OS_STK *OSTCBStk. Ptr; /* Pointer to current top of

任务控制块 typedef struct os_tcb { OS_STK *OSTCBStk. Ptr; /* Pointer to current top of stack*/ #if OS_TASK_CREATE_EXT_EN > 0 void *OSTCBExt. Ptr; /* Pointer to user definable data for TCB extension */ OS_STK *OSTCBStk. Bottom; /* Pointer to bottom of stack */ INT 32 U OSTCBStk. Size; /* Size of task stack (in number of stack elements) */ INT 16 U OSTCBOpt; /* Task options as passed by OSTask. Create. Ext() */ INT 16 U OSTCBId; /* Task ID (0. . 65535) */ #endif struct os_tcb *OSTCBNext; /* Pointer to next TCB in the TCB list */ struct os_tcb *OSTCBPrev; /* Pointer to previous TCB in the TCB list*/ 50

任务控制块 #if ((OS_Q_EN>0)&&(OS_MAX_QS>0))||(OS_MBOX_EN>0)||(OS_SEM_EN>0)| |(OS_MUTEX_EN>0) OS_EVENT *OSTCBEvent. Ptr; /* Pointer to event control block */

任务控制块 #if ((OS_Q_EN>0)&&(OS_MAX_QS>0))||(OS_MBOX_EN>0)||(OS_SEM_EN>0)| |(OS_MUTEX_EN>0) OS_EVENT *OSTCBEvent. Ptr; /* Pointer to event control block */ #endif #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0) void *OSTCBMsg; /* Message received from OSMbox. Post() or OSQPost()*/ #endif 51

任务控制块 #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0) #if

任务控制块 #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0) #if OS_TASK_DEL_EN > 0 OS_FLAG_NODE *OSTCBFlag. Node; /* Pointer to event flag node*/ #endif OS_FLAGS OSTCBFlags. Rdy; /* Event flags that made task ready to run*/ #endif INT 16 U event*/ OSTCBDly; /* Nbr ticks to delay task or, timeout waiting for INT 8 U OSTCBStat; /* Task status */ INT 8 U OSTCBPrio; /* Task priority (0 == highest, 63 == lowest) */ 52

INT 8 U OSTCBX; /* Bit position in group corresponding to task priority (0.

INT 8 U OSTCBX; /* Bit position in group corresponding to task priority (0. . 7)*/ INT 8 U OSTCBY; /* Index into ready table corresponding to task priority */ INT 8 U OSTCBBit. X; /* Bit mask to access bit position in ready table */ INT 8 U OSTCBBit. Y; /* Bit mask to access bit position in ready group */ #if OS_TASK_DEL_EN > 0 BOOLEAN OSTCBDel. Req; /* Indicates whether a task needs to delete itself */ #endif } OS_TCB; 53

任务切换 void { OS_Sched (void) INT 8 U y; OS_ENTER_CRITICAL(); if ((OSInt. Nesting ==

任务切换 void { OS_Sched (void) INT 8 U y; OS_ENTER_CRITICAL(); if ((OSInt. Nesting == 0) && (OSLock. Nesting == 0)) {/* Sched. only if all ISRs done & not locked */ y = OSUn. Map. Tbl[OSRdy. Grp]; /*Get pointer to HPT ready*/ OSPrio. High. Rdy = (INT 8 U)((y << 3) +OSUn. Map. Tbl[OSRdy. Tbl[y]]); if (OSPrio. High. Rdy != OSPrio. Cur) { /* No Ctx Sw if current task is highest rdy */ OSTCBHigh. Rdy = OSTCBPrio. Tbl[OSPrio. High. Rdy]; OSCtx. Sw. Ctr++; /* Increment context switch counter */ OS_TASK_SW(); /* Perform a context switch */ } } OS_EXIT_CRITICAL(); } 62

任务切换 void OSCtx. Sw (void) { PUSH R 1, R 2, R 3 and

任务切换 void OSCtx. Sw (void) { PUSH R 1, R 2, R 3 and R 4 onto the current stack; OSTCBCur->OSTCBStk. Ptr = SP; OSTCBCur = OSTCBHigh. Rdy; SP = OSTCBHigh. Rdy->OSTCBStk. Ptr; POP R 4, R 3, R 2 and R 1 from the new stack; Execute a return from interrupt instruction; } 63

Low Priority Task High Priority Task OS_TCB OSTCBCur OSTCBHigh. Rdy (3) LOW MEMORY CPU

Low Priority Task High Priority Task OS_TCB OSTCBCur OSTCBHigh. Rdy (3) LOW MEMORY CPU LOW MEMORY sp R 1 R 2 R 3 R 4 Stack Growth R 4 R 3 R 2 R 1 PC PSW HIGH MEMORY (2) (1) PC PSW R 4 R 3 R 2 R 1 PC PSW 64 HIGH MEMORY

Low Priority Task High Priority Task OS_TCB LOW MEMORY OSTCBHigh. Rdy OSTCBCur (1) (2)

Low Priority Task High Priority Task OS_TCB LOW MEMORY OSTCBHigh. Rdy OSTCBCur (1) (2) LOW MEMORY CPU sp R 1 R 2 R 3 R 4 R 3 R 2 R 1 PC PSW Stack Growth HIGH MEMORY (3) PC PSW (4) R 4 R 3 R 2 R 1 PC PSW 65 (4) HIGH MEMORY

OS_TCB OSTCBCur OSTCBHigh. Rdy (5) OSTCBCur->OSTCBStk. Ptr LOW MEMORY (4) PUSH DS PUSH ES

OS_TCB OSTCBCur OSTCBHigh. Rdy (5) OSTCBCur->OSTCBStk. Ptr LOW MEMORY (4) PUSH DS PUSH ES (3) PUSHA (2) OS_TASK_SW() (INT 128 ) (1) DS ES DI SI BP SP BX DX CX AX OFF_task SEG_task SW 80 x 86 CPU (Real Mode) SS SP (6) OSTCBHigh. Rdy->OSTCBStk. Ptr LOW MEMORY AX BX CX DX DS ES (1) (2) (3) (4) Stack Growth SI DI BP CS IP SW (7) (8) (9) (10) Stack Growth DS ES DI SI BP SP BX DX CX AX OFF_task SEG_task SW (7) POP DS POP ES (8) POPA (9) IRET 66 (10)

任务切换 _OSCtx. Sw PROC PUSHA PUSH FAR MOV AX, SEG _OSTCBCur DS, AX LES

任务切换 _OSCtx. Sw PROC PUSHA PUSH FAR MOV AX, SEG _OSTCBCur DS, AX LES MOV BX, DWORD PTR DS: _OSTCBCur ES: [BX+2], SS ES: [BX+0], SP CALL FAR PTR _OSTask. Sw. Hook MOV MOV AX, WORD DX, WORD PTR MOV AL, BYTE PTR DS: _OSPrio. High. Rdy BYTE PTR DS: _OSPrio. Cur, AL LES BX, DWORD PTR DS: _OSTCBHigh. Rdy MOV SS, ES: [BX+2] SP, ES: [BX] ; ; POP POPA DS ES ; Load new task's context ; ; ; Save current task's context ; ; ES DS ; ; Reload DS in case it was altered ; ; ; OSTCBCur->OSTCBStk. Ptr = SS: SP ; ; PTR DS: _OSTCBHigh. Rdy+2 PTR DS: _OSTCBHigh. Rdy DS: _OSTCBCur+2, AX DS: _OSTCBCur, DX ; OSTCBCur = OSTCBHigh. Rdy ; ; ; OSPrio. Cur = OSPrio. High. Rdy ; ; SS: SP = OSTCBHigh. Rdy->OSTCBStk. Ptr ; ; IRET ; _OSCtx. Sw ENDP ; Return to new task 67

任务队列 队列由任务控制块构成 TCB 1 队列 TCBn TCB 2 NULL Head task name task ID

任务队列 队列由任务控制块构成 TCB 1 队列 TCBn TCB 2 NULL Head task name task ID task status task priority task context … … … 任务队列 70

优先级位图算法(1) Ø引入优先级映射表OSMap. Tbl[]: OSMap. Tbl[]= {0 x 01, 0 x 02, 0 x 04,

优先级位图算法(1) Ø引入优先级映射表OSMap. Tbl[]: OSMap. Tbl[]= {0 x 01, 0 x 02, 0 x 04, 0 x 08, 0 x 10, 0 x 20, 0 x 40, 0 x 80}; Ø任务就绪算法: OSRdy. Grp |= OSMap. Tbl[prio>>3]; OSRdy. Tbl[prio>>3] |= OSMap. Tbl[prio&0 x 07]; Prio=0 b 0000101 Y=0;X=5 OSRdy. Grp=0 x 01;OSRdy. Tbl[0]=0 x 20 77

优先级位图算法(3) Ø查询就绪算法: Y=OSUn. Map. Tbl[OSRdy. Grp]; X=OSUn. Map. Tbl[OSRdy. Tbl[y]]; Prio = (Y<<3 )+

优先级位图算法(3) Ø查询就绪算法: Y=OSUn. Map. Tbl[OSRdy. Grp]; X=OSUn. Map. Tbl[OSRdy. Tbl[y]]; Prio = (Y<<3 )+ X; 如OSRdy. Grp为 0 x 01,OSRdy. Tbl[0] 为 0 x 20,经过 查询就绪算法后 Y=0;X=5; 最终prio = (0<<3)+5=5 79

优先级位图算法(4):多优先级查询 Ø如现在就绪的优先级有以下5个,prio = 3,4,13,16, 28 ØOSRdy. Grp和OSRdy. Tbl[]中具体数值分别为: Prio为 3,Y=0,x=3经查表OSMap. Tbl[],得OSRdy. Grp为 0 x

优先级位图算法(4):多优先级查询 Ø如现在就绪的优先级有以下5个,prio = 3,4,13,16, 28 ØOSRdy. Grp和OSRdy. Tbl[]中具体数值分别为: Prio为 3,Y=0,x=3经查表OSMap. Tbl[],得OSRdy. Grp为 0 x 01, OSRdy. Tbl[0] 为 0 x 08; Prio为 4,Y=0,x=4经查表OSMap. Tbl[],得OSRdy. Grp为 0 x 01, OSRdy. Tbl[0] 为 0 x 10; Prio为 13,Y=1,x=5经查表OSMap. Tbl[],得OSRdy. Grp为 0 x 02, OSRdy. Tbl[0] 为 0 x 20; Prio为 16,Y=2,x=0经查表OSMap. Tbl[],得OSRdy. Grp为 0 x 04, OSRdy. Tbl[2] 为 0 x 01; Prio为 28,Y=3,x=4经查表OSMap. Tbl[],得OSRdy. Grp为 0 x 08, OSRdy. Tbl[2] 为 0 x 10 80

OSTask. Create in u. COS INT 8 U OSTask. Create (void (*task)(void *pd), void

OSTask. Create in u. COS INT 8 U OSTask. Create (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT 8 U prio) { OS_STK *psp; INT 8 U err; OS_ENTER_CRITICAL(); if (OSTCBPrio. Tbl[prio] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority */ OSTCBPrio. Tbl[prio] = (OS_TCB *)1; /* Reserve the priority to prevent others from doing the same thing until task is created. */ OS_EXIT_CRITICAL(); psp = (OS_STK *)OSTask. Stk. Init(task, pdata, ptos, 0); /* Initialize the task's stack */ err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0); if (err == OS_NO_ERR) { OS_ENTER_CRITICAL(); OSTask. Ctr++; /* Increment the #tasks counter */ OS_EXIT_CRITICAL(); if (OSRunning == TRUE) { /* Find highest priority task if multitasking has started */ OS_Sched(); } } else { OS_ENTER_CRITICAL(); OSTCBPrio. Tbl[prio] = (OS_TCB *)0; /* Make this priority available to others */ OS_EXIT_CRITICAL(); } return (err); } OS_EXIT_CRITICAL(); 90 return (OS_PRIO_EXIST); }

OSTask. Create in u. COS int main(void) { // Initialize u. COS-II. OSInit(); //

OSTask. Create in u. COS int main(void) { // Initialize u. COS-II. OSInit(); // Create the first task OSTask. Create(Test. Task 1, (void *) 11, &Test. Task. Stk 1[TASK_STK_SIZE], 11); // Start multitasking. OSStart(); return 0; } void Test. Task 1(void *pdata) { printf("%4 u: ***** Test Task 1 First call *****n", OSTime); //Create 3 other tasks OSTask. Create(Test. Task 2, (void *) 22, &Test. Task. Stk 2[TASK_STK_SIZE], 22); OSTask. Create(Test. Task 3, (void *) 33, &Test. Task. Stk 3[TASK_STK_SIZE], 33); OSTask. Create(Test. Task 4, (void *) 10, &Test. Task. Stk 3[TASK_STK_SIZE], 10); while (1) { printf("%4 u: ***** Test Task 11 *****n", OSTime); OSTime. Dly(1); } } 91

OSTask. Create in u. COS void Test. Task 2(void *pdata) { while (1) {

OSTask. Create in u. COS void Test. Task 2(void *pdata) { while (1) { printf("%4 u: ***** Test Task 22 *****n", OSTime); OSTime. Dly(1); } } void Test. Task 3(void *pdata) { while (1) { printf("%4 u: ***** Test Task 33 *****n", OSTime); OSTime. Dly(1); } } void Test. Task 4(void *pdata) { while (1) { printf("%4 u: +++++ Test Task 10 +++++n", OSTime); OSTask. Suspend(10); //Suspend yourself } } 92

OSTask. Del in u. COS INT 8 U OSTask. Del (INT 8 U prio)

OSTask. Del in u. COS INT 8 U OSTask. Del (INT 8 U prio) { OS_EVENT *pevent; OS_TCB *ptcb; BOOLEAN self; if (OSInt. Nesting > 0) { /* See if trying to delete from ISR */ return (OS_TASK_DEL_ISR); } OS_ENTER_CRITICAL(); if (prio == OS_PRIO_SELF) { /* See if requesting to delete self */ prio = OSTCBCur->OSTCBPrio; /* Set priority to delete to current */ } ptcb = OSTCBPrio. Tbl[prio]; if (ptcb != (OS_TCB *)0) { /* Task to delete must exist */ if ((OSRdy. Tbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBit. X) == 0 x 00) { /* Make task not ready */ OSRdy. Grp &= ~ptcb->OSTCBBit. Y; } pevent = ptcb->OSTCBEvent. Ptr; if (pevent != (OS_EVENT *)0) { /* If task is waiting on event */ if ((pevent->OSEvent. Tbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBit. X) == 0) { /*. . . remove task from event ctrl block */ pevent->OSEvent. Grp &= ~ptcb->OSTCBBit. Y; } } ptcb->OSTCBDly = 0; /* Prevent OSTime. Tick() from updating */ ptcb->OSTCBStat = OS_STAT_RDY; /* Prevent task from being resumed */ if (OSLock. Nesting < 255) { 95 OSLock. Nesting++; } OS_EXIT_CRITICAL();

OSTask. Del in u. COS OS_Dummy(); /*. . . Dummy ensures that INTs will

OSTask. Del in u. COS OS_Dummy(); /*. . . Dummy ensures that INTs will be */ OS_ENTER_CRITICAL(); /*. . . disabled HERE! */ if (OSLock. Nesting > 0) { OSLock. Nesting--; } OSTask. Del. Hook(ptcb); /* Call user defined hook */ OSTask. Ctr--; /* One less task being managed */ OSTCBPrio. Tbl[prio] = (OS_TCB *)0; /* Clear old priority entry */ if (ptcb->OSTCBPrev == (OS_TCB *)0) { /* Remove from TCB chain ptcb->OSTCBNext->OSTCBPrev = (OS_TCB *)0; OSTCBList = ptcb->OSTCBNext; } else { ptcb->OSTCBPrev->OSTCBNext = ptcb->OSTCBNext; ptcb->OSTCBNext->OSTCBPrev = ptcb->OSTCBPrev; } ptcb->OSTCBNext = OSTCBFree. List; /* Return TCB to free TCB list OSTCBFree. List = ptcb; OS_EXIT_CRITICAL(); OS_Sched(); /* Find new highest priority task */ return (OS_NO_ERR); } OS_EXIT_CRITICAL(); return (OS_TASK_DEL_ERR); } */ */ 96

OSTask. Suspend in u. COS INT 8 U OSTask. Suspend (INT 8 U prio)

OSTask. Suspend in u. COS INT 8 U OSTask. Suspend (INT 8 U prio) { BOOLEAN self; OS_TCB *ptcb; OS_ENTER_CRITICAL(); if (prio == OS_PRIO_SELF) { /* See if suspend SELF */ prio = OSTCBCur->OSTCBPrio; self = TRUE; } else if (prio == OSTCBCur->OSTCBPrio) { /* See if suspending self */ self = TRUE; } else { self = FALSE; /* No suspending another task */ } ptcb = OSTCBPrio. Tbl[prio]; if (ptcb == (OS_TCB *)0) { /* Task to suspend must exist */ OS_EXIT_CRITICAL(); return (OS_TASK_SUSPEND_PRIO); } if ((OSRdy. Tbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBit. X) == 0 x 00) { /* Make task not ready OSRdy. Grp &= ~ptcb->OSTCBBit. Y; } ptcb->OSTCBStat |= OS_STAT_SUSPEND; /* Status of task is 'SUSPENDED' OS_EXIT_CRITICAL(); if (self == TRUE) { /* Context switch only if SELF OS_Sched(); } return (OS_NO_ERR); } */ */ */ 99

OSTask. Resume in u. COS INT 8 U OSTask. Resume (INT 8 U prio)

OSTask. Resume in u. COS INT 8 U OSTask. Resume (INT 8 U prio) { OS_TCB *ptcb; OS_ENTER_CRITICAL(); ptcb = OSTCBPrio. Tbl[prio]; if (ptcb == (OS_TCB *)0) { /* Task to suspend must exist */ OS_EXIT_CRITICAL(); return (OS_TASK_RESUME_PRIO); } if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) != OS_STAT_RDY) { /* Task must be suspended */ if (((ptcb->OSTCBStat &= ~OS_STAT_SUSPEND) == OS_STAT_RDY) && /* Remove suspension*/ (ptcb->OSTCBDly == 0)) { /* Must not be delayed */ OSRdy. Grp |= ptcb->OSTCBBit. Y; /* Make task ready to run */ OSRdy. Tbl[ptcb->OSTCBY] |= ptcb->OSTCBBit. X; OS_EXIT_CRITICAL(); OS_Sched(); } else { OS_EXIT_CRITICAL(); } return (OS_NO_ERR); } OS_EXIT_CRITICAL(); return (OS_TASK_NOT_SUSPENDED); } 101

抢占式和非抢占调度 ISR make High Priority Task Ready Interrupt Occurs Vector to ISR ISR Completes

抢占式和非抢占调度 ISR make High Priority Task Ready Interrupt Occurs Vector to ISR ISR Completes (Return to Task) High Priority Task Low Priority Task 非抢占型调度 Low Priority Task Completes (Switch to HP Task) 111

抢占式和非抢占调度 Interrupt occurs Vector to ISR make High Priority Task Ready ISR ISR Completes

抢占式和非抢占调度 Interrupt occurs Vector to ISR make High Priority Task Ready ISR ISR Completes (Switch to HP Task) High Priority Task (HPT) Low Priority Task (LPT) 抢占型 HP Task Completes (Switch back to LP Task) 112

优先级反转 优先级 高 T 1 T 2 T 3 低 t 0 t 10

优先级反转 优先级 高 T 1 T 2 T 3 低 t 0 t 10 t 2 t 3 t 4 t 5 t 6 t 7 t 8 t 9 tt 100 t 11 t 12 t 13 t 14 t 15 t 16 t 17 t 18 time Critical section guarded by S 129

优先级继承协议 优先级 高 T 1 T 2 T 3 低 t 0 t 10

优先级继承协议 优先级 高 T 1 T 2 T 3 低 t 0 t 10 t 2 t 3 t 4 t 5 t 6 t 7 t 8 t 9 tt 100 t 11 t 12 t 13 t 14 t 15 t 16 t 17 t 18 time Critical section guarded by S 134

优先级天花板协议 优先级 高 T 1 T 2 T 3 低 t 0 t 10

优先级天花板协议 优先级 高 T 1 T 2 T 3 低 t 0 t 10 t 2 t 3 t 4 t 5 t 6 t 7 t 8 t 9 tt 100 t 11 t 12 t 13 t 14 t 15 t 16 t 17 t 18 time Critical section guarded by S 145

优先级反转协议比较-优先级继承协议 优先级 高 T 1 T 2 T 3 T 4 T 5 T

优先级反转协议比较-优先级继承协议 优先级 高 T 1 T 2 T 3 T 4 T 5 T 6 T 7 低 t 01 t 2 t 3 t 4 t 5 t 6 t 7 t 8 t 9 tt 100 t 11 t 12 t 13 t 14 t 15 t 16 t 17 t 18 time Critical section guarded by S Critical section in respectively T 7 guarded by S after 1 st,2 nd,3 rd,4 th,5 th priority inheritance 149

优先级反转协议比较-天花板协议 优先级 高 T 1 T 2 T 3 T 4 T 5 T

优先级反转协议比较-天花板协议 优先级 高 T 1 T 2 T 3 T 4 T 5 T 6 低 T 7 t 01 t 2 t 3 t 4 t 5 t 6 t 7 t 8 t 9 tt 100 t 11 t 12 t 13 t 14 t 15 t 16 t 17 t 18 time Critical section guarded by S 151

UCOS的GUI开源网站: http: //www. ucgui. com/ucgui/u. C-GUI-V 3 -90 a. rar 153

UCOS的GUI开源网站: http: //www. ucgui. com/ucgui/u. C-GUI-V 3 -90 a. rar 153