📄 ucos_ii.asm
字号:
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 6
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))
;>>>> ptcb->OSTCBMsg = (void *)0; /* No message received */
;>>>> #endif
LACK 0
SBRK 6
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 3
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 10
OR * ,AR2
SACL _OSRdyGrp
.line 56
;>>>> OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
LAR AR4,* ,AR4
ADRK 8
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 772,000000000H,2
.sym _OSTimeTick,_OSTimeTick,32,2,0
.globl _OSTimeTick
.func 788
;>>>> 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 6
LAC *
SUBK 3
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 4
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 8
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 6
LAC * ,AR2
SUBK 3
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 813,000000000H,2
.sym _OSVersion,_OSVersion,46,2,0
.globl _OSVersion
.func 829
;>>>> 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 832,000000000H,1
.file "os_sem.c"
.sym _OSSemAccept,_OSSemAccept,46,2,0
.globl _OSSemAccept
.func 39
;>>>> INT16U OSSemAccept (OS_EVENT *pevent)
******************************************************
* FUNCTION DEF : _OSSemAccept
******************************************************
_OSSemAccept:
LF18 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,2
LAR AR0,*0+
.sym _pevent,-3+LF18,24,9,16,.fake0
.sym _cnt,1,14,1,16
.line 2
;>>>> INT16U cnt;
.line 6
;>>>> OS_ENTER_CRITICAL();
setc intm
.line 7
;>>>> if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
MAR * ,AR2
LARK AR2,-3+LF18
MAR *0+
LAR AR3,* ,AR3
ADRK 3
LAC *
SUBK 3
BZ L43
.line 8
;>>>> OS_EXIT_CRITICAL();
clrc intm
.line 9
;>>>> return (0);
LACK 0
B EPI0_18
L43:
.line 11
;>>>> cnt = pevent->OSEventCnt;
MAR *-
LAC * ,AR2
ADRK 4-LF18
SACL *
.line 12
;>>>> if (cnt > 0) { /* See if resource is available */
LAC *
BZ L44
.line 13
;>>>> pevent->OSEventCnt--; /* Yes, decrement semaphore and notify caller */
MAR * ,AR3
LAC *
SUBK 1
SACL *
L44:
.line 15
;>>>> OS_EXIT_CRITICAL();
clrc intm
.line 16
;>>>> return (cnt); /* Return semaphore count */
MAR * ,AR2
ZALS *
EPI0_18:
.line 17
MAR * ,AR1
SBRK 3
LAR AR0,*-
PSHD *
RET
.endfunc 55,000000000H,2
.sym _OSSemCreate,_OSSemCreate,104,2,0,.fake0
.globl _OSSemCreate
.func 75
;>>>> OS_EVENT *OSSemCreate (INT16U cnt)
******************************************************
* FUNCTION DEF : _OSSemCreate
******************************************************
_OSSemCreate:
LF19 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,2
LAR AR0,*0+
.sym _cnt,-3+LF19,14,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) { /* Get an event control block */
MAR * ,AR2
LAC *
BZ L46
.line 13
;>>>> pevent->OSEventType = OS_EVENT_TYPE_SEM;
LAR AR3,* ,AR3
LACK 3
ADRK 3
SACL * ,AR2
.line 14
;>>>> pevent->OSEventCnt = cnt; /* Set semaphore value */
SBRK 4-LF19
LAC * ,AR3
MAR *-
SACL *
.line 15
;>>>> OSEventWaitListInit(pevent);
SBRK 2
MAR * ,AR1
SAR AR3,*+
CALL _OSEventWaitListInit
MAR *-
L46:
.line 17
;>>>> return (pevent);
MAR * ,AR2
LARK AR2,1
MAR *0+
ZALS *
EPI0_19:
.line 18
MAR * ,AR1
SBRK 3
LAR AR0,*-
PSHD *
RET
.endfunc 92,000000000H,2
.sym _OSSemPend,_OSSemPend,32,2,0
.globl _OSSemPend
.func 124
;>>>> void OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
******************************************************
* FUNCTION DEF : _OSSemPend
******************************************************
_OSSemPend:
LF20 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,1
LAR AR0,*0+
.sym _pevent,-3+LF20,24,9,16,.fake0
.sym _timeout,-4+LF20,14,9,16
.sym _err,-5+LF20,28,9,16
.line 2
.line 3
;>>>> OS_ENTER_CRITICAL();
setc intm
.line 4
;>>>> if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
MAR * ,AR2
LARK AR2,-3+LF20
MAR *0+
LAR AR3,* ,AR3
ADRK 3
LAC *
SUBK 3
BZ L47
.line 5
;>>>> OS_EXIT_CRITICAL();
clrc intm
.line 6
;>>>> *err = OS_ERR_EVENT_TYPE;
MAR * ,AR2
SBRK 2
LAR AR4,* ,AR4
LACK 1
SACL *
L47:
.line 8
;>>>> if (pevent->OSEventCnt > 0) { /* If sem. is positive, resource available ... */
MAR * ,AR3
MAR *-
LAC *
BZ L48
.line 9
;>>>> pevent->OSEventCnt--; /* ... decrement semaphore only if positive. */
LAC *
SUBK 1
SACL *
.line 10
;>>>> OS_EXIT_CRITICAL();
clrc intm
.line 11
;>>>> *err = OS_NO_ERR;
MAR * ,AR2
LARK AR2,-5+LF20
MAR *0+
LAR AR4,* ,AR4
LACK 0
SACL *
B L49
L48:
.line 12
;>>>> } else if (OSIntNesting > 0) { /* See if called from ISR ... */
LDPK _OSIntNesting
LAC _OSIntNesting
BZ L50
.line 13
;>>>> OS_EXIT_CRITICAL(); /* ... can't PEND from an ISR */
clrc intm
.line 14
;>>>> *err = OS_ERR_PEND_ISR;
;>>>> } else { /* Otherwise, must wait until event occurs */
MAR * ,AR2
LARK AR2,-5+LF20
MAR *0+
LAR AR4,* ,AR4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -