33 #define MICRIUM_SOURCE
36 #ifdef VSC_INCLUDE_SOURCE_FILE_NAMES
37 const CPU_CHAR *os_flag__c =
"$Id: $";
41 #if OS_CFG_FLAG_EN > 0u
70 void OSFlagCreate (OS_FLAG_GRP *p_grp,
79 #ifdef OS_SAFETY_CRITICAL
80 if (p_err == (
OS_ERR *)0) {
81 OS_SAFETY_CRITICAL_EXCEPTION();
86 #ifdef OS_SAFETY_CRITICAL_IEC61508
87 if (OSSafetyCriticalStartFlag ==
DEF_TRUE) {
93 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
100 #if OS_CFG_ARG_CHK_EN > 0u
101 if (p_grp == (OS_FLAG_GRP *)0) {
109 p_grp->NamePtr = p_name;
110 p_grp->Flags = flags;
114 #if OS_CFG_DBG_EN > 0u
115 OS_FlagDbgListAdd(p_grp);
155 #if OS_CFG_FLAG_DEL_EN > 0u
162 OS_PEND_DATA *p_pend_data;
163 OS_PEND_LIST *p_pend_list;
170 #ifdef OS_SAFETY_CRITICAL
171 if (p_err == (
OS_ERR *)0) {
172 OS_SAFETY_CRITICAL_EXCEPTION();
177 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
184 #if OS_CFG_ARG_CHK_EN > 0u
185 if (p_grp == (OS_FLAG_GRP *)0) {
200 #if OS_CFG_OBJ_TYPE_CHK_EN > 0u
207 p_pend_list = &p_grp->PendList;
208 cnt = p_pend_list->NbrEntries;
213 #if OS_CFG_DBG_EN > 0u
214 OS_FlagDbgListRemove(p_grp);
230 p_pend_data = p_pend_list->HeadPtr;
231 p_tcb = p_pend_data->TCBPtr;
237 #if OS_CFG_DBG_EN > 0u
238 OS_FlagDbgListRemove(p_grp);
315 OS_FLAGS OSFlagPend (OS_FLAG_GRP *p_grp,
325 OS_PEND_DATA pend_data;
330 #ifdef OS_SAFETY_CRITICAL
331 if (p_err == (
OS_ERR *)0) {
332 OS_SAFETY_CRITICAL_EXCEPTION();
337 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
344 #if OS_CFG_ARG_CHK_EN > 0u
345 if (p_grp == (OS_FLAG_GRP *)0) {
374 #if OS_CFG_OBJ_TYPE_CHK_EN > 0u
387 if (p_ts != (
CPU_TS *)0) {
395 flags_rdy = (
OS_FLAGS)(p_grp->Flags & flags);
396 if (flags_rdy == flags) {
398 p_grp->Flags &= ~flags_rdy;
401 if (p_ts != (
CPU_TS *)0) {
421 OS_FlagBlock(&pend_data,
431 flags_rdy = (
OS_FLAGS)(p_grp->Flags & flags);
434 p_grp->Flags &= ~flags_rdy;
437 if (p_ts != (
CPU_TS *)0) {
444 if ((opt & OS_OPT_PEND_NON_BLOCKING) != (
OS_OPT)0) {
457 OS_FlagBlock(&pend_data,
466 #if OS_CFG_FLAG_MODE_CLR_EN > 0u
468 flags_rdy = (
OS_FLAGS)(~p_grp->Flags & flags);
469 if (flags_rdy == flags) {
471 p_grp->Flags |= flags_rdy;
474 if (p_ts != (
CPU_TS *)0) {
481 if ((opt & OS_OPT_PEND_NON_BLOCKING) != (
OS_OPT)0) {
494 OS_FlagBlock(&pend_data,
504 flags_rdy = (
OS_FLAGS)(~p_grp->Flags & flags);
507 p_grp->Flags |= flags_rdy;
510 if (p_ts != (
CPU_TS *)0) {
517 if ((opt & OS_OPT_PEND_NON_BLOCKING) != (
OS_OPT)0) {
530 OS_FlagBlock(&pend_data,
551 if (p_ts != (
CPU_TS *)0) {
558 if (p_ts != (
CPU_TS *)0) {
566 if (p_ts != (
CPU_TS *)0) {
574 if (p_ts != (
CPU_TS *)0) {
592 p_grp->Flags &= ~flags_rdy;
595 #if OS_CFG_FLAG_MODE_CLR_EN > 0u
598 p_grp->Flags |= flags_rdy;
646 #if OS_CFG_FLAG_PEND_ABORT_EN > 0u
647 OS_OBJ_QTY OSFlagPendAbort (OS_FLAG_GRP *p_grp,
651 OS_PEND_LIST *p_pend_list;
659 #ifdef OS_SAFETY_CRITICAL
660 if (p_err == (
OS_ERR *)0) {
661 OS_SAFETY_CRITICAL_EXCEPTION();
666 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
673 #if OS_CFG_ARG_CHK_EN > 0u
674 if (p_grp == (OS_FLAG_GRP *)0) {
691 #if OS_CFG_OBJ_TYPE_CHK_EN > 0u
699 p_pend_list = &p_grp->PendList;
700 if (p_pend_list->NbrEntries == (
OS_OBJ_QTY)0u) {
709 while (p_pend_list->NbrEntries > (
OS_OBJ_QTY)0u) {
710 p_tcb = p_pend_list->HeadPtr->TCBPtr;
754 #ifdef OS_SAFETY_CRITICAL
755 if (p_err == (
OS_ERR *)0) {
756 OS_SAFETY_CRITICAL_EXCEPTION();
761 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
817 OS_FLAGS OSFlagPost (OS_FLAG_GRP *p_grp,
827 #ifdef OS_SAFETY_CRITICAL
828 if (p_err == (
OS_ERR *)0) {
829 OS_SAFETY_CRITICAL_EXCEPTION();
834 #if OS_CFG_ARG_CHK_EN > 0u
835 if (p_grp == (OS_FLAG_GRP *)0) {
852 #if OS_CFG_OBJ_TYPE_CHK_EN > 0u
860 #if OS_CFG_ISR_POST_DEFERRED_EN > 0u
874 flags_cur = OS_FlagPost(p_grp,
920 void OS_FlagBlock (OS_PEND_DATA *p_pend_data,
931 (OS_PEND_OBJ *)((
void *)p_grp),
953 void OS_FlagClr (OS_FLAG_GRP *p_grp)
955 OS_PEND_LIST *p_pend_list;
960 p_grp->NamePtr = (
CPU_CHAR *)((
void *)
"?FLAG");
962 p_pend_list = &p_grp->PendList;
984 void OS_FlagInit (
OS_ERR *p_err)
986 #ifdef OS_SAFETY_CRITICAL
987 if (p_err == (
OS_ERR *)0) {
988 OS_SAFETY_CRITICAL_EXCEPTION();
993 #if OS_CFG_DBG_EN > 0u
994 OSFlagDbgListPtr = (OS_FLAG_GRP *)0;
1017 #if OS_CFG_DBG_EN > 0u
1018 void OS_FlagDbgListAdd (OS_FLAG_GRP *p_grp)
1020 p_grp->DbgNamePtr = (
CPU_CHAR *)((
void *)
" ");
1021 p_grp->DbgPrevPtr = (OS_FLAG_GRP *)0;
1022 if (OSFlagDbgListPtr == (OS_FLAG_GRP *)0) {
1023 p_grp->DbgNextPtr = (OS_FLAG_GRP *)0;
1025 p_grp->DbgNextPtr = OSFlagDbgListPtr;
1026 OSFlagDbgListPtr->DbgPrevPtr = p_grp;
1028 OSFlagDbgListPtr = p_grp;
1033 void OS_FlagDbgListRemove (OS_FLAG_GRP *p_grp)
1035 OS_FLAG_GRP *p_grp_next;
1036 OS_FLAG_GRP *p_grp_prev;
1039 p_grp_prev = p_grp->DbgPrevPtr;
1040 p_grp_next = p_grp->DbgNextPtr;
1042 if (p_grp_prev == (OS_FLAG_GRP *)0) {
1043 OSFlagDbgListPtr = p_grp_next;
1044 if (p_grp_next != (OS_FLAG_GRP *)0) {
1045 p_grp_next->DbgPrevPtr = (OS_FLAG_GRP *)0;
1047 p_grp->DbgNextPtr = (OS_FLAG_GRP *)0;
1049 }
else if (p_grp_next == (OS_FLAG_GRP *)0) {
1050 p_grp_prev->DbgNextPtr = (OS_FLAG_GRP *)0;
1051 p_grp->DbgPrevPtr = (OS_FLAG_GRP *)0;
1054 p_grp_prev->DbgNextPtr = p_grp_next;
1055 p_grp_next->DbgPrevPtr = p_grp_prev;
1056 p_grp->DbgNextPtr = (OS_FLAG_GRP *)0;
1057 p_grp->DbgPrevPtr = (OS_FLAG_GRP *)0;
1106 OS_FLAGS OS_FlagPost (OS_FLAG_GRP *p_grp,
1115 OS_PEND_DATA *p_pend_data;
1116 OS_PEND_DATA *p_pend_data_next;
1117 OS_PEND_LIST *p_pend_list;
1127 p_grp->Flags |= flags;
1132 p_grp->Flags &= ~flags;
1141 p_pend_list = &p_grp->PendList;
1142 if (p_pend_list->NbrEntries == 0u) {
1145 return (p_grp->Flags);
1149 p_pend_data = p_pend_list->HeadPtr;
1150 p_tcb = p_pend_data->TCBPtr;
1151 while (p_tcb != (OS_TCB *)0) {
1152 p_pend_data_next = p_pend_data->NextPtr;
1156 flags_rdy = (
OS_FLAGS)(p_grp->Flags & p_tcb->FlagsPend);
1157 if (flags_rdy == p_tcb->FlagsPend) {
1158 OS_FlagTaskRdy(p_tcb,
1165 flags_rdy = (
OS_FLAGS)(p_grp->Flags & p_tcb->FlagsPend);
1167 OS_FlagTaskRdy(p_tcb,
1173 #if OS_CFG_FLAG_MODE_CLR_EN > 0u
1175 flags_rdy = (
OS_FLAGS)(~p_grp->Flags & p_tcb->FlagsPend);
1176 if (flags_rdy == p_tcb->FlagsPend) {
1177 OS_FlagTaskRdy(p_tcb,
1184 flags_rdy = (
OS_FLAGS)(~p_grp->Flags & p_tcb->FlagsPend);
1186 OS_FlagTaskRdy(p_tcb,
1197 p_pend_data = p_pend_data_next;
1198 if (p_pend_data != (OS_PEND_DATA *)0) {
1199 p_tcb = p_pend_data->TCBPtr;
1201 p_tcb = (OS_TCB *)0;
1206 if ((opt & OS_OPT_POST_NO_SCHED) == (
OS_OPT)0) {
1211 flags_cur = p_grp->Flags;
1238 void OS_FlagTaskRdy (OS_TCB *p_tcb,
1242 p_tcb->FlagsRdy = flags_rdy;
1246 switch (p_tcb->TaskState) {