📄 ucos_ii.asm
字号:
* FUNCTION DEF : _OSIntExit
******************************************************
_OSIntExit:
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,1
LAR AR0,*0+
.line 8
;>>>> if (OSRunning == TRUE) {
LDPK _OSRunning
LAC _OSRunning
SUBK 1
BNZ L3
.line 9
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.line 10
;>>>> if (OSIntNesting > 0) { /* Prevent OSIntNesting from wrapping */
LAC _OSIntNesting
BZ L4
.line 11
;>>>> OSIntNesting--;
SUBK 1
SACL _OSIntNesting
L4:
.line 13
;>>>> if ((OSIntNesting == 0) && (OSLockNesting == 0)) { /* Reschedule only if all ISRs complete ... */
LAC _OSIntNesting
BNZ L5
LAC _OSLockNesting
BNZ L5
.line 14
;>>>> OSIntExitY = OSUnMapTbl[OSRdyGrp]; /* ... and not locked. */
LAC _OSRdyGrp
ADLK _OSUnMapTbl+0,0
MAR * ,AR0
SACL *
LAR AR3,* ,AR3
BLDD * ,#_OSIntExitY,AR0
.line 15
;>>>> OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
LAC _OSIntExitY
ADLK _OSRdyTbl+0,0
SACL *
LAR AR3,* ,AR3
LAC * ,AR0
ADLK _OSUnMapTbl+0,0
SACL *
LAR AR3,* ,AR3
LAC _OSIntExitY,3
ADD *
SACL _OSPrioHighRdy
.line 16
;>>>> if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */
LAC _OSPrioHighRdy
SUB _OSPrioCur
BZ L5
.line 17
;>>>> OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
LAC _OSPrioHighRdy
ADLK _OSTCBPrioTbl+0,0
MAR * ,AR0
SACL *
LAR AR3,* ,AR3
BLDD * ,#_OSTCBHighRdy,AR1
.line 18
;>>>> OSCtxSwCtr++; /* Keep track of the number of ctx switches */
ZALS _OSCtxSwCtr
ADDH _OSCtxSwCtr+1
ADDK 1
SACL _OSCtxSwCtr
SACH _OSCtxSwCtr+1
.line 19
;>>>> OSIntCtxSw(); /* Perform interrupt level ctx switch */
CALL _OSIntCtxSw
L5:
.line 22
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
L3:
EPI0_3:
.line 24
MAR * ,AR1
SBRK 2
LAR AR0,*-
PSHD *
RET
.endfunc 195,000000000H,1
.sym _OSStart,_OSStart,32,2,0
.globl _OSStart
.func 293
;>>>> void OSStart (void)
;>>>> INT8U y;
;>>>> INT8U x;
******************************************************
* FUNCTION DEF : _OSStart
******************************************************
_OSStart:
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,3
LAR AR0,*0+
.sym _y,1,14,1,16
.sym _x,2,14,1,16
.line 7
;>>>> if (OSRunning == FALSE) {
LDPK _OSRunning
LAC _OSRunning
BNZ L7
.line 8
;>>>> y = OSUnMapTbl[OSRdyGrp]; /* Find highest priority's task priority number */
LAC _OSRdyGrp
ADLK _OSUnMapTbl+0,0
MAR * ,AR0
SACL *
LAR AR3,* ,AR3
LAC * ,AR2
LARK AR2,1
MAR *0+
SACL *
.line 9
;>>>> x = OSUnMapTbl[OSRdyTbl[y]];
LAC *+,AR0
ADLK _OSRdyTbl+0,0
SACL *
LAR AR3,* ,AR3
LAC * ,AR0
ADLK _OSUnMapTbl+0,0
SACL *
LAR AR3,* ,AR3
LAC * ,AR2
SACL *
.line 10
;>>>> OSPrioHighRdy = (INT8U)((y << 3) + x);
LAC *-
ADD * ,3,AR0
SACL _OSPrioHighRdy
.line 11
;>>>> OSPrioCur = OSPrioHighRdy;
BLKD #_OSPrioHighRdy,_OSPrioCur
.line 12
;>>>> OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
LAC _OSPrioHighRdy
ADLK _OSTCBPrioTbl+0,0
SACL *
LAR AR3,* ,AR3
BLDD * ,#_OSTCBHighRdy,AR1
.line 13
;>>>> OSTCBCur = OSTCBHighRdy;
BLKD #_OSTCBHighRdy,_OSTCBCur
.line 14
;>>>> OSStartHighRdy(); /* Execute target specific code to start task */
CALL _OSStartHighRdy
L7:
EPI0_4:
.line 16
SBRK 4
LAR AR0,*-
PSHD *
RET
.endfunc 308,000000000H,3
.sym _OSTimeTick,_OSTimeTick,32,2,0
.globl _OSTimeTick
.func 364
;>>>> void OSTimeTick (void)
;>>>> #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;>>>> OS_CPU_SR cpu_sr;
;>>>> #endif
;>>>> OS_TCB *ptcb;
******************************************************
* FUNCTION DEF : _OSTimeTick
******************************************************
_OSTimeTick:
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,2
LAR AR0,*0+
.sym _ptcb,1,24,1,16,_os_tcb
.line 9
;>>>> OSTimeTickHook(); /* Call user definable hook */
;>>>> #if OS_TIME_GET_SET_EN > 0
CALL _OSTimeTickHook
.line 11
;>>>> OS_ENTER_CRITICAL(); /* Update the 32-bit tick counter */
SETC INTM
.line 12
;>>>> OSTime++;
LDPK _OSTime
ZALS _OSTime
ADDH _OSTime+1
ADDK 1
SACL _OSTime
SACH _OSTime+1
.line 13
;>>>> OS_EXIT_CRITICAL();
;>>>> #endif
CLRC INTM
.line 15
;>>>> if (OSRunning == TRUE) {
LAC _OSRunning
SUBK 1
BNZ L8
.line 16
;>>>> ptcb = OSTCBList; /* Point at first TCB in TCB list */
MAR * ,AR2
LARK AR2,1
MAR *0+
BLKD #_OSTCBList,*
.line 17
;>>>> while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { /* Go through all TCBs in TCB list */
LAR AR3,* ,AR3
ADRK 6
LAC *
SUBK 12
BZ L8
MAR * ,AR2
L9:
.line 18
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.line 19
;>>>> if (ptcb->OSTCBDly != 0) { /* Delayed or waiting for event with TO */
LAR AR3,* ,AR3
ADRK 4
LAC *
BZ L11
.line 20
;>>>> if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
ZALS *
SUBK 1
SACL *
ANDK 0FFFFh
BNZ L11
.line 21
;>>>> if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended? */
MAR *+
BIT * ,12
BBNZ L13
.line 22
;>>>> OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make task R-to-R (timed out)*/
LDPK _OSRdyGrp
LAC _OSRdyGrp
ADRK 5
OR * ,AR2
SACL _OSRdyGrp
.line 23
;>>>> OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
;>>>> } else { /* Yes, Leave 1 tick to prevent ... */
LAR AR4,* ,AR4
ADRK 8
LAC * ,AR0
ADLK _OSRdyTbl+0,0
SACL *
LAR AR5,* ,AR5
LAC * ,AR3
MAR *-
OR * ,AR5
SACL *
B L11
L13:
.line 25
;>>>> ptcb->OSTCBDly = 1; /* ... loosing the task when the ... */
LACK 1
MAR *-
SACL *
L11:
.line 29
;>>>> ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
MAR * ,AR2
LAR AR3,* ,AR3
MAR *+
LAC * ,AR2
SACL *
.line 30
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 17
LAR AR3,* ,AR3
ADRK 6
LAC * ,AR2
SUBK 12
BNZ L9
L8:
EPI0_5:
.line 33
MAR * ,AR1
SBRK 3
LAR AR0,*-
PSHD *
RET
.endfunc 396,000000000H,2
.sym _OSVersion,_OSVersion,46,2,0
.globl _OSVersion
.func 412
;>>>> INT16U OSVersion (void)
******************************************************
* FUNCTION DEF : _OSVersion
******************************************************
_OSVersion:
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,1
LAR AR0,*0+
.line 3
;>>>> return (OS_VERSION);
LACK 252
EPI0_6:
.line 4
SBRK 2
LAR AR0,*-
PSHD *
RET
.endfunc 415,000000000H,1
.sym _OS_EventTaskRdy,_OS_EventTaskRdy,46,2,0
.globl _OS_EventTaskRdy
.func 459
;>>>> INT8U OS_EventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk)
******************************************************
* FUNCTION DEF : _OS_EventTaskRdy
******************************************************
_OS_EventTaskRdy:
LF7 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,7
LAR AR0,*0+,AR2
.sym _pevent,-3+LF7,24,9,16,.fake0
.sym _msg,-4+LF7,16,9,16
.sym _msk,-5+LF7,14,9,16
.sym _ptcb,1,24,1,16,_os_tcb
.sym _x,2,14,1,16
.sym _y,3,14,1,16
.sym _bitx,4,14,1,16
.sym _bity,5,14,1,16
.sym _prio,6,14,1,16
.line 2
;>>>> OS_TCB *ptcb;
;>>>> INT8U x;
;>>>> INT8U y;
;>>>> INT8U bitx;
;>>>> INT8U bity;
;>>>> INT8U prio;
.line 11
;>>>> y = OSUnMapTbl[pevent->OSEventGrp]; /* Find highest prio. task waiting for message */
LARK AR2,-3+LF7
MAR *0+
LAR AR3,* ,AR3
MAR *+
LAC * ,AR0
ADLK _OSUnMapTbl+0,0
SACL *
LAR AR4,* ,AR4
LAC * ,AR2
ADRK 6-LF7
SACL *
.line 12
;>>>> bity = OSMapTbl[y];
LAC * ,AR0
ADLK _OSMapTbl+0,0
SACL *
LAR AR4,* ,AR4
LAC * ,AR2
ADRK 2
SACL *
.line 13
;>>>> x = OSUnMapTbl[pevent->OSEventTbl[y]];
SBRK 8-LF7
LAC *
ADDK 4
ADRK 6-LF7
ADD *-,AR0
SACL *
LAR AR4,* ,AR4
LAC * ,AR0
ADLK _OSUnMapTbl+0,0
SACL *
LAR AR4,* ,AR4
LAC * ,AR2
SACL *
.line 14
;>>>> bitx = OSMapTbl[x];
LAC * ,AR0
ADLK _OSMapTbl+0,0
SACL *
LAR AR4,* ,AR4
LAC * ,AR2
ADRK 2
SACL *-
.line 15
;>>>> prio = (INT8U)((y << 3) + x); /* Find priority of task getting the msg */
LAC *-,3
ADD *
ADRK 4
SACL *
.line 16
;>>>> if ((pevent->OSEventTbl[y] &= ~bitx) == 0x00) { /* Remove this task from the waiting list */
SBRK 2
ZALS * ,AR1
CMPL
SACL *+,AR2
SBRK 7-LF7
LAC *
ADDK 4
ADRK 6-LF7
ADD * ,AR0
SACL *
LAR AR4,* ,AR1
MAR *-
ZALS * ,AR4
AND *
SACL *
BNZ L15
.line 17
;>>>> pevent->OSEventGrp &= ~bity; /* Clr group bit if this was only task pending */
MAR * ,AR2
ADRK 2
LAC * ,AR3
CMPL
AND *
SACL *
L15:
.line 19
;>>>> ptcb = OSTCBPrioTbl[prio]; /* Point to this task's OS_TCB */
MAR * ,AR2
LARK AR2,6
MAR *0+
LAC * ,AR0
ADLK _OSTCBPrioTbl+0,0
SACL *
LAR AR4,* ,AR4
LAC * ,AR2
SBRK 5
SACL *
.line 20
;>>>> ptcb->OSTCBDly = 0; /* Prevent OSTimeTick() from readying task */
LAR AR4,* ,AR4
LACK 0
ADRK 4
SACL *-
.line 21
;>>>> ptcb->OSTCBEventPtr = (OS_EVENT *)0; /* Unlink ECB from this task */
;>>>> #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
;>>>> ptcb->OSTCBMsg = msg; /* Send message directly to waiting task */
;>>>> #else
SACL * ,AR2
.line 25
;>>>> msg = msg; /* Prevent compiler warning if not used */
;>>>> #endif
.line 27
;>>>> ptcb->OSTCBStat &= ~msk; /* Clear bit associated with event type */
SBRK 6-LF7
LAC * ,AR4
CMPL
ADRK 2
AND *
SACL *
.line 28
;>>>> if (ptcb->OSTCBStat == OS_STAT_RDY) { /* See if task is ready (could be susp'd) */
LAC *
BNZ L16
.line 29
;>>>> OSRdyGrp |= bity; /* Put task in the ready to run list */
LDPK _OSRdyGrp
LAC _OSRdyGrp
MAR * ,AR2
ADRK 10-LF7
OR *
SACL _OSRdyGrp
.line 30
;>>>> OSRdyTbl[y] |= bitx;
SBRK 2
LAC *+,AR0
ADLK _OSRdyTbl+0,0
SACL *
LAR AR5,* ,AR5
LAC * ,AR2
OR * ,AR5
SACL *
L16:
.line 32
;>>>> return (prio);
MAR * ,AR2
LARK AR2,6
MAR *0+
ZALS *
EPI0_7:
.line 33
MAR * ,AR1
SBRK 8
LAR AR0,*-
PSHD *
RET
.endfunc 491,000000000H,7
.sym _OS_EventTaskWait,_OS_EventTaskWait,32,2,0
.globl _OS_EventTaskWait
.func 509
;>>>> void OS_EventTaskWait (OS_EVENT *pevent)
******************************************************
* FUNCTION DEF : _OS_EventTaskWait
******************************************************
_OS_EventTaskWait:
LF8 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,1
LAR AR0,*0+,AR2
.sym _pevent,-3+LF8,24,9,16,.fake0
.line 2
.line 3
;>>>> OSTCBCur->OSTCBEventPtr = pevent; /* Store pointer to event control block in TCB */
LDPK _OSTCBCur
LAR AR3,_OSTCBCur
LARK AR2,-3+LF8
MAR *0+
LAC * ,AR3
ADRK 3
SACL *
.line 4
;>>>> if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0x00) { /* Task no longer ready */
ADRK 6
ZALS *-,AR1
CMPL
SACL * ,AR3
LAC * ,AR0
ADLK _OSRdyTbl+0,0
SACL *
LAR AR4,* ,AR1
ZALS * ,AR4
AND *
SACL *
BNZ L17
.line 5
;>>>> OSRdyGrp &= ~OSTCBCur->OSTCBBitY; /* Clear event grp bit if this was only task pending */
MAR * ,AR3
ADRK 2
LAC *
CMPL
AND _OSRdyGrp
SACL _OSRdyGrp
L17:
.line 7
;>>>> pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX; /* Put task in waiting list */
LAR AR3,_OSTCBCur
LAR AR4,_OSTCBCur
MAR * ,AR2
LAC * ,AR4
ADDK 4
ADRK 8
ADD * ,AR0
SACL *
LAR AR5,* ,AR5
LAC * ,AR3
ADRK 9
OR *+,AR5
SACL * ,AR2
.line 8
;>>>> pevent->OSEventGrp |= OSTCBCur->OSTCBBitY;
LAR AR5,* ,AR5
MAR *+
LAC * ,AR3
OR * ,AR5
SACL * ,AR1
EPI0_8:
.line 9
SBRK 2
LAR AR0,*-
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -