📄 os_task.lst
字号:
C51 COMPILER V7.02b OS_TASK 07/08/2007 20:25:04 PAGE 1
C51 COMPILER V7.02b, COMPILATION OF MODULE OS_TASK
OBJECT MODULE PLACED IN OS_TASK.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE OS_TASK.C LARGE BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*
2 *********************************************************************************************************
3 * uC/OS-II
4 * The Real-Time Kernel
5 * TASK MANAGEMENT
6 *
7 * (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL
8 * All Rights Reserved
9 *
10 * V2.00
11 *
12 * File : OS_TASK.C
13 * By : Jean J. Labrosse
14 *********************************************************************************************************
15 */
16 /**************************************local************************************************************/
17 #include "includes.h"
18
19 #if OS_TASK_DEL_EN
20 static void OSDummy (void)reentrant
21 {
22 1 }
23 #endif
24 //建立系统空闲任务
25 INT8U OSTaskIdleCreate(){
26 1
27 1 INT8U err;
28 1 OS_STKCB *stkcb;
29 1
30 1 OS_ENTER_CRITICAL();
31 1 OSTCBPrioTbl[OS_LOWEST_PRIO] = (OS_TCB *)1;
*** WARNING C196 IN LINE 31 OF OS_TASK.C: mspace probably invalid
32 1 stkcb=OStkAsk();
33 1 OS_EXIT_CRITICAL();
34 1
35 1 OSTaskStkInit(OSTaskIdle, stkcb, 0);
36 1 err = OSTCBInit(OS_LOWEST_PRIO, stkcb, 0, (void *)0, 0);
37 1
38 1 if (err == OS_NO_ERR) {
39 2 OS_ENTER_CRITICAL();
40 2 OSTaskCtr++;
41 2 OSTaskCreateHook(OSTCBPrioTbl[OS_LOWEST_PRIO]);
42 2 OS_EXIT_CRITICAL();
43 2 if (OSRunning) {
44 3 OSSched();
45 3 }
46 2 } else {
47 2 OS_ENTER_CRITICAL();
48 2 OSTCBPrioTbl[OS_LOWEST_PRIO] = (OS_TCB *)0;
49 2 OS_EXIT_CRITICAL();
50 2 }
51 1 return (err);
52 1 }
53 //建立系统统计任务
54 #if OS_TASK_STAT_EN
C51 COMPILER V7.02b OS_TASK 07/08/2007 20:25:04 PAGE 2
55 INT8U OSTaskStatCreate(){
56 1
57 1 INT8U err;
58 1 OS_STKCB *stkcb;
59 1
60 1 OS_ENTER_CRITICAL();
61 1 OSTCBPrioTbl[OS_LOWEST_PRIO-1 ] = (OS_TCB *)1;
*** WARNING C196 IN LINE 61 OF OS_TASK.C: mspace probably invalid
62 1 stkcb=OStkAsk();
63 1 OS_EXIT_CRITICAL();
64 1
65 1 OSTaskStkInit(OSTaskStat, stkcb, 0);
66 1 err = OSTCBInit(OS_LOWEST_PRIO-1, stkcb, 0, (void *)0, 0);
67 1
68 1 if (err == OS_NO_ERR){
69 2 OS_ENTER_CRITICAL();
70 2 OSTaskCtr++;
71 2 OSTaskCreateHook(OSTCBPrioTbl[OS_LOWEST_PRIO-1]);
72 2 OS_EXIT_CRITICAL();
73 2 if (OSRunning) {
74 3 OSSched();
75 3 }
76 2 } else {
77 2 OS_ENTER_CRITICAL();
78 2 OSTCBPrioTbl[OS_LOWEST_PRIO-1] = (OS_TCB *)0;
79 2 OS_EXIT_CRITICAL();
80 2 }
81 1 return (err);
82 1 }
83 #endif
84
85 //改变任务优先级
86 #if OS_TASK_CHANGE_PRIO_EN
INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio)reentrant
{
OS_TCB *ptcb;
OS_EVENT *pevent;
INT8U x;
INT8U y;
INT8U bitx;
INT8U bity;
if ((oldprio >= OS_LOWEST_PRIO && oldprio != OS_PRIO_SELF) ||
newprio >= OS_LOWEST_PRIO) {
return (OS_PRIO_INVALID);
}
OS_ENTER_CRITICAL();
if (OSTCBPrioTbl[newprio] != (OS_TCB *)0) {
OS_EXIT_CRITICAL();
return (OS_PRIO_EXIST);
} else {
OSTCBPrioTbl[newprio] = (OS_TCB *)1;
OS_EXIT_CRITICAL();
y = newprio >> 3;
bity = OSMapTbl[y];
x = newprio & 0x07;
bitx = OSMapTbl[x];
OS_ENTER_CRITICAL();
if (oldprio == OS_PRIO_SELF) {
oldprio = OSTCBCur->OSTCBPrio;
}
C51 COMPILER V7.02b OS_TASK 07/08/2007 20:25:04 PAGE 3
if ((ptcb = OSTCBPrioTbl[oldprio]) != (OS_TCB *)0) {
OSTCBPrioTbl[oldprio] = (OS_TCB *)0;
if (OSRdyTbl[ptcb->OSTCBY] & ptcb->OSTCBBitX) {
if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
OSRdyGrp &= ~ptcb->OSTCBBitY;
}
OSRdyGrp |= bity;
OSRdyTbl[y] |= bitx;
} else {
if ((pevent = ptcb->OSTCBEventPtr) != (OS_EVENT *)0) {
if ((pevent->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
pevent->OSEventGrp &= ~ptcb->OSTCBBitY;
}
pevent->OSEventGrp |= bity;
pevent->OSEventTbl[y] |= bitx;
}
}
OSTCBPrioTbl[newprio] = ptcb;
ptcb->OSTCBPrio = newprio;
ptcb->OSTCBY = y;
ptcb->OSTCBX = x;
ptcb->OSTCBBitY = bity;
ptcb->OSTCBBitX = bitx;
OS_EXIT_CRITICAL();
OSSched();
return (OS_NO_ERR);
} else {
OSTCBPrioTbl[newprio] = (OS_TCB *)0;
OS_EXIT_CRITICAL();
return (OS_PRIO_ERR);
}
}
}
#endif
150
151 //建立任务(简单式)
152 #if OS_TASK_CREATE_EN
INT8U OSTaskCreate (void (*task)(void *pd)reentrant,
INT8U prio) reentrant
{
INT8U err;
OS_STKCB *stkcb;
if (prio > OS_LOWEST_PRIO) {
return (OS_PRIO_INVALID);
}
OS_ENTER_CRITICAL();
if (OSTCBPrioTbl[prio] == (OS_TCB *)0){
OSTCBPrioTbl[prio] = (OS_TCB *)1;
stkcb=(OS_STK *)OStkAsk(); //申请OS_STKCB
OS_EXIT_CRITICAL();
OSTaskStkInit(task, stkcb, 0);
err = OSTCBInit(prio, stkcb, 0, (void *)0, 0);
if (err == OS_NO_ERR) {
OS_ENTER_CRITICAL();
OSTaskCtr++;
OSTaskCreateHook(OSTCBPrioTbl[prio]);
OS_EXIT_CRITICAL();
C51 COMPILER V7.02b OS_TASK 07/08/2007 20:25:04 PAGE 4
if (OSRunning) {
OSSched();
}
}else {
OS_ENTER_CRITICAL();
OSTCBPrioTbl[prio] = (OS_TCB *)0;
OS_EXIT_CRITICAL();
}
return (err);
}else {
OS_EXIT_CRITICAL();
return (OS_PRIO_EXIST);
}
}
#endif
193
194 //建立任务(复杂式)
195 #if OS_TASK_CREATE_EXT_EN
196 INT8U OSTaskCreateExt (void (*task)(void *pd)reentrant, //任务
197 INT8U prio, //优先级
198 INT16U id, //任务ID
199 void *pext, //任务附加数据域指针
200 INT16U opt)reentrant //堆栈操作选项
201 {
202 1 INT8U err;
203 1 INT16U i;
204 1 OS_STK *pfill;
205 1 OS_STKCB *stkcb;
206 1
207 1 if (prio > OS_LOWEST_PRIO) {
208 2 return (OS_PRIO_INVALID);
209 2 }
210 1 OS_ENTER_CRITICAL();
211 1 if (OSTCBPrioTbl[prio] == (OS_TCB *)0) {
212 2 OSTCBPrioTbl[prio] = (OS_TCB *)1;
*** WARNING C196 IN LINE 212 OF OS_TASK.C: mspace probably invalid
213 2
214 2 stkcb=(OS_STKCB *)OStkAsk();
215 2 OS_EXIT_CRITICAL();
216 2
217 2 if (opt & OS_TASK_OPT_STK_CHK) {
218 3 if (opt & OS_TASK_OPT_STK_CLR) {
219 4 pfill = stkcb->OSTKBtomPtr ;
220 4 for (i = 0; i < OS_STK_SIZE ; i++) {
221 5 #if OS_STK_GROWTH == 1
222 5 *pfill++ = (OS_STK)0;
223 5 #else
*pfill-- = (OS_STK)0;
#endif
226 5 }
227 4 }
228 3 }
229 2
230 2 OSTaskStkInit(task, stkcb, opt);
231 2 err = OSTCBInit(prio, stkcb, id, pext, opt);
232 2 if (err == OS_NO_ERR){
233 3 OS_ENTER_CRITICAL();
234 3 OSTaskCtr++;
235 3 OSTaskCreateHook(OSTCBPrioTbl[prio]);
236 3 OS_EXIT_CRITICAL();
237 3 if (OSRunning) {
238 4 OSSched();
C51 COMPILER V7.02b OS_TASK 07/08/2007 20:25:04 PAGE 5
239 4 }
240 3 } else {
241 3 OS_ENTER_CRITICAL();
242 3 OSTCBPrioTbl[prio] = (OS_TCB *)0;
243 3 OS_EXIT_CRITICAL();
244 3 }
245 2 return (err);
246 2 } else {
247 2 OS_EXIT_CRITICAL();
248 2 return (OS_PRIO_EXIST);
249 2 }
250 1 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -