📄 ucos_ii.asm
字号:
PSHD *
RET
.endfunc 354,000000000H,2
.sym _OSIntEnter,_OSIntEnter,32,2,0
.globl _OSIntEnter
.func 379
;>>>> void OSIntEnter (void)
******************************************************
* FUNCTION DEF : _OSIntEnter
******************************************************
_OSIntEnter:
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,1
LAR AR0,*0+
.line 3
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.line 4
;>>>> OSIntNesting++; /* Increment ISR nesting level */
LDPK _OSIntNesting
LAC _OSIntNesting
ADDK 1
SACL _OSIntNesting
.line 5
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
EPI0_6:
.line 6
SBRK 2
LAR AR0,*-
PSHD *
RET
.endfunc 384,000000000H,1
.sym _OSIntExit,_OSIntExit,32,2,0
.globl _OSIntExit
.func 405
;>>>> void OSIntExit (void)
******************************************************
* FUNCTION DEF : _OSIntExit
******************************************************
_OSIntExit:
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,1
LAR AR0,*0+
.line 3
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.line 4
;>>>> if ((--OSIntNesting | OSLockNesting) == 0) { /* Reschedule only if all ISRs completed & not locked */
LDPK _OSIntNesting
ZALS _OSIntNesting
SUBK 1
SACL _OSIntNesting
OR _OSLockNesting
ANDK 0FFFFh
BNZ L15
.line 5
;>>>> OSIntExitY = OSUnMapTbl[OSRdyGrp];
LAC _OSRdyGrp
ADLK _OSUnMapTbl+0,0
MAR * ,AR0
SACL *
LAR AR3,* ,AR3
BLDD * ,#_OSIntExitY,AR0
.line 6
;>>>> nn=OSIntExitY;
LDPK _OSIntExitY
BLDD _OSIntExitY,#_nn
.line 7
;>>>> 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 *
LDPK _OSPrioHighRdy
SACL _OSPrioHighRdy
.line 8
;>>>> nn=OSPrioHighRdy;
BLDD _OSPrioHighRdy,#_nn
.line 9
;>>>> nn=OSPrioCur;
BLDD _OSPrioCur,#_nn
.line 10
;>>>> if (OSPrioHighRdy != OSPrioCur) { /* No context switch if current task is highest ready */
LAC _OSPrioHighRdy
SUB _OSPrioCur
BZ L15
.line 11
;>>>> OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
LAC _OSPrioHighRdy
ADLK _OSTCBPrioTbl+0,0
MAR * ,AR0
SACL *
LAR AR3,* ,AR3
BLDD * ,#_OSTCBHighRdy,AR1
.line 12
;>>>> OSCtxSwCtr++; /* Keep track of the number of context switches */
ZALS _OSCtxSwCtr
ADDH _OSCtxSwCtr+1
ADDK 1
SACL _OSCtxSwCtr
SACH _OSCtxSwCtr+1
.line 13
;>>>> OSIntCtxSw(); /* Perform interrupt level context switch */
CALL _OSIntCtxSw
L15:
.line 16
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
EPI0_7:
.line 17
MAR * ,AR1
SBRK 2
LAR AR0,*-
PSHD *
RET
.endfunc 421,000000000H,1
.sym _OSSched,_OSSched,32,2,0
.globl _OSSched
.func 440
;>>>> void OSSched (void)
;>>>> INT8U y;
******************************************************
* FUNCTION DEF : _OSSched
******************************************************
_OSSched:
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,2
LAR AR0,*0+
.line 6
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.sym _y,1,12,1,16
.line 7
;>>>> if ((OSLockNesting | OSIntNesting) == 0) { /* Task scheduling must be enabled and not ISR level */
LDPK _OSIntNesting
ZALS _OSIntNesting
OR _OSLockNesting
BNZ L17
.line 8
;>>>> y = OSUnMapTbl[OSRdyGrp]; /* Get pointer to highest priority task ready to run */
LAC _OSRdyGrp
ADLK _OSUnMapTbl+0,0
MAR * ,AR0
SACL *
LAR AR3,* ,AR3
LAC * ,AR2
LARK AR2,1
MAR *0+
SACL *
.line 9
;>>>> nn=y;
BLDD * ,#_nn
.line 10
;>>>> nn=OSRdyTbl[y];
LAC * ,AR0
ADLK _OSRdyTbl+0,0
SACL *
LAR AR3,* ,AR3
BLDD * ,#_nn,AR2
.line 11
;>>>> OSPrioHighRdy = (INT8U)((y << 3) + 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
ADD * ,3
SACL _OSPrioHighRdy
.line 12
;>>>> nn= OSPrioCur;
BLDD _OSPrioCur,#_nn
.line 13
;>>>> nn= OSPrioHighRdy;
BLDD _OSPrioHighRdy,#_nn
.line 14
;>>>> if (OSPrioHighRdy != OSPrioCur) { /* No context switch if current task is highest ready */
LAC _OSPrioHighRdy
SUB _OSPrioCur
BZ L17
.line 15
;>>>> OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
LAC _OSPrioHighRdy
ADLK _OSTCBPrioTbl+0,0
MAR * ,AR0
SACL *
LAR AR3,* ,AR3
BLDD * ,#_OSTCBHighRdy
.line 16
;>>>> OSCtxSwCtr++; /* Increment context switch counter */
ZALS _OSCtxSwCtr
ADDH _OSCtxSwCtr+1
ADDK 1
SACL _OSCtxSwCtr
SACH _OSCtxSwCtr+1
.line 17
;>>>> OS_TASK_SW();
intr 8
L17:
.line 20
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
EPI0_8:
.line 21
MAR * ,AR1
SBRK 3
LAR AR0,*-
PSHD *
RET
.endfunc 460,000000000H,2
.sym _OSSchedLock,_OSSchedLock,32,2,0
.globl _OSSchedLock
.func 478
;>>>> void OSSchedLock (void)
******************************************************
* FUNCTION DEF : _OSSchedLock
******************************************************
_OSSchedLock:
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,1
LAR AR0,*0+
.line 3
;>>>> if (OSRunning == TRUE) { /* Make sure multitasking is running */
LDPK _OSRunning
LAC _OSRunning
SUBK 1
BNZ L19
.line 4
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.line 5
;>>>> OSLockNesting++; /* Increment lock nesting level */
LAC _OSLockNesting
ADDK 1
SACL _OSLockNesting
.line 6
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
L19:
EPI0_9:
.line 8
SBRK 2
LAR AR0,*-
PSHD *
RET
.endfunc 485,000000000H,1
.sym _OSSchedUnlock,_OSSchedUnlock,32,2,0
.globl _OSSchedUnlock
.func 502
;>>>> void OSSchedUnlock (void)
******************************************************
* FUNCTION DEF : _OSSchedUnlock
******************************************************
_OSSchedUnlock:
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,1
LAR AR0,*0+
.line 3
;>>>> if (OSRunning == TRUE) { /* Make sure multitasking is running */
LDPK _OSRunning
LAC _OSRunning
SUBK 1
BNZ L20
.line 4
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.line 5
;>>>> if (OSLockNesting > 0) { /* Do not decrement if already 0 */
LAC _OSLockNesting
BZ L21
.line 6
;>>>> OSLockNesting--; /* Decrement lock nesting level */
SUBK 1
SACL _OSLockNesting
.line 7
;>>>> if ((OSLockNesting | OSIntNesting) == 0) { /* See if scheduling re-enabled and not an ISR */
ZALS _OSIntNesting
OR _OSLockNesting
BNZ L22
.line 8
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 9
;>>>> OSSched(); /* See if a higher priority task is ready */
;>>>> } else {
CALL _OSSched
B L20
L22:
.line 11
;>>>> OS_EXIT_CRITICAL();
;>>>> } else {
CLRC INTM
B L20
L21:
.line 14
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
L20:
EPI0_10:
.line 17
SBRK 2
LAR AR0,*-
PSHD *
RET
.endfunc 518,000000000H,1
.sym _OSStart,_OSStart,32,2,0
.globl _OSStart
.func 538
;>>>> 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,12,1,16
.sym _x,2,12,1,16
.line 7
;>>>> if (OSRunning == FALSE) {
LDPK _OSRunning
LAC _OSRunning
BNZ L25
.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
L25:
EPI0_11:
.line 16
SBRK 4
LAR AR0,*-
PSHD *
RET
.endfunc 553,000000000H,3
.sym _OSStatInit,_OSStatInit,32,2,0
.globl _OSStatInit
.func 576
;>>>> void OSStatInit (void)
******************************************************
* FUNCTION DEF : _OSStatInit
******************************************************
_OSStatInit:
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,1
LAR AR0,*0+
.line 3
;>>>> OSTimeDly(2); /* Synchronize with clock tick */
LACK 2
SACL *+
CALL _OSTimeDly
MAR *-
.line 4
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.line 5
;>>>> OSIdleCtr = 0L; /* Clear idle counter */
LACK 0
LDPK _OSIdleCtr
SACL _OSIdleCtr
SACH _OSIdleCtr+1
.line 6
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 7
;>>>> OSTimeDly(OS_TICKS_PER_SEC); /* Determine MAX. idle counter value for 1 second */
LACK 100
SACL *+
CALL _OSTimeDly
MAR *-
.line 8
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.line 9
;>>>> OSIdleCtrMax = OSIdleCtr; /* Store maximum idle counter count in 1 second */
LDPK _OSIdleCtr
ZALS _OSIdleCtr
ADDH _OSIdleCtr+1
SACL _OSIdleCtrMax
SACH _OSIdleCtrMax+1
.line 10
;>>>> OSStatRdy = TRUE;
LACK 1
SACL _OSStatRdy
.line 11
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
EPI0_12:
.line 12
SBRK 2
LAR AR0,*-
PSHD *
RET
.endfunc 587,000000000H,1
.sym _OSTaskIdle,_OSTaskIdle,32,2,0
.globl _OSTaskIdle
.func 603
;>>>> void OSTaskIdle (void *pdata)
******************************************************
* FUNCTION DEF : _OSTaskIdle
******************************************************
_OSTaskIdle:
LF13 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,1
LAR AR0,*0+
.sym _pdata,-3+LF13,16,9,16
.line 2
.line 3
;>>>> pdata = pdata; /* Prevent compiler warning for not using 'pdata' */
;>>>> for (;;) {
L26:
.line 6
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.line 7
;>>>> OSIdleCtr++;
LDPK _OSIdleCtr
ZALS _OSIdleCtr
ADDH _OSIdleCtr+1
ADDK 1
SACL _OSIdleCtr
SACH _OSIdleCtr+1
.line 8
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 10
B L26
.endfunc 613,000000000H,1
.sym _OSTaskStat,_OSTaskStat,32,2,0
.globl _OSTaskStat
.func 642
;>>>> void OSTaskStat (void *pdata)
******************************************************
* FUNCTION DEF : _OSTaskStat
******************************************************
_OSTaskStat:
LF14 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,6
LAR AR0,*0+
.sym _pdata,-3+LF14,16,9,16
.sym _run,1,15,1,32
.sym _usage,3,2,1,16
.line 2
;>>>> INT32U run;
;>>>> INT8S usage;
.line 7
;>>>> pdata = pdata; /* Prevent compiler warning for not using 'pdata' */
.line 8
;>>>> while (OSStatRdy == FALSE) {
LDPK _OSStatRdy
LAC _OSStatRdy
BNZ L28
L27:
.line 9
;>>>> OSTimeDly(2 * OS_TICKS_PER_SEC); /* Wait until statistic task is ready */
;>>>> for (;;) {
LACK 200
SACL *+
CALL _OSTimeDly
MAR *-
.line 8
LDPK _OSStatRdy
LAC _OSStatRdy
BZ L27
L28:
L29:
.line 12
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.line 13
;>>>> OSIdleCtrRun = OSIdleCtr; /* Obtain the of the idle counter for the past second */
LDPK _OSIdleCtr
ZALS _OSIdleCtr
ADDH _OSIdleCtr+1
SACL _OSIdleCtrRun
SACH _OSIdleCtrRun+1
.line 14
;>>>> run = OSIdleCtr;
MAR * ,AR2
LARK AR2,1
MAR *0+
SACL *+
SACH *
.line 15
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -