33 #define MICRIUM_SOURCE
36 #ifdef VSC_INCLUDE_SOURCE_FILE_NAMES
37 const CPU_CHAR *os_mutex__c =
"$Id: $";
41 #if OS_CFG_MUTEX_EN > 0u
67 void OSMutexCreate (OS_MUTEX *p_mutex,
75 #ifdef OS_SAFETY_CRITICAL
76 if (p_err == (
OS_ERR *)0) {
77 OS_SAFETY_CRITICAL_EXCEPTION();
82 #ifdef OS_SAFETY_CRITICAL_IEC61508
83 if (OSSafetyCriticalStartFlag ==
DEF_TRUE) {
89 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
96 #if OS_CFG_ARG_CHK_EN > 0u
97 if (p_mutex == (OS_MUTEX *)0) {
105 p_mutex->NamePtr = p_name;
106 p_mutex->OwnerTCBPtr = (OS_TCB *)0;
112 #if OS_CFG_DBG_EN > 0u
113 OS_MutexDbgListAdd(p_mutex);
159 #if OS_CFG_MUTEX_DEL_EN > 0u
166 OS_PEND_DATA *p_pend_data;
167 OS_PEND_LIST *p_pend_list;
175 #ifdef OS_SAFETY_CRITICAL
176 if (p_err == (
OS_ERR *)0) {
177 OS_SAFETY_CRITICAL_EXCEPTION();
182 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
189 #if OS_CFG_ARG_CHK_EN > 0u
190 if (p_mutex == (OS_MUTEX *)0) {
205 #if OS_CFG_OBJ_TYPE_CHK_EN > 0u
213 p_pend_list = &p_mutex->PendList;
214 cnt = p_pend_list->NbrEntries;
219 #if OS_CFG_DBG_EN > 0u
220 OS_MutexDbgListRemove(p_mutex);
223 OS_MutexClr(p_mutex);
233 p_tcb_owner = p_mutex->OwnerTCBPtr;
234 if ((p_tcb_owner != (OS_TCB *)0) &&
235 (p_tcb_owner->Prio != p_mutex->OwnerOriginalPrio)) {
236 switch (p_tcb_owner->TaskState) {
239 p_tcb_owner->Prio = p_mutex->OwnerOriginalPrio;
247 p_tcb_owner->Prio = p_mutex->OwnerOriginalPrio;
255 p_mutex->OwnerOriginalPrio);
267 p_pend_data = p_pend_list->HeadPtr;
268 p_tcb = p_pend_data->TCBPtr;
274 #if OS_CFG_DBG_EN > 0u
275 OS_MutexDbgListRemove(p_mutex);
278 OS_MutexClr(p_mutex);
339 void OSMutexPend (OS_MUTEX *p_mutex,
345 OS_PEND_DATA pend_data;
351 #ifdef OS_SAFETY_CRITICAL
352 if (p_err == (
OS_ERR *)0) {
353 OS_SAFETY_CRITICAL_EXCEPTION();
358 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
365 #if OS_CFG_ARG_CHK_EN > 0u
366 if (p_mutex == (OS_MUTEX *)0) {
381 #if OS_CFG_OBJ_TYPE_CHK_EN > 0u
388 if (p_ts != (
CPU_TS *)0) {
397 if (p_ts != (
CPU_TS *)0) {
406 p_mutex->OwnerNestingCtr++;
407 if (p_ts != (
CPU_TS *)0) {
428 p_tcb = p_mutex->OwnerTCBPtr;
430 switch (p_tcb->TaskState) {
460 (OS_PEND_OBJ *)((
void *)p_mutex),
471 if (p_ts != (
CPU_TS *)0) {
478 if (p_ts != (
CPU_TS *)0) {
485 if (p_ts != (
CPU_TS *)0) {
492 if (p_ts != (
CPU_TS *)0) {
537 #if OS_CFG_MUTEX_PEND_ABORT_EN > 0u
538 OS_OBJ_QTY OSMutexPendAbort (OS_MUTEX *p_mutex,
542 OS_PEND_LIST *p_pend_list;
550 #ifdef OS_SAFETY_CRITICAL
551 if (p_err == (
OS_ERR *)0) {
552 OS_SAFETY_CRITICAL_EXCEPTION();
557 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
564 #if OS_CFG_ARG_CHK_EN > 0u
565 if (p_mutex == (OS_MUTEX *)0) {
582 #if OS_CFG_OBJ_TYPE_CHK_EN > 0u
590 p_pend_list = &p_mutex->PendList;
591 if (p_pend_list->NbrEntries == (
OS_OBJ_QTY)0u) {
600 while (p_pend_list->NbrEntries > (
OS_OBJ_QTY)0u) {
601 p_tcb = p_pend_list->HeadPtr->TCBPtr;
648 void OSMutexPost (OS_MUTEX *p_mutex,
652 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_mutex == (OS_MUTEX *)0) {
680 case OS_OPT_POST_NO_SCHED:
689 #if OS_CFG_OBJ_TYPE_CHK_EN > 0u
706 p_mutex->OwnerNestingCtr--;
713 p_pend_list = &p_mutex->PendList;
714 if (p_pend_list->NbrEntries == (
OS_OBJ_QTY)0) {
715 p_mutex->OwnerTCBPtr = (OS_TCB *)0;
722 if (
OSTCBCurPtr->Prio != p_mutex->OwnerOriginalPrio) {
730 p_tcb = p_pend_list->HeadPtr->TCBPtr;
731 p_mutex->OwnerTCBPtr = p_tcb;
732 p_mutex->OwnerOriginalPrio = p_tcb->Prio;
735 OS_Post((OS_PEND_OBJ *)((
void *)p_mutex),
743 if ((opt & OS_OPT_POST_NO_SCHED) == (
OS_OPT)0) {
767 void OS_MutexClr (OS_MUTEX *p_mutex)
770 p_mutex->NamePtr = (
CPU_CHAR *)((
void *)
"?MUTEX");
771 p_mutex->OwnerTCBPtr = (OS_TCB *)0;
794 #if OS_CFG_DBG_EN > 0u
795 void OS_MutexDbgListAdd (OS_MUTEX *p_mutex)
797 p_mutex->DbgNamePtr = (
CPU_CHAR *)((
void *)
" ");
798 p_mutex->DbgPrevPtr = (OS_MUTEX *)0;
799 if (OSMutexDbgListPtr == (OS_MUTEX *)0) {
800 p_mutex->DbgNextPtr = (OS_MUTEX *)0;
802 p_mutex->DbgNextPtr = OSMutexDbgListPtr;
803 OSMutexDbgListPtr->DbgPrevPtr = p_mutex;
805 OSMutexDbgListPtr = p_mutex;
810 void OS_MutexDbgListRemove (OS_MUTEX *p_mutex)
812 OS_MUTEX *p_mutex_next;
813 OS_MUTEX *p_mutex_prev;
816 p_mutex_prev = p_mutex->DbgPrevPtr;
817 p_mutex_next = p_mutex->DbgNextPtr;
819 if (p_mutex_prev == (OS_MUTEX *)0) {
820 OSMutexDbgListPtr = p_mutex_next;
821 if (p_mutex_next != (OS_MUTEX *)0) {
822 p_mutex_next->DbgPrevPtr = (OS_MUTEX *)0;
824 p_mutex->DbgNextPtr = (OS_MUTEX *)0;
826 }
else if (p_mutex_next == (OS_MUTEX *)0) {
827 p_mutex_prev->DbgNextPtr = (OS_MUTEX *)0;
828 p_mutex->DbgPrevPtr = (OS_MUTEX *)0;
831 p_mutex_prev->DbgNextPtr = p_mutex_next;
832 p_mutex_next->DbgPrevPtr = p_mutex_prev;
833 p_mutex->DbgNextPtr = (OS_MUTEX *)0;
834 p_mutex->DbgPrevPtr = (OS_MUTEX *)0;
857 void OS_MutexInit (
OS_ERR *p_err)
859 #ifdef OS_SAFETY_CRITICAL
860 if (p_err == (
OS_ERR *)0) {
861 OS_SAFETY_CRITICAL_EXCEPTION();
866 #if OS_CFG_DBG_EN > 0u
867 OSMutexDbgListPtr = (OS_MUTEX *)0;