📄 ucos_ii.asm
字号:
ADLK _OSUnMapTbl+0,0
MAR * ,AR0
SACL *
LAR AR3,* ,AR3
BLDD * ,#_OSIntExitY,AR0
.line 6
;>>>> OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
LDPK _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 7
;>>>> if (OSPrioHighRdy != OSPrioCur) { /* No context switch if current task is highest ready */
LAC _OSPrioHighRdy
SUB _OSPrioCur
BZ L15
.line 8
;>>>> OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
LAC _OSPrioHighRdy
ADLK _OSTCBPrioTbl+0,0
MAR * ,AR0
SACL *
LAR AR3,* ,AR3
BLDD * ,#_OSTCBHighRdy,AR1
.line 9
;>>>> OSCtxSwCtr++; /* Keep track of the number of context switches */
ZALS _OSCtxSwCtr
ADDH _OSCtxSwCtr+1
ADDK 1
SACL _OSCtxSwCtr
SACH _OSCtxSwCtr+1
.line 10
;>>>> OSIntCtxSw(); /* Perform interrupt level context switch */
CALL _OSIntCtxSw
L15:
.line 13
;>>>> OS_EXIT_CRITICAL();
clrc intm
EPI0_7:
.line 14
MAR * ,AR1
SBRK 2
LAR AR0,*-
PSHD *
RET
.endfunc 412,000000000H,1
.sym _OSSched,_OSSched,32,2,0
.globl _OSSched
.func 431
;>>>> 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
;>>>> 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 10
;>>>> if (OSPrioHighRdy != OSPrioCur) { /* No context switch if current task is highest ready */
LAC _OSPrioHighRdy
SUB _OSPrioCur
BZ L17
.line 11
;>>>> OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
LAC _OSPrioHighRdy
ADLK _OSTCBPrioTbl+0,0
MAR * ,AR0
SACL *
LAR AR3,* ,AR3
BLDD * ,#_OSTCBHighRdy
.line 12
;>>>> OSCtxSwCtr++; /* Increment context switch counter */
ZALS _OSCtxSwCtr
ADDH _OSCtxSwCtr+1
ADDK 1
SACL _OSCtxSwCtr
SACH _OSCtxSwCtr+1
.line 13
;>>>> OS_TASK_SW(); /* Perform a context switch */
intr 8
L17:
.line 16
;>>>> OS_EXIT_CRITICAL();
clrc intm
EPI0_8:
.line 17
MAR * ,AR1
SBRK 3
LAR AR0,*-
PSHD *
RET
.endfunc 447,000000000H,2
.sym _OSSchedLock,_OSSchedLock,32,2,0
.globl _OSSchedLock
.func 465
;>>>> 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 472,000000000H,1
.sym _OSSchedUnlock,_OSSchedUnlock,32,2,0
.globl _OSSchedUnlock
.func 489
;>>>> 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 505,000000000H,1
.sym _OSStart,_OSStart,32,2,0
.globl _OSStart
.func 525
;>>>> 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 540,000000000H,3
.sym _OSStatInit,_OSStatInit,32,2,0
.globl _OSStatInit
.func 563
;>>>> 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 574,000000000H,1
.sym _OSTaskIdle,_OSTaskIdle,32,2,0
.globl _OSTaskIdle
.func 590
;>>>> 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 4
;>>>> pdata = pdata; /* Prevent compiler warning for not using 'pdata' */
;>>>> for (;;) {
L26:
.line 7
;>>>> OS_ENTER_CRITICAL();
setc intm
.line 8
;>>>> OSIdleCtr++;
LDPK _OSIdleCtr
ZALS _OSIdleCtr
ADDH _OSIdleCtr+1
ADDK 1
SACL _OSIdleCtr
SACH _OSIdleCtr+1
.line 9
;>>>> OS_EXIT_CRITICAL();
clrc intm
.line 14
B L26
.endfunc 604,000000000H,1
.sym _OSTaskStat,_OSTaskStat,32,2,0
.globl _OSTaskStat
.func 633
;>>>> 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
;>>>> OSIdleCtr = 0L; /* Reset the idle counter for the next second */
LACK 0
SACL _OSIdleCtr
SACH _OSIdleCtr+1
.line 16
;>>>> OS_EXIT_CRITICAL();
clrc intm
.line 17
;>>>> if (OSIdleCtrMax > 0L) {
ZALS _OSIdleCtrMax
ADDH _OSIdleCtrMax+1
BZ L30
.line 18
;>>>> usage = (INT8S)(100L - 100L * run / OSIdleCtrMax);
LACK 100
MAR *-,AR1
SACL *+
SACH *+
SACL *+,AR2
ZALS *+
ADDH * ,AR1
MAR *-
CALL L$$MPY
MAR * ,AR2
ADRK 2
SACL *+
SACH *-,AR1
ZALS _OSIdleCtrMax
ADDH _OSIdleCtrMax+1
SACL *+
SACH *+,AR2
ZALS *+
ADDH * ,AR1
CALL L$$DIVU
NEG
ADDK 100
MAR * ,AR2
SBRK 2
SACL *
.line 19
;>>>> if (usage > 100) {
SSXM
LAC *
SUBK 100
BLEZ L31
.line 20
;>>>> OSCPUUsage = 100;
LACK 100
SACL _OSCPUUsage
B L34
L31:
.line 21
;>>>> } else if (usage < 0) {
LAC *
BGEZ L33
.line 22
;>>>> OSCPUUsage = 0;
;>>>> } else {
LACK 0
SACL _OSCPUUsage
B L34
L33:
.line 24
;>>>> OSCPUUsage = usage;
;>>>> } else {
SACL _OSCPUUsage
B L34
L30:
.line 27
;>>>> OSCPUUsage = 0;
LACK 0
SACL _OSCPUUsage
L34:
.line 29
;>>>> OSTaskStatHook(); /* Invoke user definable hook */
CALL _OSTaskStatHook,AR1
.line 30
;>>>> OSTimeDly(OS_TICKS_PER_SEC); /* Accumulate OSIdleCtr for the next second */
LACK 100
SACL *+
CALL _OSTimeDly
MAR *-,AR2
.line 31
B L29
.endfunc 664,000000000H,6
.sym _OSTCBInit,_OSTCBInit,44,2,0
.globl _OSTCBInit
.func 710
;>>>> INT8U OSTCBInit (INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT16U stk_size, void *pext, INT16U opt)
******************************************************
* FUNCTION DEF : _OSTCBInit
******************************************************
_OSTCBInit:
LF15 .set 0
POPD *+
SAR AR0,*+
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -