Library os_q




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

Open Scope code_scope.

Definition OSQAccept_impl :=
 Void ∗ ·OSQAccept·(⌞pevent @ OS_EVENT∗⌟)··{
        ⌞
          message @ Void ∗;
          pq @ OS_Q ∗ ;
          legal @ Int8u
        ⌟;
               
          If(pevent′ ==ₑ NULL){
              RETURN 〈Void ∗〉 NULL
          };ₛ
          ENTER_CRITICAL;ₛ
          legal′ =ᶠ OS_EventSearch(·pevent′·);ₛ
          If (legal′ ==ₑ ′0){
              EXIT_CRITICAL;ₛ
              RETURN 〈Void ∗〉 NULL
          };ₛ
          If (pevent′→OSEventType !=ₑ ′OS_EVENT_TYPE_Q){
            EXIT_CRITICAL;ₛ
            RETURN 〈Void ∗〉 NULL
          };ₛ
          pq′ =ₑ pevent′→OSEventPtr;ₛ
          IF (pq′→OSQEntries >ₑ ′0){
              message′ =ₑ ∗(pq′→ OSQOut);ₛ
              pq′ → OSQOut =ₑ pq′→OSQOut +ₑ ′1 ;ₛ
              −− pq′→OSQEntries;ₛ
             If (pq′→OSQOut ==ₑ pq′→OSQEnd){
                 pq′→OSQOut =ₑ pq′→OSQStart
             }
          }ELSE{
              message′ =ₑ NULL
          };ₛ
          EXIT_CRITICAL;ₛ
          RETURN message′
 }· .

Definition OSQCreate_impl :=
 OS_EVENT ∗ ·OSQCreate·(⌞size @ Int16u⌟)··{
        ⌞
          pevent @ OS_EVENT ∗;
          pq @ OS_Q ∗;
          pqblk @ OS_Q_FREEBLK ∗;
          start @ Void ∗∗
        ⌟;

          If ((size′ >ₑ ′OS_MAX_Q_SIZE ) ||ₑ (size′ ==ₑ ′0)){
              RETURN 〈OS_EVENT ∗〉 NULL
          };ₛ
          ENTER_CRITICAL;ₛ
          pevent′ =ₑ OSEventFreeList′;ₛ
          If (OSEventFreeList′ !=ₑ NULL){
              OSEventFreeList′ =ₑ 〈OS_EVENT ∗〉 OSEventFreeList′→OSEventListPtr
          };ₛ
          EXIT_CRITICAL;ₛ
          If (pevent′ !=ₑ NULL) {
              ENTER_CRITICAL;ₛ
              pq′ =ₑ OSQFreeList′;ₛ
              pqblk′ =ₑ OSQFreeBlk′;ₛ
              IF (pq′ !=ₑ NULL &&ₑ pqblk′ !=ₑ NULL){
                  OSQFreeList′ =ₑ OSQFreeList′→OSQPtr;ₛ
                  OSQFreeBlk′ =ₑ OSQFreeBlk′→nextblk;ₛ
                  pq′→qfreeblk =ₑ pqblk′;ₛ
                  start′ =ₑ pqblk′→msgqueuetbl;ₛ
                  pq′→OSQStart =ₑ start′;ₛ
                  pq′→OSQEnd =ₑ &ₐstart′[size′];ₛ
                  pq′→OSQIn =ₑ start′;ₛ
                  pq′→OSQOut =ₑ start′;ₛ
                  pq′→OSQSize =ₑ size′;ₛ
                  pq′→OSQEntries =ₑ ′0;ₛ
                  OS_EventWaitListInit(­pevent′­);ₛ
                  pevent′→OSEventType =ₑ ′OS_EVENT_TYPE_Q;ₛ
                  pevent′→OSEventCnt =ₑ ′0;ₛ
                  pevent′→OSEventPtr =ₑ pq′;ₛ
                  pevent′→OSEventListPtr =ₑ OSEventList′;ₛ
                  OSEventList′ =ₑ pevent′;ₛ
                  EXIT_CRITICAL
              }ELSE{
                  pevent′→OSEventListPtr =ₑ 〈Void∗〉 OSEventFreeList′;ₛ
                  OSEventFreeList′ =ₑ pevent′;ₛ
                  EXIT_CRITICAL;ₛ
                  pevent′ =ₑ NULL
              }
          };ₛ
          RETURN pevent′
 }· .

Definition OSQDel_impl :=
 Int8u ·OSQDel·(⌞ pevent @ OS_EVENT ∗⌟)··{
        ⌞
         tasks_waiting @ Int8u;
         pq @ OS_Q ∗;
         x @ OS_Q_FREEBLK ∗;
         legal @ Int8u
        ⌟;
         
        If (pevent′ ==ₑ NULL){
             RETURN ′OS_ERR_PEVENT_NULL
        };ₛ
        ENTER_CRITICAL;ₛ
        legal′ =ᶠ OS_EventSearch(·pevent′·);ₛ
        If (legal′ ==ₑ ′0){
            EXIT_CRITICAL;ₛ
            RETURN ′OS_ERR_PEVENT_NULL
        };ₛ
        If (pevent′→OSEventType !=ₑ ′OS_EVENT_TYPE_Q){
            EXIT_CRITICAL;ₛ
             RETURN ′OS_ERR_EVENT_TYPE
        };ₛ
        IF (pevent′→OSEventGrp !=ₑ ′0){
            tasks_waiting′ =ₑ ′1
        }ELSE{
            tasks_waiting′ =ₑ ′0
        };ₛ
        IF (tasks_waiting′ ==ₑ ′0){
            OS_EventRemove(­pevent′­);ₛ
            pq′ =ₑ pevent′→OSEventPtr;ₛ
            x′ =ₑ pq′→qfreeblk;ₛ
            x′→nextblk =ₑ OSQFreeBlk′;ₛ
            OSQFreeBlk′ =ₑ pq′→qfreeblk;ₛ
            pq′→OSQPtr =ₑ OSQFreeList′;ₛ
            OSQFreeList′ =ₑ pq′;ₛ
            pevent′→OSEventType =ₑ ′OS_EVENT_TYPE_UNUSED;ₛ
            pevent′→OSEventListPtr =ₑ OSEventFreeList′;ₛ
            OSEventFreeList′ =ₑ pevent′;ₛ
            EXIT_CRITICAL;ₛ
            RETURN ′OS_NO_ERR
        }ELSE{
            EXIT_CRITICAL;ₛ
            RETURN ′OS_ERR_TASK_WAITING
        }
 }· .

Definition OSQPend_impl :=
 Int8u ·OSQPend·(⌞ pevent @ OS_EVENT ∗; timeout @ Int16u ⌟)··{
         ⌞
         message @ Void∗;
         pq @ OS_Q ∗;
         legal @ Int8u
        ⌟;

        If (pevent′ ==ₑ NULL){
             RETURN ′OS_ERR_PEVENT_NULL
        };ₛ
        ENTER_CRITICAL;ₛ
        legal′ =ᶠ OS_EventSearch(·pevent′·);ₛ
        If (legal′ ==ₑ ′0){
            EXIT_CRITICAL;ₛ
            RETURN ′OS_ERR_PEVENT_NULL
        };ₛ
        If (pevent′→OSEventType !=ₑ ′OS_EVENT_TYPE_Q){
            EXIT_CRITICAL;ₛ
            RETURN ′OS_ERR_PEVENT_NULL
        };ₛ
        If (OSTCBCur′→OSTCBPrio ==ₑ ′OS_IDLE_PRIO){
            EXIT_CRITICAL;ₛ
            RETURN ′OS_ERR_PEVENT_NULL
        };ₛ
        If ( (OSTCBCur′→OSTCBStat !=ₑ ′OS_STAT_RDY) ||ₑ (OSTCBCur′→OSTCBDly !=ₑ ′0)){
            EXIT_CRITICAL;ₛ
            RETURN ′OS_ERR_PEVENT_NULL
        };ₛ
        OSTCBCur′→OSTCBMsg =ₑ NULL;ₛ
        pq′ =ₑ pevent′→OSEventPtr;ₛ
        If (pq′→OSQEntries >ₑ ′0) {
            message′ =ₑ ∗(pq′→OSQOut);ₛ
            pq′→ OSQOut =ₑ pq′→OSQOut +ₑ ′1;ₛ
            −− pq′→OSQEntries;ₛ
            If (pq′→OSQOut ==ₑ pq′→OSQEnd){
                pq′→OSQOut =ₑ pq′→OSQStart
            };ₛ
            OSTCBCur′→OSTCBMsg =ₑ message′;ₛ
            EXIT_CRITICAL;ₛ
            RETURN ′OS_NO_ERR
        };ₛ
        OSTCBCur′→OSTCBStat =ₑ ′OS_STAT_Q;ₛ
        OSTCBCur′→OSTCBDly =ₑ timeout′;ₛ
        OS_EventTaskWait(­pevent′­);ₛ
        EXIT_CRITICAL;ₛ
        OS_Sched(­);ₛ
        ENTER_CRITICAL;ₛ
        message′ =ₑ OSTCBCur′→OSTCBMsg;ₛ
        If (message′ !=ₑ NULL){
          
            EXIT_CRITICAL;ₛ
            RETURN ′OS_NO_ERR
        };ₛ
        EXIT_CRITICAL;ₛ
        RETURN ′OS_TIMEOUT
  }· .

Definition OSQGetMsg_impl :=
 Void∗ ·OSQGetMsg·(⌞ ⌟)··{
         ⌞
           message @ Void∗
         ⌟;

         ENTER_CRITICAL;ₛ
         message′ =ₑ OSTCBCur′→OSTCBMsg;ₛ
         OSTCBCur′→OSTCBMsg =ₑ NULL;ₛ
         EXIT_CRITICAL;ₛ
         RETURN message′
 }· .

Definition OSQPost_impl :=
 Int8u ·OSQPost·(⌞pevent @ OS_EVENT∗ ; message @ Void∗⌟)··{
        ⌞
         pq @ OS_Q∗;
         legal @ Int8u;
         x @ Int8u
        ⌟;
        
        If (pevent′ ==ₑ NULL){
           RETURN ′OS_ERR_PEVENT_NULL
        };ₛ
        If (message′ ==ₑ NULL){
          RETURN ′OS_ERR_POST_NULL_PTR
        };ₛ
        ENTER_CRITICAL;ₛ
        legal′ =ᶠ OS_EventSearch(·pevent′·);ₛ
        If (legal′ ==ₑ ′0){
            EXIT_CRITICAL;ₛ
            RETURN ′OS_ERR_PEVENT_NULL
          };ₛ
        If (pevent′→OSEventType !=ₑ ′OS_EVENT_TYPE_Q){
            EXIT_CRITICAL;ₛ
            RETURN ′OS_ERR_PEVENT_NULL
        };ₛ
        If (pevent′→OSEventGrp !=ₑ ′0) {
            x′ =ₑ ′OS_STAT_Q;ₛ
            OS_EventTaskRdy(­pevent′, message′, x′­);ₛ
            EXIT_CRITICAL;ₛ
            OS_Sched(­);ₛ
            RETURN ′OS_NO_ERR
        };ₛ
        pq′ =ₑ pevent′→OSEventPtr;ₛ
        If (pq′→OSQEntries ≥ pq′→OSQSize) {
            EXIT_CRITICAL;ₛ
            RETURN ′OS_Q_FULL
        };ₛ
        ∗(pq′→OSQIn) =ₑ message′;ₛ
        ++ (pq′→OSQIn);ₛ
        ++ (pq′→OSQEntries);ₛ
        If (pq′→OSQIn ==ₑ pq′→OSQEnd) {
            pq′→OSQIn =ₑ pq′→OSQStart
        };ₛ
        EXIT_CRITICAL;ₛ
        RETURN ′OS_NO_ERR
 }· .

Close Scope code_scope.