Library os_sem




Require Import os_code_defs.
Require Import os_code_notations.
Require Import os_ucos_h.

Open Scope code_scope.

Definition OSSemAccept_impl :=
Int16u ·OSSemAccept·(pevent @ OS_EVENT)··{
        
         cnt @ Int16u;
         legal @ Int8u
        ;

        If (pevent ==ₑ NULL){
             RETURN 0
        };ₛ
        ENTER_CRITICAL;ₛ
        legal =ᶠ OS_EventSearchpevent·);ₛ
        If (legal ==ₑ 0){
            EXIT_CRITICAL;ₛ
            RETURN 0
        };ₛ
        If (peventOSEventType !=ₑ OS_EVENT_TYPE_SEM){
            EXIT_CRITICAL;ₛ
            RETURN 0
        };ₛ
        cnt =ₑ peventOSEventCnt;ₛ
        If (cnt >ₑ 0){
            −−peventOSEventCnt
        };ₛ
        EXIT_CRITICAL;ₛ
        RETURN cnt
.


Definition OSSemCreate_impl :=
OS_EVENT ·OSSemCreate·(cnt @ Int16u)··{
           pevent @ OS_EVENT;

            ENTER_CRITICAL;ₛ
            pevent =ₑ OSEventFreeList;ₛ
            If (OSEventFreeList !=ₑ NULL){
                OSEventFreeList =ₑ OS_EVENT OSEventFreeListOSEventListPtr
            };ₛ
           If (pevent !=ₑ NULL) {
               OS_EventWaitListInitpevent­);ₛ
               peventOSEventType =ₑ OS_EVENT_TYPE_SEM;ₛ
               peventOSEventCnt =ₑ cnt;ₛ
               peventOSEventPtr =ₑ NULL;ₛ
               peventOSEventListPtr =ₑ OSEventList;ₛ
               OSEventList =ₑ pevent
           };ₛ
           EXIT_CRITICAL;ₛ
           RETURN pevent
 .

Definition OSSemDel_impl :=
Int8u ·OSSemDel·(pevent @ OS_EVENT)··{
           
             tasks_waiting @ Int8u ;
             legal @ Int8u
           ;

            If (pevent ==ₑ NULL){
                RETURN OS_ERR_PEVENT_NULL
            };ₛ
            ENTER_CRITICAL;ₛ
            legal =ᶠ OS_EventSearchpevent·);ₛ
            If (legal ==ₑ 0){
                EXIT_CRITICAL;ₛ
                RETURN OS_ERR_PEVENT_NULL
            };ₛ
            If (peventOSEventType !=ₑ OS_EVENT_TYPE_SEM){
                EXIT_CRITICAL;ₛ
                RETURN OS_ERR_EVENT_TYPE
            };ₛ
            IF (peventOSEventGrp !=ₑ 0){
                tasks_waiting =ₑ 1
            }ELSE{
                tasks_waiting =ₑ 0
            };ₛ
            IF (tasks_waiting ==ₑ 0){
                OS_EventRemovepevent­);ₛ
                peventOSEventType =ₑ OS_EVENT_TYPE_UNUSED;ₛ
                peventOSEventListPtr =ₑ OSEventFreeList;ₛ
                OSEventFreeList =ₑ pevent;ₛ
                EXIT_CRITICAL;ₛ
                RETURN OS_NO_ERR
            }ELSE{
                EXIT_CRITICAL;ₛ
                RETURN OS_ERR_TASK_WAITING
            }
.

Definition OSSemPend_impl :=
Int8u ·OSSemPend·(pevent @ OS_EVENT; timeout @ Int16u)··{
       legal @ Int8u;


        If (pevent ==ₑ NULL){
            RETURN OS_ERR_PEVENT_NULL
        };ₛ
        ENTER_CRITICAL;ₛ
        legal =ᶠ OS_EventSearchpevent·);ₛ
        If (legal ==ₑ 0){
            EXIT_CRITICAL;ₛ
            RETURN OS_ERR_PEVENT_NULL
        };ₛ
        If (peventOSEventType !=ₑ OS_EVENT_TYPE_SEM){
            EXIT_CRITICAL;ₛ
            RETURN OS_ERR_PEVENT_NULL
        };ₛ
        If (OSTCBCurOSTCBPrio ==ₑ OS_IDLE_PRIO){
            EXIT_CRITICAL;ₛ
            RETURN OS_ERR_PEVENT_NULL
        };ₛ
        If ( (OSTCBCurOSTCBStat !=ₑ OS_STAT_RDY) ||ₑ (OSTCBCurOSTCBDly !=ₑ 0)){
            EXIT_CRITICAL;ₛ
            RETURN OS_ERR_PEVENT_NULL
        };ₛ
        If (peventOSEventCnt >ₑ 0){
            −−peventOSEventCnt;ₛ
            EXIT_CRITICAL;ₛ
            RETURN OS_NO_ERR
        };ₛ
        If (OSTCBCurOSTCBMsg !=ₑ NULL) {
            EXIT_CRITICAL;ₛ
            RETURN OS_ERR_PEVENT_NULL
        };ₛ
        OSTCBCurOSTCBStat =ₑ OS_STAT_SEM;ₛ
        OSTCBCurOSTCBDly =ₑ timeout;ₛ
        OS_EventTaskWaitpevent­);ₛ
        EXIT_CRITICAL;ₛ
        OS_Sched(­);ₛ
        ENTER_CRITICAL;ₛ
        If (OSTCBCurOSTCBMsg ==ₑ NULL) {
            EXIT_CRITICAL;ₛ
            RETURN OS_TIMEOUT
        };ₛ
        EXIT_CRITICAL;ₛ
        RETURN OS_NO_ERR
.

Definition OSSemPost_impl :=
Int8u ·OSSemPost·(pevent @ OS_EVENT)··{
       
         legal @ Int8u;
         x @ Int8u
       ;


        If (pevent ==ₑ NULL){
            RETURN OS_ERR_PEVENT_NULL
        };ₛ
        ENTER_CRITICAL;ₛ
        legal =ᶠ OS_EventSearchpevent·);ₛ
        If (legal ==ₑ 0){
            EXIT_CRITICAL;ₛ
            RETURN OS_ERR_PEVENT_NULL
        };ₛ
        If (peventOSEventType !=ₑ OS_EVENT_TYPE_SEM){
            EXIT_CRITICAL;ₛ
            RETURN OS_ERR_PEVENT_NULL
        };ₛ
        If (peventOSEventGrp !=ₑ 0){
            x =ₑ OS_STAT_SEM;ₛ
            OS_EventTaskRdypevent, Void pevent, x­);ₛ
            EXIT_CRITICAL;ₛ
            OS_Sched(­);ₛ
            RETURN OS_NO_ERR
        };ₛ
        If (peventOSEventCnt <ₑ 65535){
            peventOSEventCnt =ₑ peventOSEventCnt +ₑ 1;ₛ
            EXIT_CRITICAL;ₛ
            RETURN OS_NO_ERR
        };ₛ
        EXIT_CRITICAL;ₛ
        RETURN OS_SEM_OVF
.

Close Scope code_scope.