📄 ucos_ii.asm
字号:
;>>>> 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 673,000000000H,6
.sym _OSTCBInit,_OSTCBInit,44,2,0
.globl _OSTCBInit
.func 719
;>>>> 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,*+
SAR AR1,*
LARK AR0,2
LAR AR0,*0+
.sym _prio,-3+LF15,12,9,16
.sym _ptos,-4+LF15,30,9,16
.sym _pbos,-5+LF15,30,9,16
.sym _id,-6+LF15,14,9,16
.sym _stk_size,-7+LF15,14,9,16
.sym _pext,-8+LF15,16,9,16
.sym _opt,-9+LF15,14,9,16
.sym _ptcb,1,24,1,16,_os_tcb
.line 2
;>>>> OS_TCB *ptcb;
.line 6
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.line 7
;>>>> ptcb = OSTCBFreeList; /* Get a free TCB from the free TCB list */
MAR * ,AR2
LARK AR2,1
MAR *0+
BLKD #_OSTCBFreeList,*
.line 8
;>>>> if (ptcb != (OS_TCB *)0) {
LAC *
BZ L35
.line 9
;>>>> OSTCBFreeList = ptcb->OSTCBNext; /* Update pointer to free TCB list */
LAR AR3,* ,AR3
MAR *+
BLDD * ,#_OSTCBFreeList
.line 10
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 11
;>>>> ptcb->OSTCBStkPtr = ptos; /* Load Stack pointer in TCB */
MAR * ,AR2
SBRK 5-LF15
LAC *+,AR3
MAR *-
SACL * ,AR2
.line 12
;>>>> ptcb->OSTCBPrio = (INT8U)prio; /* Load task priority into TCB */
LAC * ,AR3
ADRK 7
SACL *-
.line 13
;>>>> ptcb->OSTCBStat = OS_STAT_RDY; /* Task is ready to run */
LACK 0
SACL *-
.line 14
;>>>> ptcb->OSTCBDly = 0; /* Task is not delayed */
;>>>> #if OS_TASK_CREATE_EXT_EN
;>>>> ptcb->OSTCBExtPtr = pext; /* Store pointer to TCB extension */
;>>>> ptcb->OSTCBStkSize = stk_size; /* Store stack size */
;>>>> ptcb->OSTCBStkBottom = pbos; /* Store pointer to bottom of stack */
;>>>> ptcb->OSTCBOpt = opt; /* Store task options */
;>>>> ptcb->OSTCBId = id; /* Store task ID */
;>>>> #else
SACL * ,AR2
.line 23
;>>>> pext = pext; /* Prevent compiler warning if not used */
.line 24
;>>>> stk_size = stk_size;
.line 25
;>>>> pbos = pbos;
.line 26
;>>>> opt = opt;
.line 27
;>>>> id = id;
;>>>> #endif
;>>>> #if OS_TASK_DEL_EN
;>>>> ptcb->OSTCBDelReq = OS_NO_ERR;
;>>>> #endif
.line 34
;>>>> ptcb->OSTCBY = prio >> 3; /* Pre-compute X, Y, BitX and BitY */
RSXM
LAC * ,12,AR3
ADRK 4
SACH * ,1
.line 35
;>>>> ptcb->OSTCBBitY = OSMapTbl[ptcb->OSTCBY];
LAC * ,AR0
ADLK _OSMapTbl+0,0
SACL *
LAR AR4,* ,AR4
LAC * ,AR3
ADRK 2
SACL * ,AR2
.line 36
;>>>> ptcb->OSTCBX = prio & 0x07;
LACK 7
AND * ,AR3
SBRK 3
SACL *
.line 37
;>>>> ptcb->OSTCBBitX = OSMapTbl[ptcb->OSTCBX];
;>>>> #if OS_MBOX_EN || (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_SEM_EN
LAC * ,AR0
ADLK _OSMapTbl+0,0
SACL *
LAR AR4,* ,AR4
LAC * ,AR3
ADRK 2
SACL *
.line 40
;>>>> ptcb->OSTCBEventPtr = (OS_EVENT *)0; /* Task is not pending on an event */
;>>>> #endif
;>>>> #if OS_MBOX_EN || (OS_Q_EN && (OS_MAX_QS >= 2))
LACK 0
SBRK 7
SACL *+
.line 44
;>>>> ptcb->OSTCBMsg = (void *)0; /* No message received */
;>>>> #endif
SACL *
.line 47
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.line 48
;>>>> OSTCBPrioTbl[prio] = ptcb;
MAR * ,AR2
LAC * ,AR0
ADLK _OSTCBPrioTbl+0,0
SACL *
LAR AR4,* ,AR3
SBRK 4
MAR * ,AR4
SAR AR3,* ,AR3
.line 49
;>>>> ptcb->OSTCBNext = OSTCBList; /* Link into TCB chain */
MAR *+
BLKD #_OSTCBList,*+
.line 50
;>>>> ptcb->OSTCBPrev = (OS_TCB *)0;
LACK 0
SACL *
.line 51
;>>>> if (OSTCBList != (OS_TCB *)0) {
LDPK _OSTCBList
LAC _OSTCBList
BZ L36
.line 52
;>>>> OSTCBList->OSTCBPrev = ptcb;
LAR AR4,_OSTCBList
SBRK 2
MAR * ,AR4
ADRK 2
SAR AR3,*
L36:
.line 54
;>>>> OSTCBList = ptcb;
MAR * ,AR2
ADRK 4-LF15
BLDD * ,#_OSTCBList
.line 55
;>>>> OSRdyGrp |= ptcb->OSTCBBitY; /* Make task ready to run */
LAR AR3,* ,AR3
LAC _OSRdyGrp
ADRK 11
OR * ,AR2
SACL _OSRdyGrp
.line 56
;>>>> OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
LAR AR4,* ,AR4
ADRK 9
LAC * ,AR0
ADLK _OSRdyTbl+0,0
SACL *
LAR AR5,* ,AR5
LAC * ,AR3
MAR *-
OR * ,AR5
SACL *
.line 57
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 58
;>>>> return (OS_NO_ERR);
;>>>> } else {
LACK 0
B EPI0_15
L35:
.line 60
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 61
;>>>> return (OS_NO_MORE_TCB);
LACK 70
EPI0_15:
.line 63
MAR * ,AR1
SBRK 3
LAR AR0,*-
PSHD *
RET
.endfunc 781,000000000H,2
.sym _OSTimeTick,_OSTimeTick,32,2,0
.globl _OSTimeTick
.func 797
;>>>> void OSTimeTick (void)
;>>>> 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 6
;>>>> OSTimeTickHook(); /* Call user definable hook */
CALL _OSTimeTickHook
.line 7
;>>>> ptcb = OSTCBList; /* Point at first TCB in TCB list */
MAR * ,AR2
LARK AR2,1
MAR *0+
BLKD #_OSTCBList,*
.line 8
;>>>> while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { /* Go through all TCBs in TCB list */
LAR AR3,* ,AR3
ADRK 7
LAC *
SUBK 10
BZ L38
MAR * ,AR2
L37:
.line 9
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.line 10
;>>>> if (ptcb->OSTCBDly != 0) { /* Delayed or waiting for event with TO */
LAR AR3,* ,AR3
ADRK 5
LAC *
BZ L39
.line 11
;>>>> if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
ZALS *
SUBK 1
SACL *
ANDK 0FFFFh
BNZ L39
.line 12
;>>>> if (!(ptcb->OSTCBStat & OS_STAT_SUSPEND)) { /* Is task suspended? */
MAR *+
BIT * ,12
BBNZ L41
.line 13
;>>>> OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make task Rdy to Run (timed out)*/
LDPK _OSRdyGrp
LAC _OSRdyGrp
ADRK 5
OR * ,AR2
SACL _OSRdyGrp
.line 14
;>>>> OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
;>>>> } else { /* Yes, Leave 1 tick to prevent ... */
LAR AR4,* ,AR4
ADRK 9
LAC * ,AR0
ADLK _OSRdyTbl+0,0
SACL *
LAR AR5,* ,AR5
LAC * ,AR3
MAR *-
OR * ,AR5
SACL *
B L39
L41:
.line 16
;>>>> ptcb->OSTCBDly = 1; /* ... loosing the task when the ... */
LACK 1
MAR *-
SACL *
L39:
.line 20
;>>>> ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
MAR * ,AR2
LAR AR3,* ,AR3
MAR *+
LAC * ,AR2
SACL *
.line 21
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 8
LAR AR3,* ,AR3
ADRK 7
LAC * ,AR2
SUBK 10
BNZ L37
L38:
.line 23
;>>>> OS_ENTER_CRITICAL(); /* Update the 32-bit tick counter */
SETC INTM
.line 24
;>>>> OSTime++;
LDPK _OSTime
ZALS _OSTime
ADDH _OSTime+1
ADDK 1
SACL _OSTime
SACH _OSTime+1
.line 25
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
EPI0_16:
.line 26
MAR * ,AR1
SBRK 3
LAR AR0,*-
PSHD *
RET
.endfunc 822,000000000H,2
.sym _OSVersion,_OSVersion,46,2,0
.globl _OSVersion
.func 838
;>>>> INT16U OSVersion (void)
******************************************************
* FUNCTION DEF : _OSVersion
******************************************************
_OSVersion:
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,1
LAR AR0,*0+
.line 3
;>>>> return (OS_VERSION);
LACK 200
EPI0_17:
.line 4
SBRK 2
LAR AR0,*-
PSHD *
RET
.endfunc 841,000000000H,1
.file "Os_mbox.c"
.sym _OSMboxAccept,_OSMboxAccept,96,2,0
.globl _OSMboxAccept
.func 37
;>>>> void *OSMboxAccept (OS_EVENT *pevent)
******************************************************
* FUNCTION DEF : _OSMboxAccept
******************************************************
_OSMboxAccept:
LF18 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,2
LAR AR0,*0+
.sym _pevent,-3+LF18,24,9,16,.fake0
.sym _msg,1,16,1,16
.line 2
;>>>> void *msg;
.line 6
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.line 7
;>>>> if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
MAR * ,AR2
LARK AR2,-3+LF18
MAR *0+
LAR AR3,* ,AR3
ADRK 4
LAC *
SUBK 1
BZ L43
.line 8
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 9
;>>>> return ((void *)0);
LACK 0
B EPI0_18
L43:
.line 11
;>>>> msg = pevent->OSEventPtr;
SBRK 4
LAC * ,AR2
ADRK 4-LF18
SACL *
.line 12
;>>>> if (msg != (void *)0) { /* See if there is already a message */
LAC *
BZ L44
.line 13
;>>>> pevent->OSEventPtr = (void *)0; /* Clear the mailbox */
LACK 0
MAR * ,AR3
SACL *
L44:
.line 15
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 16
;>>>> return (msg); /* Return the message received (or NULL) */
MAR * ,AR2
ZALS *
EPI0_18:
.line 17
MAR * ,AR1
SBRK 3
LAR AR0,*-
PSHD *
RET
.endfunc 53,000000000H,2
.sym _OSMboxCreate,_OSMboxCreate,104,2,0,.fake0
.globl _OSMboxCreate
.func 71
;>>>> OS_EVENT *OSMboxCreate(void *msg)
******************************************************
* FUNCTION DEF : _OSMboxCreate
******************************************************
_OSMboxCreate:
LF19 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,2
LAR AR0,*0+
.sym _msg,-3+LF19,16,9,16
.sym _pevent,1,24,1,16,.fake0
.line 2
;>>>> OS_EVENT *pevent;
.line 6
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.line 7
;>>>> pevent = OSEventFreeList; /* Get next free event control block */
MAR * ,AR2
LARK AR2,1
MAR *0+
BLKD #_OSEventFreeList,*
.line 8
;>>>> if (OSEventFreeList != (OS_EVENT *)0) { /* See if pool of free ECB pool was empty */
LDPK _OSEventFreeList
LAC _OSEventFreeList
BZ L45
.line 9
;>>>> OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
LAR AR3,_OSEventFreeList
MAR * ,AR3
BLDD * ,#_OSEventFreeList
L45:
.line 11
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 12
;>>>> if (pevent != (OS_EVENT *)0) {
MAR * ,AR2
LAC *
BZ L46
.line 13
;>>>> pevent->OSEventType = OS_EVENT_TYPE_MBOX;
LAR AR3,* ,AR3
LACK 1
ADRK 4
SACL * ,AR2
.line 14
;>>>> pevent->OSEventPtr = msg; /* Deposit message in event control block */
SBRK 4-LF19
LAC * ,AR3
SBRK 4
SACL * ,AR1
.line 15
;>>>> OSEventWaitListInit(pevent);
SAR AR3,*+
CALL _OSEventWaitListInit
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -