33 #define MICRIUM_SOURCE
36 #ifdef VSC_INCLUDE_SOURCE_FILE_NAMES
37 const CPU_CHAR *os_sem__c =
"$Id: $";
41 #if OS_CFG_SEM_EN > 0u
73 void OSSemCreate (OS_SEM *p_sem,
82 #ifdef OS_SAFETY_CRITICAL
83 if (p_err == (
OS_ERR *)0) {
84 OS_SAFETY_CRITICAL_EXCEPTION();
89 #ifdef OS_SAFETY_CRITICAL_IEC61508
90 if (OSSafetyCriticalStartFlag ==
DEF_TRUE) {
96 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
103 #if OS_CFG_ARG_CHK_EN > 0u
104 if (p_sem == (OS_SEM *)0) {
114 p_sem->NamePtr = p_name;
117 #if OS_CFG_DBG_EN > 0u
118 OS_SemDbgListAdd(p_sem);
162 #if OS_CFG_SEM_DEL_EN > 0u
169 OS_PEND_DATA *p_pend_data;
170 OS_PEND_LIST *p_pend_list;
177 #ifdef OS_SAFETY_CRITICAL
178 if (p_err == (
OS_ERR *)0) {
179 OS_SAFETY_CRITICAL_EXCEPTION();
184 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
191 #if OS_CFG_ARG_CHK_EN > 0u
192 if (p_sem == (OS_SEM *)0) {
207 #if OS_CFG_OBJ_TYPE_CHK_EN > 0u
215 p_pend_list = &p_sem->PendList;
216 cnt = p_pend_list->NbrEntries;
221 #if OS_CFG_DBG_EN > 0u
222 OS_SemDbgListRemove(p_sem);
238 p_pend_data = p_pend_list->HeadPtr;
239 p_tcb = p_pend_data->TCBPtr;
245 #if OS_CFG_DBG_EN > 0u
246 OS_SemDbgListRemove(p_sem);
318 OS_PEND_DATA pend_data;
323 #ifdef OS_SAFETY_CRITICAL
324 if (p_err == (
OS_ERR *)0) {
325 OS_SAFETY_CRITICAL_EXCEPTION();
330 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
337 #if OS_CFG_ARG_CHK_EN > 0u
338 if (p_sem == (OS_SEM *)0) {
353 #if OS_CFG_OBJ_TYPE_CHK_EN > 0u
360 if (p_ts != (
CPU_TS *)0) {
366 if (p_ts != (
CPU_TS *)0) {
390 (OS_PEND_OBJ *)((
void *)p_sem),
401 if (p_ts != (
CPU_TS *)0) {
408 if (p_ts != (
CPU_TS *)0) {
415 if (p_ts != (
CPU_TS *)0) {
422 if (p_ts != (
CPU_TS *)0) {
470 #if OS_CFG_SEM_PEND_ABORT_EN > 0u
475 OS_PEND_LIST *p_pend_list;
483 #ifdef OS_SAFETY_CRITICAL
484 if (p_err == (
OS_ERR *)0) {
485 OS_SAFETY_CRITICAL_EXCEPTION();
490 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
497 #if OS_CFG_ARG_CHK_EN > 0u
498 if (p_sem == (OS_SEM *)0) {
515 #if OS_CFG_OBJ_TYPE_CHK_EN > 0u
523 p_pend_list = &p_sem->PendList;
524 if (p_pend_list->NbrEntries == (
OS_OBJ_QTY)0u) {
533 while (p_pend_list->NbrEntries > (
OS_OBJ_QTY)0u) {
534 p_tcb = p_pend_list->HeadPtr->TCBPtr;
593 #ifdef OS_SAFETY_CRITICAL
594 if (p_err == (
OS_ERR *)0) {
595 OS_SAFETY_CRITICAL_EXCEPTION();
600 #if OS_CFG_ARG_CHK_EN > 0u
601 if (p_sem == (OS_SEM *)0) {
618 #if OS_CFG_OBJ_TYPE_CHK_EN > 0u
627 #if OS_CFG_ISR_POST_DEFERRED_EN > 0u
641 ctr = OS_SemPost(p_sem,
675 #if OS_CFG_SEM_SET_EN > 0u
676 void OSSemSet (OS_SEM *p_sem,
680 OS_PEND_LIST *p_pend_list;
685 #ifdef OS_SAFETY_CRITICAL
686 if (p_err == (
OS_ERR *)0) {
687 OS_SAFETY_CRITICAL_EXCEPTION();
692 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
699 #if OS_CFG_ARG_CHK_EN > 0u
700 if (p_sem == (OS_SEM *)0) {
706 #if OS_CFG_OBJ_TYPE_CHK_EN > 0u
707 if (p_sem->Type != OS_OBJ_TYPE_SEM) {
718 p_pend_list = &p_sem->PendList;
719 if (p_pend_list->NbrEntries == (
OS_OBJ_QTY)0) {
746 void OS_SemClr (OS_SEM *p_sem)
751 p_sem->NamePtr = (
CPU_CHAR *)((
void *)
"?SEM");
771 #if OS_CFG_DBG_EN > 0u
772 void OS_SemDbgListAdd (OS_SEM *p_sem)
774 p_sem->DbgNamePtr = (
CPU_CHAR *)((
void *)
" ");
775 p_sem->DbgPrevPtr = (OS_SEM *)0;
776 if (OSSemDbgListPtr == (OS_SEM *)0) {
777 p_sem->DbgNextPtr = (OS_SEM *)0;
779 p_sem->DbgNextPtr = OSSemDbgListPtr;
780 OSSemDbgListPtr->DbgPrevPtr = p_sem;
782 OSSemDbgListPtr = p_sem;
787 void OS_SemDbgListRemove (OS_SEM *p_sem)
793 p_sem_prev = p_sem->DbgPrevPtr;
794 p_sem_next = p_sem->DbgNextPtr;
796 if (p_sem_prev == (OS_SEM *)0) {
797 OSSemDbgListPtr = p_sem_next;
798 if (p_sem_next != (OS_SEM *)0) {
799 p_sem_next->DbgPrevPtr = (OS_SEM *)0;
801 p_sem->DbgNextPtr = (OS_SEM *)0;
803 }
else if (p_sem_next == (OS_SEM *)0) {
804 p_sem_prev->DbgNextPtr = (OS_SEM *)0;
805 p_sem->DbgPrevPtr = (OS_SEM *)0;
808 p_sem_prev->DbgNextPtr = p_sem_next;
809 p_sem_next->DbgPrevPtr = p_sem_prev;
810 p_sem->DbgNextPtr = (OS_SEM *)0;
811 p_sem->DbgPrevPtr = (OS_SEM *)0;
834 void OS_SemInit (
OS_ERR *p_err)
836 #ifdef OS_SAFETY_CRITICAL
837 if (p_err == (
OS_ERR *)0) {
838 OS_SAFETY_CRITICAL_EXCEPTION();
843 #if OS_CFG_DBG_EN > 0u
844 OSSemDbgListPtr = (OS_SEM *)0;
891 OS_PEND_LIST *p_pend_list;
892 OS_PEND_DATA *p_pend_data;
893 OS_PEND_DATA *p_pend_data_next;
900 p_pend_list = &p_sem->PendList;
901 if (p_pend_list->NbrEntries == (
OS_OBJ_QTY)0) {
940 cnt = p_pend_list->NbrEntries;
944 p_pend_data = p_pend_list->HeadPtr;
946 p_tcb = p_pend_data->TCBPtr;
947 p_pend_data_next = p_pend_data->NextPtr;
948 OS_Post((OS_PEND_OBJ *)((
void *)p_sem),
953 p_pend_data = p_pend_data_next;
958 if ((opt & OS_OPT_POST_NO_SCHED) == (
OS_OPT)0) {