UCOS_TI_LM3S_Keil
 全部 结构体 文件 函数 变量 类型定义 宏定义 
os_core.c 文件参考
#include <ucos_ii.h>
os_core.c 的引用(Include)关系图:

浏览源代码.

宏定义

#define OS_GLOBALS
 

函数

static void OS_InitEventList (void)
 
static void OS_InitMisc (void)
 
static void OS_InitRdyList (void)
 
static void OS_InitTaskIdle (void)
 
static void OS_InitTaskStat (void)
 
static void OS_InitTCBList (void)
 
static void OS_SchedNew (void)
 
INT8U OSEventNameGet (OS_EVENT *pevent, INT8U **pname, INT8U *perr)
 
void OSEventNameSet (OS_EVENT *pevent, INT8U *pname, INT8U *perr)
 
INT16U OSEventPendMulti (OS_EVENT **pevents_pend, OS_EVENT **pevents_rdy, void **pmsgs_rdy, INT32U timeout, INT8U *perr)
 
void OSInit (void)
 
void OSIntEnter (void)
 
void OSIntExit (void)
 
void OSSchedLock (void)
 
void OSSchedUnlock (void)
 
void OSStart (void)
 
void OSStatInit (void)
 
void OSTimeTick (void)
 
INT16U OSVersion (void)
 
void OS_Dummy (void)
 
INT8U OS_EventTaskRdy (OS_EVENT *pevent, void *pmsg, INT8U msk, INT8U pend_stat)
 
void OS_EventTaskWait (OS_EVENT *pevent)
 
void OS_EventTaskWaitMulti (OS_EVENT **pevents_wait)
 
void OS_EventTaskRemove (OS_TCB *ptcb, OS_EVENT *pevent)
 
void OS_EventTaskRemoveMulti (OS_TCB *ptcb, OS_EVENT **pevents_multi)
 
void OS_EventWaitListInit (OS_EVENT *pevent)
 
void OS_MemClr (INT8U *pdest, INT16U size)
 
void OS_MemCopy (INT8U *pdest, INT8U *psrc, INT16U size)
 
void OS_Sched (void)
 
INT8U OS_StrLen (INT8U *psrc)
 
void OS_TaskIdle (void *p_arg)
 
void OS_TaskStat (void *p_arg)
 
void OS_TaskStatStkChk (void)
 
INT8U OS_TCBInit (INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT32U stk_size, void *pext, INT16U opt)
 

变量

INT8U const OSUnMapTbl [256]
 

宏定义说明

#define OS_GLOBALS

在文件 os_core.c25 行定义.

函数说明

static void OS_InitEventList ( void  )
static

在文件 os_core.c1254 行定义.

参考 OS_EVENT_TYPE_UNUSED, OS_MAX_EVENTS, OS_MemClr(), OSEventFreeList, OS_EVENT::OSEventName, OS_EVENT::OSEventPtr, OSEventTbl , 以及 OS_EVENT::OSEventType.

参考自 OSInit().

1255 {
1256 #if (OS_EVENT_EN) && (OS_MAX_EVENTS > 0u)
1257 #if (OS_MAX_EVENTS > 1u)
1258  INT16U i;
1259  OS_EVENT *pevent1;
1260  OS_EVENT *pevent2;
1261 
1262 
1263  OS_MemClr((INT8U *)&OSEventTbl[0], sizeof(OSEventTbl)); /* Clear the event table */
1264  pevent1 = &OSEventTbl[0];
1265  pevent2 = &OSEventTbl[1];
1266  for (i = 0u; i < (OS_MAX_EVENTS - 1u); i++) { /* Init. list of free EVENT control blocks */
1267  pevent1->OSEventType = OS_EVENT_TYPE_UNUSED;
1268  pevent1->OSEventPtr = pevent2;
1269 #if OS_EVENT_NAME_EN > 0u
1270  pevent1->OSEventName = (INT8U *)"?"; /* Unknown name */
1271 #endif
1272  pevent1++;
1273  pevent2++;
1274  }
1275  pevent1->OSEventType = OS_EVENT_TYPE_UNUSED;
1276  pevent1->OSEventPtr = (OS_EVENT *)0;
1277 #if OS_EVENT_NAME_EN > 0u
1278  pevent1->OSEventName = (INT8U *)"?"; /* Unknown name */
1279 #endif
1281 #else
1282  OSEventFreeList = &OSEventTbl[0]; /* Only have ONE event control block */
1285 #if OS_EVENT_NAME_EN > 0u
1286  OSEventFreeList->OSEventName = (INT8U *)"?"; /* Unknown name */
1287 #endif
1288 #endif
1289 #endif
1290 }

函数调用图:

这是这个函数的调用关系图:

static void OS_InitMisc ( void  )
static

在文件 os_core.c1305 行定义.

参考 OS_FALSE, OSCtxSwCtr, OSIdleCtr, OSIdleCtrMax, OSIdleCtrRun, OSIntNesting, OSLockNesting, OSRunning, OSStatRdy, OSTaskCtr , 以及 OSTime.

参考自 OSInit().

1306 {
1307 #if OS_TIME_GET_SET_EN > 0u
1308  OSTime = 0L; /* Clear the 32-bit system clock */
1309 #endif
1310 
1311  OSIntNesting = 0u; /* Clear the interrupt nesting counter */
1312  OSLockNesting = 0u; /* Clear the scheduling lock counter */
1313 
1314  OSTaskCtr = 0u; /* Clear the number of tasks */
1315 
1316  OSRunning = OS_FALSE; /* Indicate that multitasking not started */
1317 
1318  OSCtxSwCtr = 0u; /* Clear the context switch counter */
1319  OSIdleCtr = 0L; /* Clear the 32-bit idle counter */
1320 
1321 #if OS_TASK_STAT_EN > 0u
1322  OSIdleCtrRun = 0L;
1323  OSIdleCtrMax = 0L;
1324  OSStatRdy = OS_FALSE; /* Statistic task is not ready */
1325 #endif
1326 }

这是这个函数的调用关系图:

static void OS_InitRdyList ( void  )
static

在文件 os_core.c1341 行定义.

参考 OS_RDY_TBL_SIZE, OSPrioCur, OSPrioHighRdy, OSRdyGrp, OSRdyTbl, OSTCBCur , 以及 OSTCBHighRdy.

参考自 OSInit().

1342 {
1343  INT8U i;
1344 #if OS_LOWEST_PRIO <= 63u
1345  INT8U *prdytbl;
1346 #else
1347  INT16U *prdytbl;
1348 #endif
1349 
1350 
1351  OSRdyGrp = 0u; /* Clear the ready list */
1352  prdytbl = &OSRdyTbl[0];
1353  for (i = 0u; i < OS_RDY_TBL_SIZE; i++) {
1354  *prdytbl++ = 0u;
1355  }
1356 
1357  OSPrioCur = 0u;
1358  OSPrioHighRdy = 0u;
1359 
1360  OSTCBHighRdy = (OS_TCB *)0;
1361  OSTCBCur = (OS_TCB *)0;
1362 }

这是这个函数的调用关系图:

static void OS_InitTaskIdle ( void  )
static

在文件 os_core.c1378 行定义.

参考 OS_TASK_IDLE_ID, OS_TASK_IDLE_PRIO, OS_TASK_IDLE_STK_SIZE, OS_TASK_OPT_STK_CHK, OS_TASK_OPT_STK_CLR, OS_TaskIdle(), OSTaskCreate(), OSTaskCreateExt(), OSTaskIdleStk , 以及 OSTaskNameSet().

参考自 OSInit().

1379 {
1380 #if OS_TASK_NAME_EN > 0u
1381  INT8U err;
1382 #endif
1383 
1384 
1385 #if OS_TASK_CREATE_EXT_EN > 0u
1386  #if OS_STK_GROWTH == 1u
1388  (void *)0, /* No arguments passed to OS_TaskIdle() */
1389  &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1u],/* Set Top-Of-Stack */
1390  OS_TASK_IDLE_PRIO, /* Lowest priority level */
1392  &OSTaskIdleStk[0], /* Set Bottom-Of-Stack */
1394  (void *)0, /* No TCB extension */
1395  OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);/* Enable stack checking + clear stack */
1396  #else
1398  (void *)0, /* No arguments passed to OS_TaskIdle() */
1399  &OSTaskIdleStk[0], /* Set Top-Of-Stack */
1400  OS_TASK_IDLE_PRIO, /* Lowest priority level */
1402  &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1u],/* Set Bottom-Of-Stack */
1404  (void *)0, /* No TCB extension */
1405  OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);/* Enable stack checking + clear stack */
1406  #endif
1407 #else
1408  #if OS_STK_GROWTH == 1u
1409  (void)OSTaskCreate(OS_TaskIdle,
1410  (void *)0,
1411  &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1u],
1413  #else
1414  (void)OSTaskCreate(OS_TaskIdle,
1415  (void *)0,
1416  &OSTaskIdleStk[0],
1418  #endif
1419 #endif
1420 
1421 #if OS_TASK_NAME_EN > 0u
1422  OSTaskNameSet(OS_TASK_IDLE_PRIO, (INT8U *)"uC/OS-II Idle", &err);
1423 #endif
1424 }

函数调用图:

这是这个函数的调用关系图:

static void OS_InitTaskStat ( void  )
static

在文件 os_core.c1440 行定义.

参考 OS_TASK_OPT_STK_CHK, OS_TASK_OPT_STK_CLR, OS_TASK_STAT_ID, OS_TASK_STAT_PRIO, OS_TASK_STAT_STK_SIZE, OS_TaskStat(), OSTaskCreate(), OSTaskCreateExt(), OSTaskNameSet() , 以及 OSTaskStatStk.

参考自 OSInit().

1441 {
1442 #if OS_TASK_NAME_EN > 0u
1443  INT8U err;
1444 #endif
1445 
1446 
1447 #if OS_TASK_CREATE_EXT_EN > 0u
1448  #if OS_STK_GROWTH == 1u
1450  (void *)0, /* No args passed to OS_TaskStat()*/
1451  &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1u], /* Set Top-Of-Stack */
1452  OS_TASK_STAT_PRIO, /* One higher than the idle task */
1454  &OSTaskStatStk[0], /* Set Bottom-Of-Stack */
1456  (void *)0, /* No TCB extension */
1457  OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); /* Enable stack checking + clear */
1458  #else
1460  (void *)0, /* No args passed to OS_TaskStat()*/
1461  &OSTaskStatStk[0], /* Set Top-Of-Stack */
1462  OS_TASK_STAT_PRIO, /* One higher than the idle task */
1464  &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1u], /* Set Bottom-Of-Stack */
1466  (void *)0, /* No TCB extension */
1467  OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); /* Enable stack checking + clear */
1468  #endif
1469 #else
1470  #if OS_STK_GROWTH == 1u
1471  (void)OSTaskCreate(OS_TaskStat,
1472  (void *)0, /* No args passed to OS_TaskStat()*/
1473  &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1u], /* Set Top-Of-Stack */
1474  OS_TASK_STAT_PRIO); /* One higher than the idle task */
1475  #else
1476  (void)OSTaskCreate(OS_TaskStat,
1477  (void *)0, /* No args passed to OS_TaskStat()*/
1478  &OSTaskStatStk[0], /* Set Top-Of-Stack */
1479  OS_TASK_STAT_PRIO); /* One higher than the idle task */
1480  #endif
1481 #endif
1482 
1483 #if OS_TASK_NAME_EN > 0u
1484  OSTaskNameSet(OS_TASK_STAT_PRIO, (INT8U *)"uC/OS-II Stat", &err);
1485 #endif
1486 }

函数调用图:

这是这个函数的调用关系图:

static void OS_InitTCBList ( void  )
static

在文件 os_core.c1502 行定义.

参考 OS_MAX_TASKS, OS_MemClr(), OS_N_SYS_TASKS, OSTCBFreeList, OSTCBList, OS_TCB::OSTCBNext, OSTCBPrioTbl, OS_TCB::OSTCBTaskName , 以及 OSTCBTbl.

参考自 OSInit().

1503 {
1504  INT8U i;
1505  OS_TCB *ptcb1;
1506  OS_TCB *ptcb2;
1507 
1508 
1509  OS_MemClr((INT8U *)&OSTCBTbl[0], sizeof(OSTCBTbl)); /* Clear all the TCBs */
1510  OS_MemClr((INT8U *)&OSTCBPrioTbl[0], sizeof(OSTCBPrioTbl)); /* Clear the priority table */
1511  ptcb1 = &OSTCBTbl[0];
1512  ptcb2 = &OSTCBTbl[1];
1513  for (i = 0u; i < (OS_MAX_TASKS + OS_N_SYS_TASKS - 1u); i++) {/* Init. list of free TCBs */
1514  ptcb1->OSTCBNext = ptcb2;
1515 #if OS_TASK_NAME_EN > 0u
1516  ptcb1->OSTCBTaskName = (INT8U *)"?"; /* Unknown name */
1517 #endif
1518  ptcb1++;
1519  ptcb2++;
1520  }
1521  ptcb1->OSTCBNext = (OS_TCB *)0; /* Last OS_TCB */
1522 #if OS_TASK_NAME_EN > 0u
1523  ptcb1->OSTCBTaskName = (INT8U *)"?"; /* Unknown name */
1524 #endif
1525  OSTCBList = (OS_TCB *)0; /* TCB lists initializations */
1526  OSTCBFreeList = &OSTCBTbl[0];
1527 }

函数调用图:

这是这个函数的调用关系图:

static void OS_SchedNew ( void  )
static

在文件 os_core.c1651 行定义.

参考 OSPrioHighRdy, OSRdyGrp, OSRdyTbl , 以及 OSUnMapTbl.

参考自 OS_Sched(), OSIntExit() , 以及 OSStart().

1652 {
1653 #if OS_LOWEST_PRIO <= 63u /* See if we support up to 64 tasks */
1654  INT8U y;
1655 
1656 
1657  y = OSUnMapTbl[OSRdyGrp];
1658  OSPrioHighRdy = (INT8U)((y << 3u) + OSUnMapTbl[OSRdyTbl[y]]);
1659 #else /* We support up to 256 tasks */
1660  INT8U y;
1661  INT16U *ptbl;
1662 
1663 
1664  if ((OSRdyGrp & 0xFFu) != 0u) {
1665  y = OSUnMapTbl[OSRdyGrp & 0xFFu];
1666  } else {
1667  y = OSUnMapTbl[(OSRdyGrp >> 8u) & 0xFFu] + 8u;
1668  }
1669  ptbl = &OSRdyTbl[y];
1670  if ((*ptbl & 0xFFu) != 0u) {
1671  OSPrioHighRdy = (INT8U)((y << 4u) + OSUnMapTbl[(*ptbl & 0xFFu)]);
1672  } else {
1673  OSPrioHighRdy = (INT8U)((y << 4u) + OSUnMapTbl[(*ptbl >> 8u) & 0xFFu] + 8u);
1674  }
1675 #endif
1676 }

这是这个函数的调用关系图:

INT8U OSEventNameGet ( OS_EVENT pevent,
INT8U **  pname,
INT8U perr 
)

在文件 os_core.c108 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NAME_GET_ISR, OS_ERR_NONE, OS_ERR_PEVENT_NULL, OS_ERR_PNAME_NULL, OS_EVENT_TYPE_MBOX, OS_EVENT_TYPE_MUTEX, OS_EVENT_TYPE_Q, OS_EVENT_TYPE_SEM, OS_EXIT_CRITICAL, OS_StrLen(), OS_EVENT::OSEventName, OS_EVENT::OSEventType , 以及 OSIntNesting.

111 {
112  INT8U len;
113 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
114  OS_CPU_SR cpu_sr = 0u;
115 #endif
116 
117 
118 
119 #if OS_ARG_CHK_EN > 0u
120  if (perr == (INT8U *)0) { /* Validate 'perr' */
121  return (0u);
122  }
123  if (pevent == (OS_EVENT *)0) { /* Is 'pevent' a NULL pointer? */
124  *perr = OS_ERR_PEVENT_NULL;
125  return (0u);
126  }
127  if (pname == (INT8U **)0) { /* Is 'pname' a NULL pointer? */
128  *perr = OS_ERR_PNAME_NULL;
129  return (0u);
130  }
131 #endif
132  if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
133  *perr = OS_ERR_NAME_GET_ISR;
134  return (0u);
135  }
136  switch (pevent->OSEventType) {
137  case OS_EVENT_TYPE_SEM:
138  case OS_EVENT_TYPE_MUTEX:
139  case OS_EVENT_TYPE_MBOX:
140  case OS_EVENT_TYPE_Q:
141  break;
142 
143  default:
144  *perr = OS_ERR_EVENT_TYPE;
145  return (0u);
146  }
148  *pname = pevent->OSEventName;
149  len = OS_StrLen(*pname);
151  *perr = OS_ERR_NONE;
152  return (len);
153 }

函数调用图:

void OSEventNameSet ( OS_EVENT pevent,
INT8U pname,
INT8U perr 
)

在文件 os_core.c184 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NAME_SET_ISR, OS_ERR_NONE, OS_ERR_PEVENT_NULL, OS_ERR_PNAME_NULL, OS_EVENT_TYPE_MBOX, OS_EVENT_TYPE_MUTEX, OS_EVENT_TYPE_Q, OS_EVENT_TYPE_SEM, OS_EXIT_CRITICAL, OS_EVENT::OSEventName, OS_EVENT::OSEventType , 以及 OSIntNesting.

参考自 App_EventCreate() , 以及 OSTmr_Init().

187 {
188 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
189  OS_CPU_SR cpu_sr = 0u;
190 #endif
191 
192 
193 
194 #if OS_ARG_CHK_EN > 0u
195  if (perr == (INT8U *)0) { /* Validate 'perr' */
196  return;
197  }
198  if (pevent == (OS_EVENT *)0) { /* Is 'pevent' a NULL pointer? */
199  *perr = OS_ERR_PEVENT_NULL;
200  return;
201  }
202  if (pname == (INT8U *)0) { /* Is 'pname' a NULL pointer? */
203  *perr = OS_ERR_PNAME_NULL;
204  return;
205  }
206 #endif
207  if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
208  *perr = OS_ERR_NAME_SET_ISR;
209  return;
210  }
211  switch (pevent->OSEventType) {
212  case OS_EVENT_TYPE_SEM:
213  case OS_EVENT_TYPE_MUTEX:
214  case OS_EVENT_TYPE_MBOX:
215  case OS_EVENT_TYPE_Q:
216  break;
217 
218  default:
219  *perr = OS_ERR_EVENT_TYPE;
220  return;
221  }
223  pevent->OSEventName = pname;
225  *perr = OS_ERR_NONE;
226 }

这是这个函数的调用关系图:

INT16U OSEventPendMulti ( OS_EVENT **  pevents_pend,
OS_EVENT **  pevents_rdy,
void **  pmsgs_rdy,
INT32U  timeout,
INT8U perr 
)

在文件 os_core.c302 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NONE, OS_ERR_PEND_ABORT, OS_ERR_PEND_ISR, OS_ERR_PEND_LOCKED, OS_ERR_PEVENT_NULL, OS_ERR_TIMEOUT, OS_EVENT_TYPE_FLAG, OS_EVENT_TYPE_MBOX, OS_EVENT_TYPE_MUTEX, OS_EVENT_TYPE_Q, OS_EVENT_TYPE_SEM, OS_EventTaskRemoveMulti(), OS_EventTaskWaitMulti(), OS_EXIT_CRITICAL, OS_FALSE, OS_Sched(), OS_STAT_MBOX, OS_STAT_MULTI, OS_STAT_PEND_ABORT, OS_STAT_PEND_OK, OS_STAT_PEND_TO, OS_STAT_Q, OS_STAT_RDY, OS_STAT_SEM, OS_TRUE, OS_EVENT::OSEventCnt, OS_EVENT::OSEventPtr, OS_EVENT::OSEventType, OSIntNesting, OSLockNesting, OS_Q::OSQEnd, OS_Q::OSQEntries, OS_Q::OSQOut, OS_Q::OSQStart, OSTCBCur, OS_TCB::OSTCBDly, OS_TCB::OSTCBEventMultiPtr, OS_TCB::OSTCBEventPtr, OS_TCB::OSTCBMsg, OS_TCB::OSTCBStat , 以及 OS_TCB::OSTCBStatPend.

307 {
308  OS_EVENT **pevents;
309  OS_EVENT *pevent;
310 #if ((OS_Q_EN > 0u) && (OS_MAX_QS > 0u))
311  OS_Q *pq;
312 #endif
313  BOOLEAN events_rdy;
314  INT16U events_rdy_nbr;
315  INT8U events_stat;
316 #if (OS_CRITICAL_METHOD == 3u) /* Allocate storage for CPU status register */
317  OS_CPU_SR cpu_sr = 0u;
318 #endif
319 
320 
321 
322 #if (OS_ARG_CHK_EN > 0u)
323  if (perr == (INT8U *)0) { /* Validate 'perr' */
324  return (0u);
325  }
326  if (pevents_pend == (OS_EVENT **)0) { /* Validate 'pevents_pend' */
327  *perr = OS_ERR_PEVENT_NULL;
328  return (0u);
329  }
330  if (*pevents_pend == (OS_EVENT *)0) { /* Validate 'pevents_pend' */
331  *perr = OS_ERR_PEVENT_NULL;
332  return (0u);
333  }
334  if (pevents_rdy == (OS_EVENT **)0) { /* Validate 'pevents_rdy' */
335  *perr = OS_ERR_PEVENT_NULL;
336  return (0u);
337  }
338  if (pmsgs_rdy == (void **)0) { /* Validate 'pmsgs_rdy' */
339  *perr = OS_ERR_PEVENT_NULL;
340  return (0u);
341  }
342 #endif
343 
344  *pevents_rdy = (OS_EVENT *)0; /* Init array to NULL in case of errors */
345 
346  pevents = pevents_pend;
347  pevent = *pevents;
348  while (pevent != (OS_EVENT *)0) {
349  switch (pevent->OSEventType) { /* Validate event block types */
350 #if (OS_SEM_EN > 0u)
351  case OS_EVENT_TYPE_SEM:
352  break;
353 #endif
354 #if (OS_MBOX_EN > 0u)
355  case OS_EVENT_TYPE_MBOX:
356  break;
357 #endif
358 #if ((OS_Q_EN > 0u) && (OS_MAX_QS > 0u))
359  case OS_EVENT_TYPE_Q:
360  break;
361 #endif
362 
363  case OS_EVENT_TYPE_MUTEX:
364  case OS_EVENT_TYPE_FLAG:
365  default:
366  *perr = OS_ERR_EVENT_TYPE;
367  return (0u);
368  }
369  pevents++;
370  pevent = *pevents;
371  }
372 
373  if (OSIntNesting > 0u) { /* See if called from ISR ... */
374  *perr = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
375  return (0u);
376  }
377  if (OSLockNesting > 0u) { /* See if called with scheduler locked ... */
378  *perr = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
379  return (0u);
380  }
381 
382 /*$PAGE*/
384  events_rdy = OS_FALSE;
385  events_rdy_nbr = 0u;
386  events_stat = OS_STAT_RDY;
387  pevents = pevents_pend;
388  pevent = *pevents;
389  while (pevent != (OS_EVENT *)0) { /* See if any events already available */
390  switch (pevent->OSEventType) {
391 #if (OS_SEM_EN > 0u)
392  case OS_EVENT_TYPE_SEM:
393  if (pevent->OSEventCnt > 0u) { /* If semaphore count > 0, resource available; */
394  pevent->OSEventCnt--; /* ... decrement semaphore, ... */
395  *pevents_rdy++ = pevent; /* ... and return available semaphore event */
396  events_rdy = OS_TRUE;
397  *pmsgs_rdy++ = (void *)0; /* NO message returned for semaphores */
398  events_rdy_nbr++;
399 
400  } else {
401  events_stat |= OS_STAT_SEM; /* Configure multi-pend for semaphore events */
402  }
403  break;
404 #endif
405 
406 #if (OS_MBOX_EN > 0u)
407  case OS_EVENT_TYPE_MBOX:
408  if (pevent->OSEventPtr != (void *)0) { /* If mailbox NOT empty; ... */
409  /* ... return available message, ... */
410  *pmsgs_rdy++ = (void *)pevent->OSEventPtr;
411  pevent->OSEventPtr = (void *)0;
412  *pevents_rdy++ = pevent; /* ... and return available mailbox event */
413  events_rdy = OS_TRUE;
414  events_rdy_nbr++;
415 
416  } else {
417  events_stat |= OS_STAT_MBOX; /* Configure multi-pend for mailbox events */
418  }
419  break;
420 #endif
421 
422 #if ((OS_Q_EN > 0u) && (OS_MAX_QS > 0u))
423  case OS_EVENT_TYPE_Q:
424  pq = (OS_Q *)pevent->OSEventPtr;
425  if (pq->OSQEntries > 0u) { /* If queue NOT empty; ... */
426  /* ... return available message, ... */
427  *pmsgs_rdy++ = (void *)*pq->OSQOut++;
428  if (pq->OSQOut == pq->OSQEnd) { /* If OUT ptr at queue end, ... */
429  pq->OSQOut = pq->OSQStart; /* ... wrap to queue start */
430  }
431  pq->OSQEntries--; /* Update number of queue entries */
432  *pevents_rdy++ = pevent; /* ... and return available queue event */
433  events_rdy = OS_TRUE;
434  events_rdy_nbr++;
435 
436  } else {
437  events_stat |= OS_STAT_Q; /* Configure multi-pend for queue events */
438  }
439  break;
440 #endif
441 
442  case OS_EVENT_TYPE_MUTEX:
443  case OS_EVENT_TYPE_FLAG:
444  default:
446  *pevents_rdy = (OS_EVENT *)0; /* NULL terminate return event array */
447  *perr = OS_ERR_EVENT_TYPE;
448  return (events_rdy_nbr);
449  }
450  pevents++;
451  pevent = *pevents;
452  }
453 
454  if ( events_rdy == OS_TRUE) { /* Return any events already available */
455  *pevents_rdy = (OS_EVENT *)0; /* NULL terminate return event array */
457  *perr = OS_ERR_NONE;
458  return (events_rdy_nbr);
459  }
460 /*$PAGE*/
461  /* Otherwise, must wait until any event occurs */
462  OSTCBCur->OSTCBStat |= events_stat | /* Resource not available, ... */
463  OS_STAT_MULTI; /* ... pend on multiple events */
465  OSTCBCur->OSTCBDly = timeout; /* Store pend timeout in TCB */
466  OS_EventTaskWaitMulti(pevents_pend); /* Suspend task until events or timeout occurs */
467 
469  OS_Sched(); /* Find next highest priority task ready */
471 
472  switch (OSTCBCur->OSTCBStatPend) { /* Handle event posted, aborted, or timed-out */
473  case OS_STAT_PEND_OK:
474  case OS_STAT_PEND_ABORT:
475  pevent = OSTCBCur->OSTCBEventPtr;
476  if (pevent != (OS_EVENT *)0) { /* If task event ptr != NULL, ... */
477  *pevents_rdy++ = pevent; /* ... return available event ... */
478  *pevents_rdy = (OS_EVENT *)0; /* ... & NULL terminate return event array */
479  events_rdy_nbr++;
480 
481  } else { /* Else NO event available, handle as timeout */
483  OS_EventTaskRemoveMulti(OSTCBCur, pevents_pend);
484  }
485  break;
486 
487  case OS_STAT_PEND_TO: /* If events timed out, ... */
488  default: /* ... remove task from events' wait lists */
489  OS_EventTaskRemoveMulti(OSTCBCur, pevents_pend);
490  break;
491  }
492 
493  switch (OSTCBCur->OSTCBStatPend) {
494  case OS_STAT_PEND_OK:
495  switch (pevent->OSEventType) { /* Return event's message */
496 #if (OS_SEM_EN > 0u)
497  case OS_EVENT_TYPE_SEM:
498  *pmsgs_rdy++ = (void *)0; /* NO message returned for semaphores */
499  break;
500 #endif
501 
502 #if ((OS_MBOX_EN > 0u) || \
503  ((OS_Q_EN > 0u) && (OS_MAX_QS > 0u)))
504  case OS_EVENT_TYPE_MBOX:
505  case OS_EVENT_TYPE_Q:
506  *pmsgs_rdy++ = (void *)OSTCBCur->OSTCBMsg; /* Return received message */
507  break;
508 #endif
509 
510 #if 0 /* Unreachable code */
511  case OS_EVENT_TYPE_MUTEX:
512  case OS_EVENT_TYPE_FLAG:
513 #endif
514  default:
516  *pevents_rdy = (OS_EVENT *)0; /* NULL terminate return event array */
517  *perr = OS_ERR_EVENT_TYPE;
518  return (events_rdy_nbr);
519  }
520  *perr = OS_ERR_NONE;
521  break;
522 
523  case OS_STAT_PEND_ABORT:
524  *pmsgs_rdy++ = (void *)0; /* NO message returned for abort */
525  *perr = OS_ERR_PEND_ABORT; /* Indicate that event aborted */
526  break;
527 
528  case OS_STAT_PEND_TO:
529  default:
530  *pmsgs_rdy++ = (void *)0; /* NO message returned for timeout */
531  *perr = OS_ERR_TIMEOUT; /* Indicate that events timed out */
532  break;
533  }
534 
535  OSTCBCur->OSTCBStat = OS_STAT_RDY; /* Set task status to ready */
536  OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK; /* Clear pend status */
537  OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* Clear event pointers */
539 #if ((OS_MBOX_EN > 0u) || \
540  ((OS_Q_EN > 0u) && (OS_MAX_QS > 0u)))
541  OSTCBCur->OSTCBMsg = (void *)0; /* Clear task message */
542 #endif
544 
545  return (events_rdy_nbr);
546 }

函数调用图:

void OSInit ( void  )

在文件 os_core.c563 行定义.

参考 OS_FlagInit(), OS_InitEventList(), OS_InitMisc(), OS_InitRdyList(), OS_InitTaskIdle(), OS_InitTaskStat(), OS_InitTCBList(), OS_MemInit(), OS_QInit(), OSInitHookBegin(), OSInitHookEnd() , 以及 OSTmr_Init().

参考自 main().

564 {
565  OSInitHookBegin(); /* Call port specific initialization code */
566 
567  OS_InitMisc(); /* Initialize miscellaneous variables */
568 
569  OS_InitRdyList(); /* Initialize the Ready List */
570 
571  OS_InitTCBList(); /* Initialize the free list of OS_TCBs */
572 
573  OS_InitEventList(); /* Initialize the free list of OS_EVENTs */
574 
575 #if (OS_FLAG_EN > 0u) && (OS_MAX_FLAGS > 0u)
576  OS_FlagInit(); /* Initialize the event flag structures */
577 #endif
578 
579 #if (OS_MEM_EN > 0u) && (OS_MAX_MEM_PART > 0u)
580  OS_MemInit(); /* Initialize the memory manager */
581 #endif
582 
583 #if (OS_Q_EN > 0u) && (OS_MAX_QS > 0u)
584  OS_QInit(); /* Initialize the message queue structures */
585 #endif
586 
587  OS_InitTaskIdle(); /* Create the Idle Task */
588 #if OS_TASK_STAT_EN > 0u
589  OS_InitTaskStat(); /* Create the Statistic Task */
590 #endif
591 
592 #if OS_TMR_EN > 0u
593  OSTmr_Init(); /* Initialize the Timer Manager */
594 #endif
595 
596  OSInitHookEnd(); /* Call port specific init. code */
597 
598 #if OS_DEBUG_EN > 0u
599  OSDebugInit();
600 #endif
601 }

函数调用图:

这是这个函数的调用关系图:

void OSIntEnter ( void  )

在文件 os_core.c628 行定义.

参考 OS_TRUE, OSIntNesting , 以及 OSRunning.

参考自 BSP_IntHandler().

629 {
630  if (OSRunning == OS_TRUE) {
631  if (OSIntNesting < 255u) {
632  OSIntNesting++; /* Increment ISR nesting level */
633  }
634  }
635 }

这是这个函数的调用关系图:

void OSIntExit ( void  )

在文件 os_core.c656 行定义.

参考 OS_ENTER_CRITICAL, OS_EXIT_CRITICAL, OS_SchedNew(), OS_TRUE, OSCtxSwCtr, OSIntCtxSw(), OSIntNesting, OSLockNesting, OSPrioCur, OSPrioHighRdy, OSRunning, OS_TCB::OSTCBCtxSwCtr, OSTCBHighRdy , 以及 OSTCBPrioTbl.

参考自 BSP_IntHandler() , 以及 OS_CPU_SysTickHandler().

657 {
658 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
659  OS_CPU_SR cpu_sr = 0u;
660 #endif
661 
662 
663 
664  if (OSRunning == OS_TRUE) {
666  if (OSIntNesting > 0u) { /* Prevent OSIntNesting from wrapping */
667  OSIntNesting--;
668  }
669  if (OSIntNesting == 0u) { /* Reschedule only if all ISRs complete ... */
670  if (OSLockNesting == 0u) { /* ... and not locked. */
671  OS_SchedNew();
673  if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */
674 #if OS_TASK_PROFILE_EN > 0u
675  OSTCBHighRdy->OSTCBCtxSwCtr++; /* Inc. # of context switches to this task */
676 #endif
677  OSCtxSwCtr++; /* Keep track of the number of ctx switches */
678  OSIntCtxSw(); /* Perform interrupt level ctx switch */
679  }
680  }
681  }
683  }
684 }

函数调用图:

这是这个函数的调用关系图:

void OSSchedLock ( void  )

在文件 os_core.c703 行定义.

参考 OS_ENTER_CRITICAL, OS_EXIT_CRITICAL, OS_TRUE, OSIntNesting, OSLockNesting , 以及 OSRunning.

参考自 OSTmr_Task(), OSTmrCreate(), OSTmrDel(), OSTmrNameGet(), OSTmrRemainGet(), OSTmrStart(), OSTmrStateGet() , 以及 OSTmrStop().

704 {
705 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
706  OS_CPU_SR cpu_sr = 0u;
707 #endif
708 
709 
710 
711  if (OSRunning == OS_TRUE) { /* Make sure multitasking is running */
713  if (OSIntNesting == 0u) { /* Can't call from an ISR */
714  if (OSLockNesting < 255u) { /* Prevent OSLockNesting from wrapping back to 0 */
715  OSLockNesting++; /* Increment lock nesting level */
716  }
717  }
719  }
720 }

这是这个函数的调用关系图:

void OSSchedUnlock ( void  )

在文件 os_core.c740 行定义.

参考 OS_ENTER_CRITICAL, OS_EXIT_CRITICAL, OS_Sched(), OS_TRUE, OSIntNesting, OSLockNesting , 以及 OSRunning.

参考自 OSTmr_Task(), OSTmrCreate(), OSTmrDel(), OSTmrNameGet(), OSTmrRemainGet(), OSTmrStart(), OSTmrStateGet() , 以及 OSTmrStop().

741 {
742 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
743  OS_CPU_SR cpu_sr = 0u;
744 #endif
745 
746 
747 
748  if (OSRunning == OS_TRUE) { /* Make sure multitasking is running */
750  if (OSLockNesting > 0u) { /* Do not decrement if already 0 */
751  OSLockNesting--; /* Decrement lock nesting level */
752  if (OSLockNesting == 0u) { /* See if scheduler is enabled and ... */
753  if (OSIntNesting == 0u) { /* ... not in an ISR */
755  OS_Sched(); /* See if a HPT is ready */
756  } else {
758  }
759  } else {
761  }
762  } else {
764  }
765  }
766 }

函数调用图:

这是这个函数的调用关系图:

void OSStart ( void  )

在文件 os_core.c790 行定义.

参考 OS_FALSE, OS_SchedNew(), OSPrioCur, OSPrioHighRdy, OSRunning, OSStartHighRdy(), OSTCBCur, OSTCBHighRdy , 以及 OSTCBPrioTbl.

参考自 main().

791 {
792  if (OSRunning == OS_FALSE) {
793  OS_SchedNew(); /* Find highest priority's task priority number */
795  OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
797  OSStartHighRdy(); /* Execute target specific code to start task */
798  }
799 }

函数调用图:

这是这个函数的调用关系图:

void OSStatInit ( void  )

在文件 os_core.c822 行定义.

参考 OS_ENTER_CRITICAL, OS_EXIT_CRITICAL, OS_TICKS_PER_SEC, OS_TRUE, OSIdleCtr, OSIdleCtrMax, OSStatRdy , 以及 OSTimeDly().

参考自 App_TaskStart().

823 {
824 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
825  OS_CPU_SR cpu_sr = 0u;
826 #endif
827 
828 
829 
830  OSTimeDly(2); /* Synchronize with clock tick */
832  OSIdleCtr = 0uL; /* Clear idle counter */
834  OSTimeDly(OS_TICKS_PER_SEC / 10u); /* Determine MAX. idle counter value for 1/10 second */
836  OSIdleCtrMax = OSIdleCtr; /* Store maximum idle counter count in 1/10 second */
837  OSStatRdy = OS_TRUE;
839 }

函数调用图:

这是这个函数的调用关系图:

void OSTimeTick ( void  )

在文件 os_core.c856 行定义.

参考 OS_ENTER_CRITICAL, OS_EXIT_CRITICAL, OS_FALSE, OS_STAT_PEND_ANY, OS_STAT_PEND_OK, OS_STAT_PEND_TO, OS_STAT_RDY, OS_STAT_SUSPEND, OS_TASK_IDLE_PRIO, OS_TRUE, OSRdyGrp, OSRdyTbl, OSRunning, OS_TCB::OSTCBBitX, OS_TCB::OSTCBBitY, OS_TCB::OSTCBDly, OSTCBList, OS_TCB::OSTCBNext, OS_TCB::OSTCBPrio, OS_TCB::OSTCBStat, OS_TCB::OSTCBStatPend, OS_TCB::OSTCBY, OSTime , 以及 OSTimeTickHook().

参考自 OS_CPU_SysTickHandler().

857 {
858  OS_TCB *ptcb;
859 #if OS_TICK_STEP_EN > 0u
860  BOOLEAN step;
861 #endif
862 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
863  OS_CPU_SR cpu_sr = 0u;
864 #endif
865 
866 
867 
868 #if OS_TIME_TICK_HOOK_EN > 0u
869  OSTimeTickHook(); /* Call user definable hook */
870 #endif
871 #if OS_TIME_GET_SET_EN > 0u
872  OS_ENTER_CRITICAL(); /* Update the 32-bit tick counter */
873  OSTime++;
875 #endif
876  if (OSRunning == OS_TRUE) {
877 #if OS_TICK_STEP_EN > 0u
878  switch (OSTickStepState) { /* Determine whether we need to process a tick */
879  case OS_TICK_STEP_DIS: /* Yes, stepping is disabled */
880  step = OS_TRUE;
881  break;
882 
883  case OS_TICK_STEP_WAIT: /* No, waiting for uC/OS-View to set ... */
884  step = OS_FALSE; /* .. OSTickStepState to OS_TICK_STEP_ONCE */
885  break;
886 
887  case OS_TICK_STEP_ONCE: /* Yes, process tick once and wait for next ... */
888  step = OS_TRUE; /* ... step command from uC/OS-View */
889  OSTickStepState = OS_TICK_STEP_WAIT;
890  break;
891 
892  default: /* Invalid case, correct situation */
893  step = OS_TRUE;
894  OSTickStepState = OS_TICK_STEP_DIS;
895  break;
896  }
897  if (step == OS_FALSE) { /* Return if waiting for step command */
898  return;
899  }
900 #endif
901  ptcb = OSTCBList; /* Point at first TCB in TCB list */
902  while (ptcb->OSTCBPrio != OS_TASK_IDLE_PRIO) { /* Go through all TCBs in TCB list */
904  if (ptcb->OSTCBDly != 0u) { /* No, Delayed or waiting for event with TO */
905  ptcb->OSTCBDly--; /* Decrement nbr of ticks to end of delay */
906  if (ptcb->OSTCBDly == 0u) { /* Check for timeout */
907 
908  if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) != OS_STAT_RDY) {
909  ptcb->OSTCBStat &= ~(INT8U)OS_STAT_PEND_ANY; /* Yes, Clear status flag */
910  ptcb->OSTCBStatPend = OS_STAT_PEND_TO; /* Indicate PEND timeout */
911  } else {
913  }
914 
915  if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended? */
916  OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make ready */
917  OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
918  }
919  }
920  }
921  ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
923  }
924  }
925 }

函数调用图:

这是这个函数的调用关系图:

INT16U OSVersion ( void  )

在文件 os_core.c942 行定义.

参考 OS_VERSION.

参考自 App_DispScr_VersionTickRateCPU().

943 {
944  return (OS_VERSION);
945 }

这是这个函数的调用关系图:

void OS_Dummy ( void  )

在文件 os_core.c961 行定义.

参考自 OSTaskDel().

962 {
963 }

这是这个函数的调用关系图:

INT8U OS_EventTaskRdy ( OS_EVENT pevent,
void *  pmsg,
INT8U  msk,
INT8U  pend_stat 
)

在文件 os_core.c995 行定义.

参考 OS_EventTaskRemove(), OS_EventTaskRemoveMulti(), OS_STAT_RDY, OS_STAT_SUSPEND, OS_EVENT::OSEventGrp, OS_EVENT::OSEventTbl, OSRdyGrp, OSRdyTbl, OS_TCB::OSTCBBitX, OS_TCB::OSTCBBitY, OS_TCB::OSTCBDly, OS_TCB::OSTCBEventMultiPtr, OS_TCB::OSTCBEventPtr, OS_TCB::OSTCBMsg, OSTCBPrioTbl, OS_TCB::OSTCBStat, OS_TCB::OSTCBStatPend , 以及 OSUnMapTbl.

参考自 OSMboxDel(), OSMboxPendAbort(), OSMboxPost(), OSMboxPostOpt(), OSMutexDel(), OSMutexPost(), OSQDel(), OSQPendAbort(), OSQPost(), OSQPostFront(), OSQPostOpt(), OSSemDel(), OSSemPendAbort() , 以及 OSSemPost().

999 {
1000  OS_TCB *ptcb;
1001  INT8U y;
1002  INT8U x;
1003  INT8U prio;
1004 #if OS_LOWEST_PRIO > 63u
1005  INT16U *ptbl;
1006 #endif
1007 
1008 
1009 #if OS_LOWEST_PRIO <= 63u
1010  y = OSUnMapTbl[pevent->OSEventGrp]; /* Find HPT waiting for message */
1011  x = OSUnMapTbl[pevent->OSEventTbl[y]];
1012  prio = (INT8U)((y << 3u) + x); /* Find priority of task getting the msg */
1013 #else
1014  if ((pevent->OSEventGrp & 0xFFu) != 0u) { /* Find HPT waiting for message */
1015  y = OSUnMapTbl[ pevent->OSEventGrp & 0xFF];
1016  } else {
1017  y = OSUnMapTbl[(pevent->OSEventGrp >> 8u) & 0xFF] + 8u;
1018  }
1019  ptbl = &pevent->OSEventTbl[y];
1020  if ((*ptbl & 0xFF) != 0u) {
1021  x = OSUnMapTbl[*ptbl & 0xFF];
1022  } else {
1023  x = OSUnMapTbl[(*ptbl >> 8u) & 0xFF] + 8u;
1024  }
1025  prio = (INT8U)((y << 4u) + x); /* Find priority of task getting the msg */
1026 #endif
1027 
1028  ptcb = OSTCBPrioTbl[prio]; /* Point to this task's OS_TCB */
1029  ptcb->OSTCBDly = 0u; /* Prevent OSTimeTick() from readying task */
1030 #if ((OS_Q_EN > 0u) && (OS_MAX_QS > 0u)) || (OS_MBOX_EN > 0u)
1031  ptcb->OSTCBMsg = pmsg; /* Send message directly to waiting task */
1032 #else
1033  pmsg = pmsg; /* Prevent compiler warning if not used */
1034 #endif
1035  ptcb->OSTCBStat &= ~msk; /* Clear bit associated with event type */
1036  ptcb->OSTCBStatPend = pend_stat; /* Set pend status of post or abort */
1037  /* See if task is ready (could be susp'd) */
1038  if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) {
1039  OSRdyGrp |= ptcb->OSTCBBitY; /* Put task in the ready to run list */
1040  OSRdyTbl[y] |= ptcb->OSTCBBitX;
1041  }
1042 
1043  OS_EventTaskRemove(ptcb, pevent); /* Remove this task from event wait list */
1044 #if (OS_EVENT_MULTI_EN > 0u)
1045  if (ptcb->OSTCBEventMultiPtr != (OS_EVENT **)0) { /* Remove this task from events' wait lists */
1047  ptcb->OSTCBEventPtr = (OS_EVENT *)pevent;/* Return event as first multi-pend event ready*/
1048  }
1049 #endif
1050 
1051  return (prio);
1052 }

函数调用图:

这是这个函数的调用关系图:

void OS_EventTaskWait ( OS_EVENT pevent)

在文件 os_core.c1070 行定义.

参考 OS_EVENT::OSEventGrp, OS_EVENT::OSEventTbl, OSRdyGrp, OSRdyTbl, OS_TCB::OSTCBBitX, OS_TCB::OSTCBBitY, OSTCBCur, OS_TCB::OSTCBEventPtr , 以及 OS_TCB::OSTCBY.

参考自 OSMboxPend(), OSMutexPend(), OSQPend() , 以及 OSSemPend().

1071 {
1072  INT8U y;
1073 
1074 
1075  OSTCBCur->OSTCBEventPtr = pevent; /* Store ptr to ECB in TCB */
1076 
1077  pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX; /* Put task in waiting list */
1078  pevent->OSEventGrp |= OSTCBCur->OSTCBBitY;
1079 
1080  y = OSTCBCur->OSTCBY; /* Task no longer ready */
1081  OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
1082  if (OSRdyTbl[y] == 0u) {
1083  OSRdyGrp &= ~OSTCBCur->OSTCBBitY; /* Clear event grp bit if this was only task pending */
1084  }
1085 }

这是这个函数的调用关系图:

void OS_EventTaskWaitMulti ( OS_EVENT **  pevents_wait)

在文件 os_core.c1104 行定义.

参考 OS_EVENT::OSEventGrp, OS_EVENT::OSEventTbl, OSRdyGrp, OSRdyTbl, OS_TCB::OSTCBBitX, OS_TCB::OSTCBBitY, OSTCBCur, OS_TCB::OSTCBEventMultiPtr, OS_TCB::OSTCBEventPtr , 以及 OS_TCB::OSTCBY.

参考自 OSEventPendMulti().

1105 {
1106  OS_EVENT **pevents;
1107  OS_EVENT *pevent;
1108  INT8U y;
1109 
1110 
1112  OSTCBCur->OSTCBEventMultiPtr = (OS_EVENT **)pevents_wait; /* Store ptr to ECBs in TCB */
1113 
1114  pevents = pevents_wait;
1115  pevent = *pevents;
1116  while (pevent != (OS_EVENT *)0) { /* Put task in waiting lists */
1118  pevent->OSEventGrp |= OSTCBCur->OSTCBBitY;
1119  pevents++;
1120  pevent = *pevents;
1121  }
1122 
1123  y = OSTCBCur->OSTCBY; /* Task no longer ready */
1124  OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
1125  if (OSRdyTbl[y] == 0u) {
1126  OSRdyGrp &= ~OSTCBCur->OSTCBBitY; /* Clear event grp bit if this was only task pending */
1127  }
1128 }

这是这个函数的调用关系图:

void OS_EventTaskRemove ( OS_TCB ptcb,
OS_EVENT pevent 
)

在文件 os_core.c1147 行定义.

参考 OS_EVENT::OSEventGrp, OS_EVENT::OSEventTbl, OS_TCB::OSTCBBitX, OS_TCB::OSTCBBitY , 以及 OS_TCB::OSTCBY.

参考自 OS_EventTaskRdy(), OSMboxPend(), OSMutexPend(), OSQPend(), OSSemPend() , 以及 OSTaskDel().

1149 {
1150  INT8U y;
1151 
1152 
1153  y = ptcb->OSTCBY;
1154  pevent->OSEventTbl[y] &= ~ptcb->OSTCBBitX; /* Remove task from wait list */
1155  if (pevent->OSEventTbl[y] == 0u) {
1156  pevent->OSEventGrp &= ~ptcb->OSTCBBitY;
1157  }
1158 }

这是这个函数的调用关系图:

void OS_EventTaskRemoveMulti ( OS_TCB ptcb,
OS_EVENT **  pevents_multi 
)

在文件 os_core.c1177 行定义.

参考 OS_EVENT::OSEventGrp, OS_EVENT::OSEventTbl, OS_TCB::OSTCBBitX, OS_TCB::OSTCBBitY , 以及 OS_TCB::OSTCBY.

参考自 OS_EventTaskRdy(), OSEventPendMulti() , 以及 OSTaskDel().

1179 {
1180  OS_EVENT **pevents;
1181  OS_EVENT *pevent;
1182  INT8U y;
1183 #if (OS_LOWEST_PRIO <= 63u)
1184  INT8U bity;
1185  INT8U bitx;
1186 #else
1187  INT16U bity;
1188  INT16U bitx;
1189 #endif
1190 
1191 
1192  y = ptcb->OSTCBY;
1193  bity = ptcb->OSTCBBitY;
1194  bitx = ptcb->OSTCBBitX;
1195  pevents = pevents_multi;
1196  pevent = *pevents;
1197  while (pevent != (OS_EVENT *)0) { /* Remove task from all events' wait lists */
1198  pevent->OSEventTbl[y] &= ~bitx;
1199  if (pevent->OSEventTbl[y] == 0u) {
1200  pevent->OSEventGrp &= ~bity;
1201  }
1202  pevents++;
1203  pevent = *pevents;
1204  }
1205 }

这是这个函数的调用关系图:

void OS_EventWaitListInit ( OS_EVENT pevent)

在文件 os_core.c1222 行定义.

参考 OS_EVENT_TBL_SIZE, OS_EVENT::OSEventGrp , 以及 OS_EVENT::OSEventTbl.

参考自 OSMboxCreate(), OSMutexCreate(), OSQCreate() , 以及 OSSemCreate().

1223 {
1224 #if OS_LOWEST_PRIO <= 63u
1225  INT8U *ptbl;
1226 #else
1227  INT16U *ptbl;
1228 #endif
1229  INT8U i;
1230 
1231 
1232  pevent->OSEventGrp = 0u; /* No task waiting on event */
1233  ptbl = &pevent->OSEventTbl[0];
1234 
1235  for (i = 0u; i < OS_EVENT_TBL_SIZE; i++) {
1236  *ptbl++ = 0u;
1237  }
1238 }

这是这个函数的调用关系图:

void OS_MemClr ( INT8U pdest,
INT16U  size 
)

在文件 os_core.c1549 行定义.

参考自 OS_FlagInit(), OS_InitEventList(), OS_InitTCBList(), OS_MemInit(), OS_QInit() , 以及 OSTmr_Init().

1551 {
1552  while (size > 0u) {
1553  *pdest++ = (INT8U)0;
1554  size--;
1555  }
1556 }

这是这个函数的调用关系图:

void OS_MemCopy ( INT8U pdest,
INT8U psrc,
INT16U  size 
)

在文件 os_core.c1582 行定义.

参考自 OSTaskQuery().

1585 {
1586  while (size > 0u) {
1587  *pdest++ = *psrc++;
1588  size--;
1589  }
1590 }

这是这个函数的调用关系图:

void OS_Sched ( void  )

在文件 os_core.c1609 行定义.

参考 OS_ENTER_CRITICAL, OS_EXIT_CRITICAL, OS_SchedNew(), OS_TASK_SW, OSCtxSwCtr, OSIntNesting, OSLockNesting, OSPrioCur, OSPrioHighRdy, OS_TCB::OSTCBCtxSwCtr, OSTCBHighRdy , 以及 OSTCBPrioTbl.

参考自 OSEventPendMulti(), OSFlagDel(), OSFlagPend(), OSFlagPost(), OSMboxDel(), OSMboxPend(), OSMboxPendAbort(), OSMboxPost(), OSMboxPostOpt(), OSMutexDel(), OSMutexPend(), OSMutexPost(), OSQDel(), OSQPend(), OSQPendAbort(), OSQPost(), OSQPostFront(), OSQPostOpt(), OSSchedUnlock(), OSSemDel(), OSSemPend(), OSSemPendAbort(), OSSemPost(), OSTaskChangePrio(), OSTaskCreate(), OSTaskCreateExt(), OSTaskDel(), OSTaskResume(), OSTaskSuspend(), OSTimeDly() , 以及 OSTimeDlyResume().

1610 {
1611 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
1612  OS_CPU_SR cpu_sr = 0u;
1613 #endif
1614 
1615 
1616 
1618  if (OSIntNesting == 0u) { /* Schedule only if all ISRs done and ... */
1619  if (OSLockNesting == 0u) { /* ... scheduler is not locked */
1620  OS_SchedNew();
1622  if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */
1623 #if OS_TASK_PROFILE_EN > 0u
1624  OSTCBHighRdy->OSTCBCtxSwCtr++; /* Inc. # of context switches to this task */
1625 #endif
1626  OSCtxSwCtr++; /* Increment context switch counter */
1627  OS_TASK_SW(); /* Perform a context switch */
1628  }
1629  }
1630  }
1631  OS_EXIT_CRITICAL();
1632 }

函数调用图:

这是这个函数的调用关系图:

INT8U OS_StrLen ( INT8U psrc)

在文件 os_core.c1696 行定义.

参考 OS_ASCII_NUL.

参考自 OSEventNameGet(), OSFlagNameGet(), OSMemNameGet(), OSTaskNameGet() , 以及 OSTmrNameGet().

1697 {
1698  INT8U len;
1699 
1700 
1701  len = 0u;
1702  while (*psrc != OS_ASCII_NUL) {
1703  psrc++;
1704  len++;
1705  }
1706  return (len);
1707 }

这是这个函数的调用关系图:

void OS_TaskIdle ( void *  p_arg)

在文件 os_core.c1731 行定义.

参考 OS_ENTER_CRITICAL, OS_EXIT_CRITICAL, OSIdleCtr , 以及 OSTaskIdleHook().

参考自 OS_InitTaskIdle().

1732 {
1733 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
1734  OS_CPU_SR cpu_sr = 0u;
1735 #endif
1736 
1737 
1738 
1739  (void)p_arg; /* Prevent compiler warning for not using 'p_arg' */
1740  for (;;) {
1742  OSIdleCtr++;
1743  OS_EXIT_CRITICAL();
1744  OSTaskIdleHook(); /* Call user definable HOOK */
1745  }
1746 }

函数调用图:

这是这个函数的调用关系图:

void OS_TaskStat ( void *  p_arg)

在文件 os_core.c1773 行定义.

参考 OS_ENTER_CRITICAL, OS_EXIT_CRITICAL, OS_FALSE, OS_PRIO_SELF, OS_TaskStatStkChk(), OS_TICKS_PER_SEC, OSCPUUsage, OSIdleCtr, OSIdleCtrMax, OSIdleCtrRun, OSStatRdy, OSTaskStatHook(), OSTaskSuspend() , 以及 OSTimeDly().

参考自 OS_InitTaskStat().

1774 {
1775 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
1776  OS_CPU_SR cpu_sr = 0u;
1777 #endif
1778 
1779 
1780 
1781  (void)p_arg; /* Prevent compiler warning for not using 'p_arg' */
1782  while (OSStatRdy == OS_FALSE) {
1783  OSTimeDly(2u * OS_TICKS_PER_SEC / 10u); /* Wait until statistic task is ready */
1784  }
1785  OSIdleCtrMax /= 100L;
1786  if (OSIdleCtrMax == 0L) {
1787  OSCPUUsage = 0u;
1788 #if OS_TASK_SUSPEND_EN > 0u
1789  (void)OSTaskSuspend(OS_PRIO_SELF);
1790 #else
1791  for (;;) {
1793  }
1794 #endif
1795  }
1796  for (;;) {
1798  OSIdleCtrRun = OSIdleCtr; /* Obtain the of the idle counter for the past second */
1799  OSIdleCtr = 0L; /* Reset the idle counter for the next second */
1800  OS_EXIT_CRITICAL();
1801  OSCPUUsage = (INT8U)(100L - OSIdleCtrRun / OSIdleCtrMax);
1802  OSTaskStatHook(); /* Invoke user definable hook */
1803 #if (OS_TASK_STAT_STK_CHK_EN > 0u) && (OS_TASK_CREATE_EXT_EN > 0u)
1804  OS_TaskStatStkChk(); /* Check the stacks for each task */
1805 #endif
1806  OSTimeDly(OS_TICKS_PER_SEC / 10u); /* Accumulate OSIdleCtr for the next 1/10 second */
1807  }
1808 }

函数调用图:

这是这个函数的调用关系图:

void OS_TaskStatStkChk ( void  )

在文件 os_core.c1824 行定义.

参考 OS_ERR_NONE, OS_TASK_IDLE_PRIO, OS_TCB_RESERVED, OSTaskStkChk(), OSTCBPrioTbl, OS_TCB::OSTCBStkBase, OS_TCB::OSTCBStkBottom, OS_TCB::OSTCBStkSize, OS_TCB::OSTCBStkUsed , 以及 OS_STK_DATA::OSUsed.

参考自 OS_TaskStat().

1825 {
1826  OS_TCB *ptcb;
1827  OS_STK_DATA stk_data;
1828  INT8U err;
1829  INT8U prio;
1830 
1831 
1832  for (prio = 0u; prio <= OS_TASK_IDLE_PRIO; prio++) {
1833  err = OSTaskStkChk(prio, &stk_data);
1834  if (err == OS_ERR_NONE) {
1835  ptcb = OSTCBPrioTbl[prio];
1836  if (ptcb != (OS_TCB *)0) { /* Make sure task 'ptcb' is ... */
1837  if (ptcb != OS_TCB_RESERVED) { /* ... still valid. */
1838 #if OS_TASK_PROFILE_EN > 0u
1839  #if OS_STK_GROWTH == 1u
1840  ptcb->OSTCBStkBase = ptcb->OSTCBStkBottom + ptcb->OSTCBStkSize;
1841  #else
1842  ptcb->OSTCBStkBase = ptcb->OSTCBStkBottom - ptcb->OSTCBStkSize;
1843  #endif
1844  ptcb->OSTCBStkUsed = stk_data.OSUsed; /* Store the number of bytes used */
1845 #endif
1846  }
1847  }
1848  }
1849  }
1850 }

函数调用图:

这是这个函数的调用关系图:

INT8U OS_TCBInit ( INT8U  prio,
OS_STK ptos,
OS_STK pbos,
INT16U  id,
INT32U  stk_size,
void *  pext,
INT16U  opt 
)

在文件 os_core.c1896 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_NONE, OS_ERR_TASK_NO_MORE_TCB, OS_EXIT_CRITICAL, OS_STAT_PEND_OK, OS_STAT_RDY, OS_TASK_REG_TBL_SIZE, OSRdyGrp, OSRdyTbl, OSTaskCreateHook(), OSTaskCtr, OS_TCB::OSTCBBitX, OS_TCB::OSTCBBitY, OS_TCB::OSTCBCtxSwCtr, OS_TCB::OSTCBCyclesStart, OS_TCB::OSTCBCyclesTot, OS_TCB::OSTCBDelReq, OS_TCB::OSTCBDly, OS_TCB::OSTCBEventMultiPtr, OS_TCB::OSTCBEventPtr, OS_TCB::OSTCBExtPtr, OS_TCB::OSTCBFlagNode, OSTCBFreeList, OS_TCB::OSTCBId, OSTCBInitHook(), OSTCBList, OS_TCB::OSTCBMsg, OS_TCB::OSTCBNext, OS_TCB::OSTCBOpt, OS_TCB::OSTCBPrev, OS_TCB::OSTCBPrio, OSTCBPrioTbl, OS_TCB::OSTCBRegTbl, OS_TCB::OSTCBStat, OS_TCB::OSTCBStatPend, OS_TCB::OSTCBStkBase, OS_TCB::OSTCBStkBottom, OS_TCB::OSTCBStkPtr, OS_TCB::OSTCBStkSize, OS_TCB::OSTCBStkUsed, OS_TCB::OSTCBTaskName, OS_TCB::OSTCBX , 以及 OS_TCB::OSTCBY.

参考自 OSTaskCreate() , 以及 OSTaskCreateExt().

1903 {
1904  OS_TCB *ptcb;
1905 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
1906  OS_CPU_SR cpu_sr = 0u;
1907 #endif
1908 #if OS_TASK_REG_TBL_SIZE > 0u
1909  INT8U i;
1910 #endif
1911 
1912 
1914  ptcb = OSTCBFreeList; /* Get a free TCB from the free TCB list */
1915  if (ptcb != (OS_TCB *)0) {
1916  OSTCBFreeList = ptcb->OSTCBNext; /* Update pointer to free TCB list */
1917  OS_EXIT_CRITICAL();
1918  ptcb->OSTCBStkPtr = ptos; /* Load Stack pointer in TCB */
1919  ptcb->OSTCBPrio = prio; /* Load task priority into TCB */
1920  ptcb->OSTCBStat = OS_STAT_RDY; /* Task is ready to run */
1921  ptcb->OSTCBStatPend = OS_STAT_PEND_OK; /* Clear pend status */
1922  ptcb->OSTCBDly = 0u; /* Task is not delayed */
1923 
1924 #if OS_TASK_CREATE_EXT_EN > 0u
1925  ptcb->OSTCBExtPtr = pext; /* Store pointer to TCB extension */
1926  ptcb->OSTCBStkSize = stk_size; /* Store stack size */
1927  ptcb->OSTCBStkBottom = pbos; /* Store pointer to bottom of stack */
1928  ptcb->OSTCBOpt = opt; /* Store task options */
1929  ptcb->OSTCBId = id; /* Store task ID */
1930 #else
1931  pext = pext; /* Prevent compiler warning if not used */
1932  stk_size = stk_size;
1933  pbos = pbos;
1934  opt = opt;
1935  id = id;
1936 #endif
1937 
1938 #if OS_TASK_DEL_EN > 0u
1939  ptcb->OSTCBDelReq = OS_ERR_NONE;
1940 #endif
1941 
1942 #if OS_LOWEST_PRIO <= 63u
1943  ptcb->OSTCBY = (INT8U)(prio >> 3u); /* Pre-compute X, Y, BitX and BitY */
1944  ptcb->OSTCBX = (INT8U)(prio & 0x07u);
1945  ptcb->OSTCBBitY = (INT8U)(1u << ptcb->OSTCBY);
1946  ptcb->OSTCBBitX = (INT8U)(1u << ptcb->OSTCBX);
1947 #else
1948  ptcb->OSTCBY = (INT8U)((prio >> 4u) & 0xFFu); /* Pre-compute X, Y, BitX and BitY */
1949  ptcb->OSTCBX = (INT8U) (prio & 0x0F);
1950  ptcb->OSTCBBitY = (INT16U)(1u << ptcb->OSTCBY);
1951  ptcb->OSTCBBitX = (INT16U)(1u << ptcb->OSTCBX);
1952 #endif
1953 
1954 #if (OS_EVENT_EN)
1955  ptcb->OSTCBEventPtr = (OS_EVENT *)0; /* Task is not pending on an event */
1956 #if (OS_EVENT_MULTI_EN > 0u)
1957  ptcb->OSTCBEventMultiPtr = (OS_EVENT **)0; /* Task is not pending on any events */
1958 #endif
1959 #endif
1960 
1961 #if (OS_FLAG_EN > 0u) && (OS_MAX_FLAGS > 0u) && (OS_TASK_DEL_EN > 0u)
1962  ptcb->OSTCBFlagNode = (OS_FLAG_NODE *)0; /* Task is not pending on an event flag */
1963 #endif
1964 
1965 #if (OS_MBOX_EN > 0u) || ((OS_Q_EN > 0u) && (OS_MAX_QS > 0u))
1966  ptcb->OSTCBMsg = (void *)0; /* No message received */
1967 #endif
1968 
1969 #if OS_TASK_PROFILE_EN > 0u
1970  ptcb->OSTCBCtxSwCtr = 0L; /* Initialize profiling variables */
1971  ptcb->OSTCBCyclesStart = 0L;
1972  ptcb->OSTCBCyclesTot = 0L;
1973  ptcb->OSTCBStkBase = (OS_STK *)0;
1974  ptcb->OSTCBStkUsed = 0L;
1975 #endif
1976 
1977 #if OS_TASK_NAME_EN > 0u
1978  ptcb->OSTCBTaskName = (INT8U *)"?";
1979 #endif
1980 
1981 #if OS_TASK_REG_TBL_SIZE > 0u /* Initialize the task variables */
1982  for (i = 0u; i < OS_TASK_REG_TBL_SIZE; i++) {
1983  ptcb->OSTCBRegTbl[i] = 0u;
1984  }
1985 #endif
1986 
1987  OSTCBInitHook(ptcb);
1988 
1989  OSTaskCreateHook(ptcb); /* Call user defined hook */
1990 
1992  OSTCBPrioTbl[prio] = ptcb;
1993  ptcb->OSTCBNext = OSTCBList; /* Link into TCB chain */
1994  ptcb->OSTCBPrev = (OS_TCB *)0;
1995  if (OSTCBList != (OS_TCB *)0) {
1996  OSTCBList->OSTCBPrev = ptcb;
1997  }
1998  OSTCBList = ptcb;
1999  OSRdyGrp |= ptcb->OSTCBBitY; /* Make task ready to run */
2000  OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
2001  OSTaskCtr++; /* Increment the #tasks counter */
2002  OS_EXIT_CRITICAL();
2003  return (OS_ERR_NONE);
2004  }
2005  OS_EXIT_CRITICAL();
2006  return (OS_ERR_TASK_NO_MORE_TCB);
2007 }

函数调用图:

这是这个函数的调用关系图:

变量说明

INT8U const OSUnMapTbl[256]
初始值:
= {
0, 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, 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,
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, 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
}

在文件 os_core.c38 行定义.

参考自 OS_EventTaskRdy() , 以及 OS_SchedNew().