33 #define MICRIUM_SOURCE
36 #ifdef VSC_INCLUDE_SOURCE_FILE_NAMES
37 const CPU_CHAR *os_core__c =
"$Id: $";
62 #ifdef OS_SAFETY_CRITICAL
63 if (p_err == (
OS_ERR *)0) {
64 OS_SAFETY_CRITICAL_EXCEPTION();
84 #if OS_CFG_SCHED_LOCK_TIME_MEAS_EN > 0u
85 OSSchedLockTimeBegin = (
CPU_TS)0;
86 OSSchedLockTimeMax = (
CPU_TS)0;
87 OSSchedLockTimeMaxCur = (
CPU_TS)0;
90 #ifdef OS_SAFETY_CRITICAL_IEC61508
94 #if OS_CFG_SCHED_ROUND_ROBIN_EN > 0u
111 #if OS_CFG_APP_HOOKS_EN > 0u
112 OS_AppTaskCreateHookPtr = (OS_APP_HOOK_TCB )0;
113 OS_AppTaskDelHookPtr = (OS_APP_HOOK_TCB )0;
114 OS_AppTaskReturnHookPtr = (OS_APP_HOOK_TCB )0;
116 OS_AppIdleTaskHookPtr = (OS_APP_HOOK_VOID)0;
117 OS_AppStatTaskHookPtr = (OS_APP_HOOK_VOID)0;
118 OS_AppTaskSwHookPtr = (OS_APP_HOOK_VOID)0;
119 OS_AppTimeTickHookPtr = (OS_APP_HOOK_VOID)0;
122 #if OS_CFG_TASK_REG_TBL_SIZE > 0u
131 #if OS_CFG_FLAG_EN > 0u
139 #if OS_CFG_MEM_EN > 0u
155 #if OS_CFG_MUTEX_EN > 0u
171 #if OS_CFG_SEM_EN > 0u
179 #if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u)
193 #if OS_CFG_ISR_POST_DEFERRED_EN > 0u
194 OS_IntQTaskInit(p_err);
213 #if OS_CFG_STAT_TASK_EN > 0u
221 #if OS_CFG_TMR_EN > 0u
229 #if OS_CFG_DBG_EN > 0u
333 #if OS_CFG_TASK_PROFILE_EN > 0u
338 #if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u)
362 #ifdef OS_SAFETY_CRITICAL_IEC61508
363 void OSSafetyCriticalStart (
void)
365 OSSafetyCriticalStartFlag =
DEF_TRUE;
409 #if OS_CFG_TASK_PROFILE_EN > 0u
414 #if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u)
450 #ifdef OS_SAFETY_CRITICAL
451 if (p_err == (
OS_ERR *)0) {
452 OS_SAFETY_CRITICAL_EXCEPTION();
457 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
476 #if OS_CFG_SCHED_LOCK_TIME_MEAS_EN > 0u
477 OS_SchedLockTimeMeasStart();
511 #ifdef OS_SAFETY_CRITICAL
512 if (p_err == (
OS_ERR *)0) {
513 OS_SAFETY_CRITICAL_EXCEPTION();
518 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
543 #if OS_CFG_SCHED_LOCK_TIME_MEAS_EN > 0u
544 OS_SchedLockTimeMeasStop();
571 #if OS_CFG_SCHED_ROUND_ROBIN_EN > 0u
580 #ifdef OS_SAFETY_CRITICAL
581 if (p_err == (
OS_ERR *)0) {
582 OS_SAFETY_CRITICAL_EXCEPTION();
594 if (dflt_time_quanta > (
OS_TICK)0) {
595 OSSchedRoundRobinDfltTimeQuanta = dflt_time_quanta;
625 #if OS_CFG_SCHED_ROUND_ROBIN_EN > 0u
626 void OSSchedRoundRobinYield (
OS_ERR *p_err)
628 OS_RDY_LIST *p_rdy_list;
634 #ifdef OS_SAFETY_CRITICAL
635 if (p_err == (
OS_ERR *)0) {
636 OS_SAFETY_CRITICAL_EXCEPTION();
641 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
653 if (OSSchedRoundRobinEn !=
DEF_TRUE) {
667 p_tcb = p_rdy_list->HeadPtr;
668 if (p_tcb->TimeQuanta == (
OS_TICK)0) {
669 p_tcb->TimeQuantaCtr = OSSchedRoundRobinDfltTimeQuanta;
671 p_tcb->TimeQuantaCtr = p_tcb->TimeQuanta;
708 #ifdef OS_SAFETY_CRITICAL
709 if (p_err == (
OS_ERR *)0) {
710 OS_SAFETY_CRITICAL_EXCEPTION();
747 #ifdef OS_SAFETY_CRITICAL
748 if (p_err == (
OS_ERR *)0) {
749 OS_SAFETY_CRITICAL_EXCEPTION();
792 #if OS_CFG_STAT_TASK_EN > 0u
818 #ifdef OS_SAFETY_CRITICAL
819 if (p_err == (
OS_ERR *)0) {
820 OS_SAFETY_CRITICAL_EXCEPTION();
828 (
CPU_CHAR *)((
void *)
"uC/OS-III Idle Task"),
878 OS_PEND_LIST *p_pend_list;
888 if (p_obj != (OS_PEND_OBJ *)0) {
889 p_pend_list = &p_obj->PendList;
890 p_pend_data->PendObjPtr = p_obj;
892 (OS_PEND_DATA *)p_pend_data,
900 #if OS_CFG_DBG_EN > 0u
901 OS_PendDbgNameAdd(p_obj,
931 switch (p_tcb->TaskState) {
946 p_tcb->MsgPtr = (
void *)0;
950 if (p_obj != (OS_PEND_OBJ *)0) {
967 p_tcb->MsgPtr = (
void *)0;
971 if (p_obj != (OS_PEND_OBJ *)0) {
1038 OS_PEND_DATA *p_pend_data;
1042 p_pend_data = p_tcb->PendDataTblPtr;
1043 n_pend_list = p_tcb->PendDataTblEntries;
1046 if (p_obj == p_pend_data->PendObjPtr) {
1047 p_pend_data->RdyObjPtr = p_obj;
1048 p_pend_data->RdyTS = ts;
1099 OS_PEND_DATA *p_pend_data_tbl,
1106 p_tcb->PendDataTblEntries = tbl_size;
1107 p_tcb->PendDataTblPtr = p_pend_data_tbl;
1109 for (i = 0u; i < tbl_size; i++) {
1110 p_pend_data_tbl->NextPtr = (OS_PEND_DATA *)0;
1111 p_pend_data_tbl->PrevPtr = (OS_PEND_DATA *)0;
1112 p_pend_data_tbl->RdyObjPtr = (OS_PEND_OBJ *)0;
1113 p_pend_data_tbl->RdyMsgPtr = (
void *)0;
1115 p_pend_data_tbl->RdyTS = (
CPU_TS )0;
1116 p_pend_data_tbl->TCBPtr = p_tcb;
1140 #if OS_CFG_DBG_EN > 0u
1141 void OS_PendDbgNameAdd (OS_PEND_OBJ *p_obj,
1144 OS_PEND_LIST *p_pend_list;
1145 OS_PEND_DATA *p_pend_data;
1149 if (p_obj != (OS_PEND_OBJ *)0) {
1150 p_tcb->DbgNamePtr = p_obj->NamePtr;
1151 p_pend_list = &p_obj->PendList;
1152 p_pend_data = p_pend_list->HeadPtr;
1153 p_tcb1 = p_pend_data->TCBPtr;
1154 p_obj->DbgNamePtr = p_tcb1->NamePtr;
1156 switch (p_tcb->PendOn) {
1158 p_tcb->DbgNamePtr = (
CPU_CHAR *)((
void *)
"Task Q");
1162 p_tcb->DbgNamePtr = (
CPU_CHAR *)((
void *)
"Task Sem");
1166 p_tcb->DbgNamePtr = (
CPU_CHAR *)((
void *)
" ");
1174 void OS_PendDbgNameRemove (OS_PEND_OBJ *p_obj,
1177 OS_PEND_LIST *p_pend_list;
1178 OS_PEND_DATA *p_pend_data;
1182 p_tcb->DbgNamePtr = (
CPU_CHAR *)((
void *)
" ");
1183 p_pend_list = &p_obj->PendList;
1184 p_pend_data = p_pend_list->HeadPtr;
1185 if (p_pend_data != (OS_PEND_DATA *)0) {
1186 p_tcb1 = p_pend_data->TCBPtr;
1187 p_obj->DbgNamePtr = p_tcb1->NamePtr;
1189 p_obj->DbgNamePtr = (
CPU_CHAR *)((
void *)
" ");
1280 OS_PEND_DATA *p_pend_data;
1281 OS_PEND_LIST *p_pend_list;
1285 p_tcb->Prio = prio_new;
1286 p_pend_data = p_tcb->PendDataTblPtr;
1287 n_pend_list = p_tcb->PendDataTblEntries;
1289 while (n_pend_list > 0u) {
1290 p_obj = p_pend_data->PendObjPtr;
1291 p_pend_list = &p_obj->PendList;
1292 if (p_pend_list->NbrEntries > 1u) {
1321 p_pend_list->HeadPtr = (OS_PEND_DATA *)0;
1322 p_pend_list->TailPtr = (OS_PEND_DATA *)0;
1374 OS_PEND_DATA *p_pend_data)
1376 OS_PEND_DATA *p_pend_data_next;
1380 p_pend_list->NbrEntries++;
1381 p_pend_data->NextPtr = p_pend_list->HeadPtr;
1382 p_pend_data->PrevPtr = (OS_PEND_DATA *)0;
1383 p_pend_data_next = p_pend_list->HeadPtr;
1384 if (p_pend_data_next != (OS_PEND_DATA *)0) {
1385 p_pend_data_next->PrevPtr = p_pend_data;
1387 p_pend_list->HeadPtr = p_pend_data;
1388 if (p_pend_list->NbrEntries == 1u) {
1389 p_pend_list->TailPtr = p_pend_data;
1462 OS_PEND_DATA *p_pend_data)
1467 OS_PEND_DATA *p_pend_data_prev;
1468 OS_PEND_DATA *p_pend_data_next;
1472 p_tcb = p_pend_data->TCBPtr;
1474 if (p_pend_list->NbrEntries == (
OS_OBJ_QTY)0) {
1476 p_pend_data->NextPtr = (OS_PEND_DATA *)0;
1477 p_pend_data->PrevPtr = (OS_PEND_DATA *)0;
1478 p_pend_list->HeadPtr = p_pend_data;
1479 p_pend_list->TailPtr = p_pend_data;
1481 p_pend_list->NbrEntries++;
1482 p_pend_data_next = p_pend_list->HeadPtr;
1483 while (p_pend_data_next != (OS_PEND_DATA *)0) {
1484 p_tcb_next = p_pend_data_next->TCBPtr;
1485 if (prio < p_tcb_next->Prio) {
1488 p_pend_data_next = p_pend_data_next->NextPtr;
1491 if (p_pend_data_next == (OS_PEND_DATA *)0) {
1492 p_pend_data->NextPtr = (OS_PEND_DATA *)0;
1493 p_pend_data_prev = p_pend_list->TailPtr;
1494 p_pend_data->PrevPtr = p_pend_data_prev;
1495 p_pend_data_prev->NextPtr = p_pend_data;
1496 p_pend_list->TailPtr = p_pend_data;
1498 if (p_pend_data_next->PrevPtr == (OS_PEND_DATA *)0) {
1499 p_pend_data_next->PrevPtr = p_pend_data;
1500 p_pend_data->PrevPtr = (OS_PEND_DATA *)0;
1501 p_pend_data->NextPtr = p_pend_data_next;
1502 p_pend_list->HeadPtr = p_pend_data;
1504 p_pend_data_prev = p_pend_data_next->PrevPtr;
1505 p_pend_data->PrevPtr = p_pend_data_prev;
1506 p_pend_data->NextPtr = p_pend_data_next;
1507 p_pend_data_prev->NextPtr = p_pend_data;
1508 p_pend_data_next->PrevPtr = p_pend_data;
1567 OS_PEND_DATA *p_pend_data;
1568 OS_PEND_LIST *p_pend_list;
1573 p_pend_data = p_tcb->PendDataTblPtr;
1574 n_pend_list = p_tcb->PendDataTblEntries;
1577 p_obj = p_pend_data->PendObjPtr;
1578 p_pend_list = &p_obj->PendList;
1585 p_tcb->PendDataTblPtr = (OS_PEND_DATA *)0;
1640 OS_PEND_DATA *p_pend_data)
1642 OS_PEND_DATA *p_prev;
1643 OS_PEND_DATA *p_next;
1647 if (p_pend_list->NbrEntries == 1u) {
1648 p_pend_list->HeadPtr = (OS_PEND_DATA *)0;
1649 p_pend_list->TailPtr = (OS_PEND_DATA *)0;
1651 }
else if (p_pend_data->PrevPtr == (OS_PEND_DATA *)0) {
1652 p_next = p_pend_data->NextPtr;
1653 p_next->PrevPtr = (OS_PEND_DATA *)0;
1654 p_pend_list->HeadPtr = p_next;
1656 }
else if (p_pend_data->NextPtr == (OS_PEND_DATA *)0) {
1657 p_prev = p_pend_data->PrevPtr;
1658 p_prev->NextPtr = (OS_PEND_DATA *)0;
1659 p_pend_list->TailPtr = p_prev;
1662 p_prev = p_pend_data->PrevPtr;
1663 p_next = p_pend_data->NextPtr;
1664 p_prev->NextPtr = p_next;
1665 p_next->PrevPtr = p_prev;
1667 p_pend_list->NbrEntries--;
1668 p_pend_data->NextPtr = (OS_PEND_DATA *)0;
1669 p_pend_data->PrevPtr = (OS_PEND_DATA *)0;
1697 switch (p_tcb->TaskState) {
1711 #if (OS_MSG_EN > 0u)
1712 p_tcb->MsgPtr = (
void *)0;
1730 #if (OS_MSG_EN > 0u)
1731 p_tcb->MsgPtr = (
void *)0;
1800 OS_PEND_DATA *p_pend_data;
1804 p_pend_data = p_tcb->PendDataTblPtr;
1805 n_pend_list = p_tcb->PendDataTblEntries;
1808 if (p_obj == p_pend_data->PendObjPtr) {
1809 p_pend_data->RdyObjPtr = p_obj;
1810 p_pend_data->RdyTS = ts;
1850 switch (p_tcb->TaskState) {
1866 #if (OS_MSG_EN > 0u)
1867 p_tcb->MsgPtr = p_void;
1868 p_tcb->MsgSize = msg_size;
1872 if (p_obj != (OS_PEND_OBJ *)0) {
1874 #if OS_CFG_DBG_EN > 0u
1875 OS_PendDbgNameRemove(p_obj,
1894 #if (OS_MSG_EN > 0u)
1895 p_tcb->MsgPtr = p_void;
1896 p_tcb->MsgSize = msg_size;
1901 if (p_obj != (OS_PEND_OBJ *)0) {
1903 #if OS_CFG_DBG_EN > 0u
1904 OS_PendDbgNameRemove(p_obj,
1977 OS_PEND_DATA *p_pend_data;
1981 p_pend_data = p_tcb->PendDataTblPtr;
1982 n_pend_list = p_tcb->PendDataTblEntries;
1985 if (p_obj == p_pend_data->PendObjPtr) {
1986 p_pend_data->RdyObjPtr = p_obj;
1987 p_pend_data->RdyMsgPtr = p_void;
1988 p_pend_data->RdyMsgSize = msg_size;
1989 p_pend_data->RdyTS = ts;
2043 OS_RDY_LIST *p_rdy_list;
2050 p_rdy_list->HeadPtr = (OS_TCB *)0;
2051 p_rdy_list->TailPtr = (OS_TCB *)0;
2143 OS_RDY_LIST *p_rdy_list;
2149 if (p_rdy_list->NbrEntries == (
OS_OBJ_QTY)0) {
2151 p_tcb->NextPtr = (OS_TCB *)0;
2152 p_tcb->PrevPtr = (OS_TCB *)0;
2153 p_rdy_list->HeadPtr = p_tcb;
2154 p_rdy_list->TailPtr = p_tcb;
2156 p_rdy_list->NbrEntries++;
2157 p_tcb->NextPtr = p_rdy_list->HeadPtr;
2158 p_tcb->PrevPtr = (OS_TCB *)0;
2159 p_tcb2 = p_rdy_list->HeadPtr;
2160 p_tcb2->PrevPtr = p_tcb;
2161 p_rdy_list->HeadPtr = p_tcb;
2224 OS_RDY_LIST *p_rdy_list;
2230 if (p_rdy_list->NbrEntries == (
OS_OBJ_QTY)0) {
2232 p_tcb->NextPtr = (OS_TCB *)0;
2233 p_tcb->PrevPtr = (OS_TCB *)0;
2234 p_rdy_list->HeadPtr = p_tcb;
2235 p_rdy_list->TailPtr = p_tcb;
2237 p_rdy_list->NbrEntries++;
2238 p_tcb->NextPtr = (OS_TCB *)0;
2239 p_tcb2 = p_rdy_list->TailPtr;
2240 p_tcb->PrevPtr = p_tcb2;
2241 p_tcb2->NextPtr = p_tcb;
2242 p_rdy_list->TailPtr = p_tcb;
2307 switch (p_rdy_list->NbrEntries) {
2313 p_tcb1 = p_rdy_list->HeadPtr;
2314 p_tcb2 = p_rdy_list->TailPtr;
2315 p_tcb1->PrevPtr = p_tcb2;
2316 p_tcb1->NextPtr = (OS_TCB *)0;
2317 p_tcb2->PrevPtr = (OS_TCB *)0;
2318 p_tcb2->NextPtr = p_tcb1;
2319 p_rdy_list->HeadPtr = p_tcb2;
2320 p_rdy_list->TailPtr = p_tcb1;
2324 p_tcb1 = p_rdy_list->HeadPtr;
2325 p_tcb2 = p_rdy_list->TailPtr;
2326 p_tcb3 = p_tcb1->NextPtr;
2327 p_tcb3->PrevPtr = (OS_TCB *)0;
2328 p_tcb1->NextPtr = (OS_TCB *)0;
2329 p_tcb1->PrevPtr = p_tcb2;
2330 p_tcb2->NextPtr = p_tcb1;
2331 p_rdy_list->HeadPtr = p_tcb3;
2332 p_rdy_list->TailPtr = p_tcb1;
2388 OS_RDY_LIST *p_rdy_list;
2395 p_tcb1 = p_tcb->PrevPtr;
2396 p_tcb2 = p_tcb->NextPtr;
2397 if (p_tcb1 == (OS_TCB *)0) {
2398 if (p_tcb2 == (OS_TCB *)0) {
2400 p_rdy_list->HeadPtr = (OS_TCB *)0;
2401 p_rdy_list->TailPtr = (OS_TCB *)0;
2404 p_rdy_list->NbrEntries--;
2405 p_tcb2->PrevPtr = (OS_TCB *)0;
2406 p_rdy_list->HeadPtr = p_tcb2;
2409 p_rdy_list->NbrEntries--;
2410 p_tcb1->NextPtr = p_tcb2;
2411 if (p_tcb2 == (OS_TCB *)0) {
2412 p_rdy_list->TailPtr = p_tcb1;
2414 p_tcb2->PrevPtr = p_tcb1;
2417 p_tcb->PrevPtr = (OS_TCB *)0;
2418 p_tcb->NextPtr = (OS_TCB *)0;
2437 #if OS_CFG_ISR_POST_DEFERRED_EN > 0u
2438 void OS_Sched0 (
void)
2447 #if OS_CFG_TASK_PROFILE_EN > 0u
2478 #if OS_CFG_SCHED_LOCK_TIME_MEAS_EN > 0u
2479 void OS_SchedLockTimeMeasStart (
void)
2489 void OS_SchedLockTimeMeasStop (
void)
2496 - OSSchedLockTimeBegin;
2497 if (OSSchedLockTimeMax < delta) {
2498 OSSchedLockTimeMax = delta;
2500 if (OSSchedLockTimeMaxCur < delta) {
2501 OSSchedLockTimeMaxCur = delta;
2524 #if OS_CFG_SCHED_ROUND_ROBIN_EN > 0u
2525 void OS_SchedRoundRobin (OS_RDY_LIST *p_rdy_list)
2532 if (OSSchedRoundRobinEn !=
DEF_TRUE) {
2537 p_tcb = p_rdy_list->HeadPtr;
2539 if (p_tcb == (OS_TCB *)0) {
2549 if (p_tcb->TimeQuantaCtr > (
OS_TICK)0) {
2550 p_tcb->TimeQuantaCtr--;
2553 if (p_tcb->TimeQuantaCtr > (
OS_TICK)0) {
2558 if (p_rdy_list->NbrEntries < (
OS_OBJ_QTY)2) {
2569 p_tcb = p_rdy_list->HeadPtr;
2570 if (p_tcb->TimeQuanta == (
OS_TICK)0) {
2571 p_tcb->TimeQuantaCtr = OSSchedRoundRobinDfltTimeQuanta;
2573 p_tcb->TimeQuantaCtr = p_tcb->TimeQuanta;