Library os_core



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

Open Scope code_scope.

Definition OSInit_impl :=
 Void ·OSInit·( )··{
        ;
        
      OSInitHookBegin(­);ₛ
      OS_InitMisc(­);ₛ
      OS_InitRdyList(­);ₛ
      OS_InitSTKList(­);ₛ
      OS_InitTCBList(­);ₛ
      OS_InitEventList(­);ₛ
      OS_QInit(­);ₛ
      OS_SemInit(­);ₛ
      OS_InitTaskIdle(­);ₛ
      OSInitHookEnd(­);ₛ
      RETURN
 .

Definition OSStart_impl:=
 Void ·OSStart·( )··{
       
        y @ Int8u;
        x @ Int8u
       ;

       If (OSRunning ==ₑ CFalse) {
           y =ₑ OSUnMapTbl[OSRdyGrp];ₛ
           x =ₑ OSUnMapTbl[OSRdyTbl[y]];ₛ
           OSPrioHighRdy =ₑ Int8u ((y 3) +ₑ x);ₛ
           OSPrioCur =ₑ OSPrioHighRdy;ₛ
           OSTCBHighRdy =ₑ OSTCBPrioTbl[OSPrioHighRdy];ₛ
           OSTCBCur =ₑ OSTCBHighRdy;ₛ
           OSStartHighRdy(­)
       };ₛ
       RETURN
 .

Definition OSIntEnter_impl :=
 Void ·OSIntEnter·( )··{
        ;

       If (OSRunning ==ₑ CTrue) {
           If (OSIntNesting <ₑ 255){
                ++ OSIntNesting
           }
       };ₛ
       RETURN
 .

Definition OSVersion_impl :=
 Int32 ·OSVersion·( )··{
        ;

       RETURN OS_VERSION
 .

Definition OSIntExit_impl :=
 Void ·OSIntExit·( )··{
       x @ Int32;
        
         ENTER_CRITICAL;ₛ
         x <- CHECKIS;ₛ
         If (x ==ₑ 1){
               OSIntExitY =ₑ OSUnMapTbl[OSRdyGrp];ₛ
               OSPrioHighRdy =ₑ (OSIntExitY 3) +ₑ
                                                        OSUnMapTbl[OSRdyTbl[OSIntExitY]];ₛ
                                                                                               OSPrioCur =ₑ OSTCBCurOSTCBPrio;ₛ
               If (OSPrioHighRdy !=ₑ OSPrioCur) {
                   OSTCBHighRdy =ₑ OSTCBPrioTbl[OSPrioHighRdy];ₛ
                   ++OSCtxSwCtr;ₛ
                   SWITCH
               };ₛ
               EXIT_CRITICAL;ₛ
               RETURN
          };ₛ
          EXIT_CRITICAL;ₛ
          RETURN
 .

Definition OSTimeTick_impl :=
 Void ·OSTimeTick·( )··{
        ptcb @ OS_TCB;
         pevent @ OS_EVENT;
         ptbl @ Tptr Int8u;
         
        ++OSTime;ₛ
        ptcb =ₑ OSTCBList;ₛ
        WHILE (ptcb !=ₑ NULL) {
          If (ptcb OSTCBDly !=ₑ 0){
               ptcbOSTCBDly =ₑ (ptcbOSTCBDly) 1;ₛ
               If (ptcbOSTCBDly ==ₑ 0) {
                 OSRdyGrp =ₑ OSRdyGrp |ₑ ptcbOSTCBBitY;ₛ
                 OSRdyTbl[ptcbOSTCBY] =ₑ OSRdyTbl[ptcbOSTCBY] |ₑ ptcbOSTCBBitX;ₛ
                 ptcbOSTCBStat =ₑ OS_STAT_RDY;ₛ
                 pevent =ₑ ptcbOSTCBEventPtr;ₛ
                 If (pevent !=ₑ NULL){
                   ptbl =ₑ peventOSEventTbl;ₛ
                   ptbl[ptcbOSTCBY] =ₑ
                           ptbl[ptcbOSTCBY] &ₑ (ptcbOSTCBBitX);ₛ
                   If (ptbl[ptcbOSTCBY] ==ₑ 0) {
                     peventOSEventGrp &= ptcbOSTCBBitY
                   };ₛ
                   ptcbOSTCBEventPtr =ₑ NULL
                 }
               }
           };ₛ
           ptcb =ₑ ptcbOSTCBNext
        };ₛ
        RETURN
 .

Definition OS_EventTaskRdy_impl :=
Int8u ·OS_EventTaskRdy·(pevent @ OS_EVENT; message @ Void ; msk @ Int8u)··{
       
        ptcb @ OS_TCB;
        x @ Int8u;
        y @ Int8u;
        bitx @ Int8u;
        bity @ Int8u;
        prio @ Int8u
       ;

       y =ₑ OSUnMapTbl[peventOSEventGrp];ₛ
       bity =ₑ OSMapTbl[y];ₛ
       x =ₑ OSUnMapTbl[peventOSEventTbl[y]];ₛ
       bitx =ₑ OSMapTbl[x];ₛ
       prio =ₑ ((y 3) +ₑ x);ₛ
       peventOSEventTbl[y] =ₑ peventOSEventTbl[y] &ₑ (bitx);ₛ
       If (peventOSEventTbl[y] ==ₑ 0) {
           peventOSEventGrp =ₑ peventOSEventGrp &ₑ (bity)
       };ₛ
       ptcb =ₑ OSTCBPrioTbl[prio];ₛ
       ptcbOSTCBDly =ₑ 0;ₛ
       ptcbOSTCBEventPtr =ₑ NULL;ₛ
       ptcbOSTCBMsg =ₑ message;ₛ
       ptcbOSTCBStat =ₑ (ptcbOSTCBStat) &ₑ (msk);ₛ
       If (ptcbOSTCBStat ==ₑ OS_STAT_RDY){
         OSRdyGrp =ₑ OSRdyGrp |ₑ bity;ₛ
         OSRdyTbl[y] =ₑ OSRdyTbl[y] |ₑ bitx
       };ₛ
       RETURN prio
 .

Definition OS_EventTaskWait_impl :=
Void ·OS_EventTaskWait·(pevent @ OS_EVENT)··{
        ;

       OSTCBCurOSTCBEventPtr =ₑ pevent;ₛ
       OSRdyTbl[OSTCBCurOSTCBY] =ₑ
                 OSRdyTbl[OSTCBCurOSTCBY] &ₑ (OSTCBCurOSTCBBitX);ₛ
       If (OSRdyTbl[OSTCBCurOSTCBY] ==ₑ 0) {
           OSRdyGrp =ₑ OSRdyGrp &ₑ (OSTCBCurOSTCBBitY)
       };ₛ
       peventOSEventTbl[OSTCBCurOSTCBY] =ₑ
               peventOSEventTbl[OSTCBCurOSTCBY] |ₑ OSTCBCurOSTCBBitX;ₛ
       peventOSEventGrp =ₑ peventOSEventGrp |ₑ OSTCBCurOSTCBBitY;ₛ
       RETURN
.

Definition OS_EventTO_impl :=
Void ·OS_EventTO·(pevent @ OS_EVENT)··{
        ;

       peventOSEventTbl[OSTCBCurOSTCBY] =ₑ
          peventOSEventTbl[OSTCBCurOSTCBY] &ₑ (OSTCBCurOSTCBBitX);ₛ
       If (peventOSEventTbl[OSTCBCurOSTCBY] ==ₑ 0) {
          peventOSEventGrp &= OSTCBCurOSTCBBitY
       };ₛ
       OSTCBCurOSTCBStat =ₑ OS_STAT_RDY;ₛ
       OSTCBCurOSTCBEventPtr =ₑ NULL;ₛ
       RETURN
.

Definition OS_Sched_impl :=
Void ·OS_Sched·( )··{
       y @ Int8u;

        ENTER_CRITICAL;ₛ
        y =ₑ OSUnMapTbl[OSRdyGrp];ₛ
        OSPrioHighRdy =ₑ ((y 3) +ₑ OSUnMapTbl[OSRdyTbl[y]]);ₛ
        OSPrioCur =ₑ OSTCBCurOSTCBPrio;ₛ
        If (OSPrioHighRdy !=ₑ OSPrioCur) {
            OSTCBHighRdy =ₑ OSTCBPrioTbl[OSPrioHighRdy];ₛ
            ++ OSCtxSwCtr;ₛ
            SWITCH
        };ₛ
        EXIT_CRITICAL;ₛ
        RETURN
.

Definition OS_TaskIdle_impl :=
Void · OS_TaskIdle·( )··{
        ;

       WHILE(1) {
           ENTER_CRITICAL;ₛ
           OSIdleCtr =ₑ OSIdleCtr +ₑ 1;ₛ
           EXIT_CRITICAL
       };ₛ
       RETURN
.

Definition OS_EventWaitListInit_impl :=
Void · OS_EventWaitListInit·(pevent @ OS_EVENT )··{
       ptbl @ Int8u;

       peventOSEventGrp =ₑ 0;ₛ
       ptbl =ₑ &ₐ peventOSEventTbl[0];ₛ
       ptbl =ₑ 0;ₛ
       ++ ptbl;ₛ
       ptbl =ₑ 0;ₛ
       ++ ptbl;ₛ
       ptbl =ₑ 0;ₛ
       ++ ptbl;ₛ
       ptbl =ₑ 0;ₛ
       ++ ptbl;ₛ
       ptbl =ₑ 0;ₛ
       ++ ptbl;ₛ
       ptbl =ₑ 0;ₛ
       ++ ptbl;ₛ
       ptbl =ₑ 0;ₛ
       ++ ptbl;ₛ
       ptbl =ₑ 0;ₛ
       RETURN
.

Definition OS_InitEventList_impl :=
Void ·OS_InitEventList·(⌞⌟)··{
      
      i @ Int16u;
      pevent1 @ OS_EVENT;
      pevent2 @ OS_EVENT
     ;

      pevent1 =ₑ &ₐ OSEventTbl[0];ₛ
      pevent2 =ₑ &ₐ OSEventTbl[1];ₛ
      i =ₑ 0;ₛ
      WHILE (i <ₑ (OS_MAX_EVENTS 1)) {
          pevent1OSEventType =ₑ OS_EVENT_TYPE_UNUSED;ₛ
          pevent1OSEventListPtr =ₑ pevent2;ₛ
          pevent1OSEventPtr =ₑ NULL;ₛ
          ++ pevent1;ₛ
          ++ pevent2;ₛ
          ++ i
      };ₛ
      pevent1OSEventType =ₑ OS_EVENT_TYPE_UNUSED;ₛ
      pevent1OSEventPtr =ₑ NULL;ₛ
      pevent1OSEventListPtr =ₑ NULL;ₛ
      OSEventFreeList =ₑ &ₐ OSEventTbl[0];ₛ
      OSEventList =ₑ NULL;ₛ
      RETURN
.

Definition OS_InitMisc_impl :=
 Void ·OS_InitMisc·( )··{
        ;

       OSTime =ₑ 0;ₛ


       OSTaskCtr =ₑ 0;ₛ
       OSRunning =ₑ CFalse;ₛ
       OSCtxSwCtr =ₑ 0;ₛ
       OSIdleCtr =ₑ 0;ₛ
       OSIdleCtrRun =ₑ 0;ₛ
       OSIdleCtrMax =ₑ 0;ₛ
       OSStatRdy =ₑ CFalse;ₛ
       RETURN
 .

Definition OS_InitRdyList_impl :=
 Void ·OS_InitRdyList·( )··{
       i @ Int16u; prdytbl @ Int8u;

        OSRdyGrp =ₑ 0;ₛ
        prdytbl =ₑ &ₐ OSRdyTbl[0];ₛ
        i =ₑ 0;ₛ
        WHILE (i <ₑ OS_RDY_TBL_SIZE) {
          prdytbl =ₑ 0 ;ₛ
           ++ prdytbl;ₛ
           ++ i
        };ₛ
        OSPrioCur =ₑ 0;ₛ
        OSPrioHighRdy =ₑ 0;ₛ
        OSTCBHighRdy =ₑ NULL;ₛ
        OSTCBCur =ₑ NULL;ₛ
        RETURN
 .

Definition OS_InitTaskIdle_impl :=
 Void ·OS_InitTaskIdle·( )··{
        ;
    
       OSTaskCreateOS_TaskIdle, NULL, OS_IDLE_PRIO ­);ₛ
       RETURN
 .

Definition OS_InitSTKList_impl :=
 Void ·OS_InitSTKList·( )··{
       
        i @ Int8u;
        pstk1 @ OS_STK_BLK;
        pstk2 @ OS_STK_BLK
       ;
    
        pstk1 =ₑ &ₐOSSTKTbl[0];ₛ
        pstk2 =ₑ &ₐOSSTKTbl[1];ₛ
        i =ₑ 0;ₛ
        WHILE (i <ₑ (OS_MAX_TASKS +ₑ OS_N_SYS_TASKS)) {
            pstk1nextblk =ₑ pstk2;ₛ
            ++pstk1;ₛ
            ++pstk2;ₛ
            ++i
        };ₛ
        pstk1nextblk =ₑ NULL;ₛ
        OSSTKFreeList =ₑ &ₐ OSSTKTbl[0];ₛ
        RETURN
.

Definition OS_InitTCBList_impl :=
Void ·OS_InitTCBList·( )··{
       
        i @ Int8u;
        ptcb1 @ OS_TCB;
        ptcb2 @ OS_TCB
       ;
       
       OSTCBList =ₑ NULL;ₛ
       i =ₑ 0;ₛ
       WHILE (i <ₑ (OS_LOWEST_PRIO +ₑ 1)){
           OSTCBPrioTbl[i] =ₑ NULL;ₛ
           ++i
       };ₛ
       ptcb1 =ₑ &ₐ OSTCBTbl[0];ₛ
       ptcb2 =ₑ &ₐ OSTCBTbl[1];ₛ
       i =ₑ 0;ₛ
       WHILE (i <ₑ (OS_MAX_TASKS +ₑ OS_N_SYS_TASKS 1)) {
           ptcb1OSTCBNext =ₑ ptcb2;ₛ
           ++ptcb1;ₛ
           ++ptcb2;ₛ
           ++i
       };ₛ
       ptcb1OSTCBNext =ₑ NULL;ₛ
       OSTCBFreeList =ₑ &ₐ OSTCBTbl[0];ₛ
       RETURN
.

Definition OS_TCBInit_impl :=
 Int8u ·OS_TCBInit·(prio @ Int8u )··{
        ptcb @ OS_TCB;
 
        ptcb =ₑ OSTCBFreeList;ₛ
        If (ptcb !=ₑ NULL) {
            OSTCBFreeList =ₑ ptcbOSTCBNext;ₛ
            ptcbOSTCBPrio =ₑ prio;ₛ
            ptcbOSTCBStat =ₑ OS_STAT_RDY;ₛ
            ptcbOSTCBDly =ₑ 0;ₛ
            ptcbOSTCBY =ₑ prio 3;ₛ
            ptcbOSTCBBitY =ₑ OSMapTbl[ptcbOSTCBY];ₛ
            ptcbOSTCBX =ₑ prio &ₑ 7;ₛ
            ptcbOSTCBBitX =ₑ OSMapTbl[ptcbOSTCBX];ₛ
            ptcbOSTCBEventPtr =ₑ NULL;ₛ
            ptcbOSTCBMsg =ₑ NULL;ₛ
            OSTCBPrioTbl[prio] =ₑ ptcb;ₛ
            ptcbOSTCBNext =ₑ OSTCBList;ₛ
            ptcbOSTCBPrev =ₑ NULL;ₛ

                        
            OSRdyGrp =ₑ OSRdyGrp |ₑ ptcbOSTCBBitY;ₛ
            OSRdyTbl[ptcbOSTCBY] =ₑ
                    OSRdyTbl[ptcbOSTCBY] |ₑ ptcbOSTCBBitX;ₛ
                                      
            If(OSTCBList !=ₑ NULL) {
                OSTCBListOSTCBPrev =ₑ ptcb
            };ₛ
            OSTCBList =ₑ ptcb;ₛ

            RETURN OS_NO_ERR
        };ₛ

        RETURN OS_NO_MORE_TCB
 .

Definition OS_EventRemove_impl :=
Void ·OS_EventRemove·(pevent @ OS_EVENT)··{
       p @ OS_EVENT; x @ Int8u; p1 @ OS_EVENT;

       p =ₑ OSEventList;ₛ
       p1 =ₑ OSEventList;ₛ
       x =ₑ 0;ₛ
       If (p ==ₑ pevent){
           OSEventList =ₑ OSEventListOSEventListPtr;ₛ
           RETURN
       };ₛ

       WHILE (p !=ₑ NULL &&ₑ x ==ₑ 0) {
         p1 =ₑ pOSEventListPtr;ₛ
         IF (p1 !=ₑ pevent){
             p =ₑ p1
         }ELSE{
             x =ₑ 1
         }
       };ₛ
          
       If (x ==ₑ 1){
           pOSEventListPtr =ₑ p1OSEventListPtr
       };ₛ
       RETURN
.

Definition OS_EventSearch_impl :=
Int8u ·OS_EventSearch·(pevent @ OS_EVENT)··{
       p @ OS_EVENT; x @ Int8u; p1 @ OS_EVENT;

       p =ₑ OSEventList;ₛ
       x =ₑ 0;ₛ
       WHILE (p !=ₑ NULL &&ₑ x ==ₑ 0) {
         p1 =ₑ pOSEventListPtr;ₛ
         IF (p !=ₑ pevent){
             p =ₑ p1
         }ELSE{
             x =ₑ 1
         }
       };ₛ
       RETURN x
.

Close Scope code_scope.