33 #define MICRIUM_SOURCE
36 #ifdef VSC_INCLUDE_SOURCE_FILE_NAMES
37 const CPU_CHAR *os_task__c =
"$Id: $";
61 #if OS_CFG_TASK_CHANGE_PRIO_EN > 0u
62 void OSTaskChangePrio (OS_TCB *p_tcb,
71 #ifdef OS_SAFETY_CRITICAL
72 if (p_err == (
OS_ERR *)0) {
73 OS_SAFETY_CRITICAL_EXCEPTION();
78 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
85 #if OS_CFG_ISR_POST_DEFERRED_EN > 0u
97 if (p_tcb == (OS_TCB *)0) {
107 switch (p_tcb->TaskState) {
110 p_tcb->Prio = prio_new;
122 p_tcb->Prio = prio_new;
129 switch (p_tcb->PendOn) {
133 p_tcb->Prio = prio_new;
264 #if OS_CFG_TASK_REG_TBL_SIZE > 0u
267 #if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u)
277 #ifdef OS_SAFETY_CRITICAL
278 if (p_err == (
OS_ERR *)0) {
279 OS_SAFETY_CRITICAL_EXCEPTION();
284 #ifdef OS_SAFETY_CRITICAL_IEC61508
285 if (OSSafetyCriticalStartFlag ==
DEF_TRUE) {
291 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
298 #if OS_CFG_ARG_CHK_EN > 0u
299 if (p_tcb == (OS_TCB *)0) {
307 if (p_stk_base == (
CPU_STK *)0) {
315 if (stk_limit >= stk_size) {
325 #if OS_CFG_ISR_POST_DEFERRED_EN > 0u
327 if (p_tcb != &OSIntQTaskTCB) {
348 for (i = 0u; i < stk_size; i++) {
355 #if (CPU_CFG_STK_GROWTH == CPU_STK_GROWTH_HI_TO_LO)
356 p_stk_limit = p_stk_base + stk_limit;
358 p_stk_limit = p_stk_base + (stk_size - 1u) - stk_limit;
369 p_tcb->TaskEntryAddr = p_task;
370 p_tcb->TaskEntryArg = p_arg;
372 p_tcb->NamePtr = p_name;
376 p_tcb->StkPtr = p_sp;
377 p_tcb->StkLimitPtr = p_stk_limit;
379 p_tcb->TimeQuanta = time_quanta;
380 #if OS_CFG_SCHED_ROUND_ROBIN_EN > 0u
381 if (time_quanta == (
OS_TICK)0) {
382 p_tcb->TimeQuantaCtr = OSSchedRoundRobinDfltTimeQuanta;
384 p_tcb->TimeQuantaCtr = time_quanta;
387 p_tcb->ExtPtr = p_ext;
388 p_tcb->StkBasePtr = p_stk_base;
389 p_tcb->StkSize = stk_size;
392 #if OS_CFG_TASK_REG_TBL_SIZE > 0u
394 p_tcb->RegTbl[reg_nbr] = (
OS_REG)0;
398 #if OS_CFG_TASK_Q_EN > 0u
407 #if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u)
409 p_tcb->TLS_Tbl[id] = (OS_TLS)0;
411 OS_TLS_TaskCreate(p_tcb);
418 #if OS_CFG_DBG_EN > 0u
419 OS_TaskDbgListAdd(p_tcb);
459 #if OS_CFG_TASK_DEL_EN > 0u
460 void OSTaskDel (OS_TCB *p_tcb,
467 #ifdef OS_SAFETY_CRITICAL
468 if (p_err == (
OS_ERR *)0) {
469 OS_SAFETY_CRITICAL_EXCEPTION();
474 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
486 #if OS_CFG_ISR_POST_DEFERRED_EN > 0u
487 if (p_tcb == &OSIntQTaskTCB) {
493 if (p_tcb == (OS_TCB *)0) {
500 switch (p_tcb->TaskState) {
518 switch (p_tcb->PendOn) {
543 #if OS_CFG_TASK_Q_EN > 0u
549 #if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u)
550 OS_TLS_TaskDel(p_tcb);
553 #if OS_CFG_DBG_EN > 0u
554 OS_TaskDbgListRemove(p_tcb);
593 #if OS_CFG_TASK_Q_EN > 0u
602 #ifdef OS_SAFETY_CRITICAL
603 if (p_err == (
OS_ERR *)0) {
604 OS_SAFETY_CRITICAL_EXCEPTION();
609 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
616 if (p_tcb == (OS_TCB *)0) {
671 #if OS_CFG_TASK_Q_EN > 0u
672 void *OSTaskQPend (
OS_TICK timeout,
684 #ifdef OS_SAFETY_CRITICAL
685 if (p_err == (
OS_ERR *)0) {
686 OS_SAFETY_CRITICAL_EXCEPTION();
691 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
698 #if OS_CFG_ARG_CHK_EN > 0u
714 if (p_ts != (
CPU_TS *)0) {
725 #if OS_CFG_TASK_PROFILE_EN > 0u
726 if (p_ts != (
CPU_TS *)0) {
763 if (p_ts != (
CPU_TS *)0) {
765 #if OS_CFG_TASK_PROFILE_EN > 0u
778 if (p_ts != (
CPU_TS *)0) {
788 if (p_ts != (
CPU_TS *)0) {
827 #if (OS_CFG_TASK_Q_EN > 0u) && (OS_CFG_TASK_Q_PEND_ABORT_EN > 0u)
837 #ifdef OS_SAFETY_CRITICAL
838 if (p_err == (
OS_ERR *)0) {
839 OS_SAFETY_CRITICAL_EXCEPTION();
844 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
851 #if OS_CFG_ARG_CHK_EN > 0u
864 #if OS_CFG_ARG_CHK_EN > 0u
865 if ((p_tcb == (OS_TCB *)0) ||
873 if (p_tcb->PendOn != OS_TASK_PEND_ON_TASK_Q) {
929 #if OS_CFG_TASK_Q_EN > 0u
930 void OSTaskQPost (OS_TCB *p_tcb,
940 #ifdef OS_SAFETY_CRITICAL
941 if (p_err == (
OS_ERR *)0) {
942 OS_SAFETY_CRITICAL_EXCEPTION();
947 #if OS_CFG_ARG_CHK_EN > 0u
963 #if OS_CFG_ISR_POST_DEFERRED_EN > 0u
1010 #if OS_CFG_TASK_REG_TBL_SIZE > 0u
1011 OS_REG OSTaskRegGet (OS_TCB *p_tcb,
1020 #ifdef OS_SAFETY_CRITICAL
1021 if (p_err == (
OS_ERR *)0) {
1022 OS_SAFETY_CRITICAL_EXCEPTION();
1027 #if OS_CFG_ARG_CHK_EN > 0u
1035 if (p_tcb == (OS_TCB *)0) {
1038 value = p_tcb->RegTbl[id];
1063 #if OS_CFG_TASK_REG_TBL_SIZE > 0u
1071 #ifdef OS_SAFETY_CRITICAL
1072 if (p_err == (
OS_ERR *)0) {
1073 OS_SAFETY_CRITICAL_EXCEPTION();
1085 id = OSTaskRegNextAvailID;
1086 OSTaskRegNextAvailID++;
1119 #if OS_CFG_TASK_REG_TBL_SIZE > 0u
1120 void OSTaskRegSet (OS_TCB *p_tcb,
1129 #ifdef OS_SAFETY_CRITICAL
1130 if (p_err == (
OS_ERR *)0) {
1131 OS_SAFETY_CRITICAL_EXCEPTION();
1136 #if OS_CFG_ARG_CHK_EN > 0u
1144 if (p_tcb == (OS_TCB *)0) {
1147 p_tcb->RegTbl[id] = value;
1175 #if OS_CFG_TASK_SUSPEND_EN > 0u
1176 void OSTaskResume (OS_TCB *p_tcb,
1183 #ifdef OS_SAFETY_CRITICAL
1184 if (p_err == (
OS_ERR *)0) {
1185 OS_SAFETY_CRITICAL_EXCEPTION();
1190 #if (OS_CFG_ISR_POST_DEFERRED_EN == 0u) && \
1191 (OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u)
1200 #if OS_CFG_ARG_CHK_EN > 0u
1201 if ((p_tcb == (OS_TCB *)0) ||
1210 #if OS_CFG_ISR_POST_DEFERRED_EN > 0u
1224 OS_TaskResume(p_tcb, p_err);
1272 #ifdef OS_SAFETY_CRITICAL
1273 if (p_err == (
OS_ERR *)0) {
1274 OS_SAFETY_CRITICAL_EXCEPTION();
1279 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
1286 #if OS_CFG_ARG_CHK_EN > 0u
1289 case OS_OPT_PEND_NON_BLOCKING:
1298 if (p_ts != (
CPU_TS *)0) {
1306 if (p_ts != (
CPU_TS *)0) {
1309 #if OS_CFG_TASK_PROFILE_EN > 0u
1320 if ((opt & OS_OPT_PEND_NON_BLOCKING) != (
OS_OPT)0) {
1344 if (p_ts != (
CPU_TS *)0) {
1346 #if OS_CFG_TASK_PROFILE_EN > 0u
1357 if (p_ts != (
CPU_TS *)0) {
1364 if (p_ts != (
CPU_TS *)0) {
1408 #if OS_CFG_TASK_SEM_PEND_ABORT_EN > 0u
1418 #ifdef OS_SAFETY_CRITICAL
1419 if (p_err == (
OS_ERR *)0) {
1420 OS_SAFETY_CRITICAL_EXCEPTION();
1425 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
1432 #if OS_CFG_ARG_CHK_EN > 0u
1435 case OS_OPT_POST_NO_SCHED:
1445 if ((p_tcb == (OS_TCB *)0) ||
1465 if ((opt & OS_OPT_POST_NO_SCHED) == (
OS_OPT)0) {
1506 #ifdef OS_SAFETY_CRITICAL
1507 if (p_err == (
OS_ERR *)0) {
1508 OS_SAFETY_CRITICAL_EXCEPTION();
1513 #if OS_CFG_ARG_CHK_EN > 0u
1516 case OS_OPT_POST_NO_SCHED:
1527 #if OS_CFG_ISR_POST_DEFERRED_EN > 0u
1579 #ifdef OS_SAFETY_CRITICAL
1580 if (p_err == (
OS_ERR *)0) {
1581 OS_SAFETY_CRITICAL_EXCEPTION();
1586 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
1594 if (p_tcb == (OS_TCB *)0) {
1597 ctr = p_tcb->SemCtr;
1629 #if OS_CFG_STAT_TASK_STK_CHK_EN > 0u
1630 void OSTaskStkChk (OS_TCB *p_tcb,
1641 #ifdef OS_SAFETY_CRITICAL
1642 if (p_err == (
OS_ERR *)0) {
1643 OS_SAFETY_CRITICAL_EXCEPTION();
1648 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
1655 #if OS_CFG_ARG_CHK_EN > 0u
1668 if (p_tcb == (OS_TCB *)0) {
1672 if (p_tcb->StkPtr == (
CPU_STK*)0) {
1690 #if CPU_CFG_STK_GROWTH == CPU_STK_GROWTH_HI_TO_LO
1691 p_stk = p_tcb->StkBasePtr;
1692 while (*p_stk == (
CPU_STK)0) {
1697 p_stk = p_tcb->StkBasePtr + p_tcb->StkSize - 1u;
1698 while (*p_stk == (
CPU_STK)0) {
1704 *p_used = (p_tcb->StkSize - free_stk);
1737 #if OS_CFG_TASK_SUSPEND_EN > 0u
1738 void OSTaskSuspend (OS_TCB *p_tcb,
1741 #ifdef OS_SAFETY_CRITICAL
1742 if (p_err == (
OS_ERR *)0) {
1743 OS_SAFETY_CRITICAL_EXCEPTION();
1748 #if (OS_CFG_ISR_POST_DEFERRED_EN == 0u) && \
1749 (OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u)
1761 #if OS_CFG_ISR_POST_DEFERRED_EN > 0u
1762 if (p_tcb == &OSIntQTaskTCB) {
1780 OS_TaskSuspend(p_tcb, p_err);
1805 #if OS_CFG_SCHED_ROUND_ROBIN_EN > 0u
1806 void OSTaskTimeQuantaSet (OS_TCB *p_tcb,
1814 #ifdef OS_SAFETY_CRITICAL
1815 if (p_err == (
OS_ERR *)0) {
1816 OS_SAFETY_CRITICAL_EXCEPTION();
1821 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
1829 if (p_tcb == (OS_TCB *)0) {
1833 if (time_quanta == 0u) {
1834 p_tcb->TimeQuanta = OSSchedRoundRobinDfltTimeQuanta;
1836 p_tcb->TimeQuanta = time_quanta;
1838 if (p_tcb->TimeQuanta > p_tcb->TimeQuantaCtr) {
1839 p_tcb->TimeQuantaCtr = p_tcb->TimeQuanta;
1861 #if OS_CFG_DBG_EN > 0u
1862 void OS_TaskDbgListAdd (OS_TCB *p_tcb)
1864 p_tcb->DbgPrevPtr = (OS_TCB *)0;
1865 if (OSTaskDbgListPtr == (OS_TCB *)0) {
1866 p_tcb->DbgNextPtr = (OS_TCB *)0;
1868 p_tcb->DbgNextPtr = OSTaskDbgListPtr;
1869 OSTaskDbgListPtr->DbgPrevPtr = p_tcb;
1871 OSTaskDbgListPtr = p_tcb;
1876 void OS_TaskDbgListRemove (OS_TCB *p_tcb)
1882 p_tcb_prev = p_tcb->DbgPrevPtr;
1883 p_tcb_next = p_tcb->DbgNextPtr;
1885 if (p_tcb_prev == (OS_TCB *)0) {
1886 OSTaskDbgListPtr = p_tcb_next;
1887 if (p_tcb_next != (OS_TCB *)0) {
1888 p_tcb_next->DbgPrevPtr = (OS_TCB *)0;
1890 p_tcb->DbgNextPtr = (OS_TCB *)0;
1892 }
else if (p_tcb_next == (OS_TCB *)0) {
1893 p_tcb_prev->DbgNextPtr = (OS_TCB *)0;
1894 p_tcb->DbgPrevPtr = (OS_TCB *)0;
1897 p_tcb_prev->DbgNextPtr = p_tcb_next;
1898 p_tcb_next->DbgPrevPtr = p_tcb_prev;
1899 p_tcb->DbgNextPtr = (OS_TCB *)0;
1900 p_tcb->DbgPrevPtr = (OS_TCB *)0;
1925 #ifdef OS_SAFETY_CRITICAL
1926 if (p_err == (
OS_ERR *)0) {
1927 OS_SAFETY_CRITICAL_EXCEPTION();
1932 #if OS_CFG_DBG_EN > 0u
1933 OSTaskDbgListPtr = (OS_TCB *)0;
1959 #if OS_CFG_TASK_REG_TBL_SIZE > 0u
1962 #if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u)
1965 #if OS_CFG_TASK_PROFILE_EN > 0u
1971 p_tcb->StkLimitPtr = (
CPU_STK *)0;
1973 p_tcb->ExtPtr = (
void *)0;
1975 p_tcb->NextPtr = (OS_TCB *)0;
1976 p_tcb->PrevPtr = (OS_TCB *)0;
1978 p_tcb->TickNextPtr = (OS_TCB *)0;
1979 p_tcb->TickPrevPtr = (OS_TCB *)0;
1980 p_tcb->TickSpokePtr = (OS_TICK_SPOKE *)0;
1982 p_tcb->NamePtr = (
CPU_CHAR *)((
void *)
"?Task");
1984 p_tcb->StkBasePtr = (
CPU_STK *)0;
1987 p_tcb->TaskEntryArg = (
void *)0;
1989 #if (OS_CFG_PEND_MULTI_EN > 0u)
1990 p_tcb->PendDataTblPtr = (OS_PEND_DATA *)0;
1996 #if (OS_MSG_EN > 0u)
1997 p_tcb->MsgPtr = (
void *)0;
2001 #if OS_CFG_TASK_Q_EN > 0u
2004 #if OS_CFG_TASK_PROFILE_EN > 0u
2005 p_tcb->MsgQPendTime = (
CPU_TS )0u;
2006 p_tcb->MsgQPendTimeMax = (
CPU_TS )0u;
2010 #if OS_CFG_FLAG_EN > 0u
2012 p_tcb->FlagsOpt = (
OS_OPT )0u;
2016 #if OS_CFG_TASK_REG_TBL_SIZE > 0u
2018 p_tcb->RegTbl[reg_id] = (
OS_REG)0u;
2022 #if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u)
2024 p_tcb->TLS_Tbl[id] = (OS_TLS)0;
2029 #if OS_CFG_TASK_PROFILE_EN > 0u
2030 p_tcb->SemPendTime = (
CPU_TS )0u;
2031 p_tcb->SemPendTimeMax = (
CPU_TS )0u;
2037 #if OS_CFG_TASK_SUSPEND_EN > 0u
2041 #if OS_CFG_STAT_TASK_STK_CHK_EN > 0u
2046 p_tcb->Opt = (
OS_OPT )0u;
2049 p_tcb->TickCtrMatch = (
OS_TICK )0u;
2050 p_tcb->TickRemain = (
OS_TICK )0u;
2052 p_tcb->TimeQuanta = (
OS_TICK )0u;
2053 p_tcb->TimeQuantaCtr = (
OS_TICK )0u;
2055 #if OS_CFG_TASK_PROFILE_EN > 0u
2059 p_tcb->CyclesDelta = (
CPU_TS )0u;
2061 p_tcb->CyclesStart = ts;
2064 #ifdef CPU_CFG_INT_DIS_MEAS_EN
2065 p_tcb->IntDisTimeMax = (
CPU_TS )0u;
2067 #if OS_CFG_SCHED_LOCK_TIME_MEAS_EN > 0u
2068 p_tcb->SchedLockTimeMax = (
CPU_TS )0u;
2077 #if OS_CFG_DBG_EN > 0u
2078 p_tcb->DbgPrevPtr = (OS_TCB *)0;
2079 p_tcb->DbgNextPtr = (OS_TCB *)0;
2080 p_tcb->DbgNamePtr = (
CPU_CHAR *)((
void *)
" ");
2126 #if OS_CFG_TASK_Q_EN > 0u
2139 if (p_tcb == (OS_TCB *)0) {
2143 switch (p_tcb->TaskState) {
2161 if (p_tcb->PendOn == OS_TASK_PEND_ON_TASK_Q) {
2168 if ((opt & OS_OPT_POST_NO_SCHED) == (
OS_OPT)0u) {
2214 #if OS_CFG_TASK_SUSPEND_EN > 0u
2215 void OS_TaskResume (OS_TCB *p_tcb,
2223 switch (p_tcb->TaskState) {
2234 p_tcb->SuspendCtr--;
2243 p_tcb->SuspendCtr--;
2251 p_tcb->SuspendCtr--;
2259 p_tcb->SuspendCtr--;
2299 #if OS_CFG_TASK_DEL_EN > 0u
2300 OSTaskDel((OS_TCB *)0,
2353 if (p_tcb == (OS_TCB *)0) {
2358 switch (p_tcb->TaskState) {
2392 ctr = p_tcb->SemCtr;
2406 ctr = p_tcb->SemCtr;
2408 if ((opt & OS_OPT_POST_NO_SCHED) == (
OS_OPT)0) {
2441 ctr = p_tcb->SemCtr;
2485 #if OS_CFG_TASK_SUSPEND_EN > 0u
2486 void OS_TaskSuspend (OS_TCB *p_tcb,
2494 if (p_tcb == (OS_TCB *)0) {
2507 switch (p_tcb->TaskState) {
2538 p_tcb->SuspendCtr++;