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_EventSearchpevent·);ₛ
          If (legal ==ₑ 0){
              EXIT_CRITICAL;ₛ
              RETURN Void NULL
          };ₛ
          If (peventOSEventType !=ₑ OS_EVENT_TYPE_Q){
            EXIT_CRITICAL;ₛ
            RETURN Void NULL
          };ₛ
          pq =ₑ peventOSEventPtr;ₛ
          IF (pqOSQEntries >ₑ 0){
              message =ₑ ∗(pq OSQOut);ₛ
              pq OSQOut =ₑ pqOSQOut +ₑ 1 ;ₛ
              −− pqOSQEntries;ₛ
             If (pqOSQOut ==ₑ pqOSQEnd){
                 pqOSQOut =ₑ pqOSQStart
             }
          }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 OSEventFreeListOSEventListPtr
          };ₛ
          EXIT_CRITICAL;ₛ
          If (pevent !=ₑ NULL) {
              ENTER_CRITICAL;ₛ
              pq =ₑ OSQFreeList;ₛ
              pqblk =ₑ OSQFreeBlk;ₛ
              IF (pq !=ₑ NULL &&ₑ pqblk !=ₑ NULL){
                  OSQFreeList =ₑ OSQFreeListOSQPtr;ₛ
                  OSQFreeBlk =ₑ OSQFreeBlknextblk;ₛ
                  pqqfreeblk =ₑ pqblk;ₛ
                  start =ₑ pqblkmsgqueuetbl;ₛ
                  pqOSQStart =ₑ start;ₛ
                  pqOSQEnd =ₑ &ₐstart[size];ₛ
                  pqOSQIn =ₑ start;ₛ
                  pqOSQOut =ₑ start;ₛ
                  pqOSQSize =ₑ size;ₛ
                  pqOSQEntries =ₑ 0;ₛ
                  OS_EventWaitListInitpevent­);ₛ
                  peventOSEventType =ₑ OS_EVENT_TYPE_Q;ₛ
                  peventOSEventCnt =ₑ 0;ₛ
                  peventOSEventPtr =ₑ pq;ₛ
                  peventOSEventListPtr =ₑ OSEventList;ₛ
                  OSEventList =ₑ pevent;ₛ
                  EXIT_CRITICAL
              }ELSE{
                  peventOSEventListPtr =ₑ 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_EventSearchpevent·);ₛ
        If (legal ==ₑ 0){
            EXIT_CRITICAL;ₛ
            RETURN OS_ERR_PEVENT_NULL
        };ₛ
        If (peventOSEventType !=ₑ OS_EVENT_TYPE_Q){
            EXIT_CRITICAL;ₛ
             RETURN OS_ERR_EVENT_TYPE
        };ₛ
        IF (peventOSEventGrp !=ₑ 0){
            tasks_waiting =ₑ 1
        }ELSE{
            tasks_waiting =ₑ 0
        };ₛ
        IF (tasks_waiting ==ₑ 0){
            OS_EventRemovepevent­);ₛ
            pq =ₑ peventOSEventPtr;ₛ
            x =ₑ pqqfreeblk;ₛ
            xnextblk =ₑ OSQFreeBlk;ₛ
            OSQFreeBlk =ₑ pqqfreeblk;ₛ
            pqOSQPtr =ₑ OSQFreeList;ₛ
            OSQFreeList =ₑ pq;ₛ
            peventOSEventType =ₑ OS_EVENT_TYPE_UNUSED;ₛ
            peventOSEventListPtr =ₑ 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_EventSearchpevent·);ₛ
        If (legal ==ₑ 0){
            EXIT_CRITICAL;ₛ
            RETURN OS_ERR_PEVENT_NULL
        };ₛ
        If (peventOSEventType !=ₑ OS_EVENT_TYPE_Q){
            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
        };ₛ
        OSTCBCurOSTCBMsg =ₑ NULL;ₛ
        pq =ₑ peventOSEventPtr;ₛ
        If (pqOSQEntries >ₑ 0) {
            message =ₑ ∗(pqOSQOut);ₛ
            pq OSQOut =ₑ pqOSQOut +ₑ 1;ₛ
            −− pqOSQEntries;ₛ
            If (pqOSQOut ==ₑ pqOSQEnd){
                pqOSQOut =ₑ pqOSQStart
            };ₛ
            OSTCBCurOSTCBMsg =ₑ message;ₛ
            EXIT_CRITICAL;ₛ
            RETURN OS_NO_ERR
        };ₛ
        OSTCBCurOSTCBStat =ₑ OS_STAT_Q;ₛ
        OSTCBCurOSTCBDly =ₑ timeout;ₛ
        OS_EventTaskWaitpevent­);ₛ
        EXIT_CRITICAL;ₛ
        OS_Sched(­);ₛ
        ENTER_CRITICAL;ₛ
        message =ₑ OSTCBCurOSTCBMsg;ₛ
        If (message !=ₑ NULL){
          
            EXIT_CRITICAL;ₛ
            RETURN OS_NO_ERR
        };ₛ
        EXIT_CRITICAL;ₛ
        RETURN OS_TIMEOUT
   .

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

         ENTER_CRITICAL;ₛ
         message =ₑ OSTCBCurOSTCBMsg;ₛ
         OSTCBCurOSTCBMsg =ₑ 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_EventSearchpevent·);ₛ
        If (legal ==ₑ 0){
            EXIT_CRITICAL;ₛ
            RETURN OS_ERR_PEVENT_NULL
          };ₛ
        If (peventOSEventType !=ₑ OS_EVENT_TYPE_Q){
            EXIT_CRITICAL;ₛ
            RETURN OS_ERR_PEVENT_NULL
        };ₛ
        If (peventOSEventGrp !=ₑ 0) {
            x =ₑ OS_STAT_Q;ₛ
            OS_EventTaskRdypevent, message, x­);ₛ
            EXIT_CRITICAL;ₛ
            OS_Sched(­);ₛ
            RETURN OS_NO_ERR
        };ₛ
        pq =ₑ peventOSEventPtr;ₛ
        If (pqOSQEntries pqOSQSize) {
            EXIT_CRITICAL;ₛ
            RETURN OS_Q_FULL
        };ₛ
        ∗(pqOSQIn) =ₑ message;ₛ
        ++ (pqOSQIn);ₛ
        ++ (pqOSQEntries);ₛ
        If (pqOSQIn ==ₑ pqOSQEnd) {
            pqOSQIn =ₑ pqOSQStart
        };ₛ
        EXIT_CRITICAL;ₛ
        RETURN OS_NO_ERR
  .

Close Scope code_scope.