📄 ucos_ii.asm
字号:
.sym _y,1,14,1,16
.line 10
;>>>> if ((OSIntNesting == 0) && (OSLockNesting == 0)) { /* Sched. only if all ISRs done & not locked */
LDPK _OSIntNesting
LAC _OSIntNesting
BNZ L27
LAC _OSLockNesting
BNZ L27
.line 11
;>>>> y = OSUnMapTbl[OSRdyGrp]; /* Get pointer to HPT ready to run */
LAC _OSRdyGrp
ADLK _OSUnMapTbl+0,0
MAR * ,AR0
SACL *
LAR AR3,* ,AR3
LAC * ,AR2
LARK AR2,1
MAR *0+
SACL *
.line 12
;>>>> 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 13
;>>>> if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */
LAC _OSPrioHighRdy
SUB _OSPrioCur
BZ L27
.line 14
;>>>> OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
LAC _OSPrioHighRdy
ADLK _OSTCBPrioTbl+0,0
MAR * ,AR0
SACL *
LAR AR3,* ,AR3
BLDD * ,#_OSTCBHighRdy
.line 15
;>>>> OSCtxSwCtr++; /* Increment context switch counter */
ZALS _OSCtxSwCtr
ADDH _OSCtxSwCtr+1
ADDK 1
SACL _OSCtxSwCtr
SACH _OSCtxSwCtr+1
.line 16
;>>>> OS_TASK_SW(); /* Perform a context switch */
INTR 31
L27:
.line 19
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
EPI0_16:
.line 20
MAR * ,AR1
SBRK 3
LAR AR0,*-
PSHD *
RET
.endfunc 888,000000000H,2
.sym _OS_TaskIdle,_OS_TaskIdle,32,2,0
.globl _OS_TaskIdle
.func 911
;>>>> void OS_TaskIdle (void *pdata)
******************************************************
* FUNCTION DEF : _OS_TaskIdle
******************************************************
_OS_TaskIdle:
LF17 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,1
LAR AR0,*0+
.sym _pdata,-3+LF17,16,9,16
.line 2
;>>>> #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;>>>> OS_CPU_SR cpu_sr;
;>>>> #endif
.line 8
;>>>> pdata = pdata; /* Prevent compiler warning for not using 'pdata' */
;>>>> for (;;) {
L29:
.line 10
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.line 11
;>>>> OSIdleCtr++;
LDPK _OSIdleCtr
ZALS _OSIdleCtr
ADDH _OSIdleCtr+1
ADDK 1
SACL _OSIdleCtr
SACH _OSIdleCtr+1
.line 12
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 13
;>>>> OSTaskIdleHook(); /* Call user definable HOOK */
CALL _OSTaskIdleHook,AR1
.line 14
B L29
.endfunc 925,000000000H,1
.sym _OS_TCBInit,_OS_TCBInit,46,2,0
.globl _OS_TCBInit
.func 1035
;>>>> INT8U OS_TCBInit (INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT32U stk_size, void *pext, INT16U opt)
******************************************************
* FUNCTION DEF : _OS_TCBInit
******************************************************
_OS_TCBInit:
LF18 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,2
LAR AR0,*0+
.sym _prio,-3+LF18,14,9,16
.sym _ptos,-4+LF18,30,9,16
.sym _pbos,-5+LF18,30,9,16
.sym _id,-6+LF18,14,9,16
.sym _stk_size,-8+LF18,15,9,32
.sym _pext,-9+LF18,16,9,16
.sym _opt,-10+LF18,14,9,16
.sym _ptcb,1,24,1,16,_os_tcb
.line 2
;>>>> #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;>>>> OS_CPU_SR cpu_sr;
;>>>> #endif
;>>>> OS_TCB *ptcb;
.line 9
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.line 10
;>>>> ptcb = OSTCBFreeList; /* Get a free TCB from the free TCB list */
MAR * ,AR2
LARK AR2,1
MAR *0+
BLKD #_OSTCBFreeList,*
.line 11
;>>>> if (ptcb != (OS_TCB *)0) {
LAC *
BZ L30
.line 12
;>>>> OSTCBFreeList = ptcb->OSTCBNext; /* Update pointer to free TCB list */
LAR AR3,* ,AR3
MAR *+
BLDD * ,#_OSTCBFreeList
.line 13
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 14
;>>>> ptcb->OSTCBStkPtr = ptos; /* Load Stack pointer in TCB */
MAR * ,AR2
SBRK 5-LF18
LAC *+,AR3
MAR *-
SACL * ,AR2
.line 15
;>>>> ptcb->OSTCBPrio = (INT8U)prio; /* Load task priority into TCB */
LAC * ,AR3
ADRK 6
SACL *-
.line 16
;>>>> ptcb->OSTCBStat = OS_STAT_RDY; /* Task is ready to run */
LACK 0
SACL *-
.line 17
;>>>> ptcb->OSTCBDly = 0; /* Task is not delayed */
;>>>> #if OS_TASK_CREATE_EXT_EN > 0
;>>>> 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 26
;>>>> pext = pext; /* Prevent compiler warning if not used */
.line 27
;>>>> stk_size = stk_size;
.line 28
;>>>> pbos = pbos;
.line 29
;>>>> opt = opt;
.line 30
;>>>> id = id;
;>>>> #endif
;>>>> #if OS_TASK_DEL_EN > 0
;>>>> ptcb->OSTCBDelReq = OS_NO_ERR;
;>>>> #endif
.line 37
;>>>> ptcb->OSTCBY = prio >> 3; /* Pre-compute X, Y, BitX and BitY */
RSXM
LAC * ,12,AR3
ADRK 4
SACH * ,1
.line 38
;>>>> ptcb->OSTCBBitY = OSMapTbl[ptcb->OSTCBY];
LAC * ,AR0
ADLK _OSMapTbl+0,0
SACL *
LAR AR4,* ,AR4
LAC * ,AR3
ADRK 2
SACL * ,AR2
.line 39
;>>>> ptcb->OSTCBX = prio & 0x07;
LACK 7
AND * ,AR3
SBRK 3
SACL *
.line 40
;>>>> ptcb->OSTCBBitX = OSMapTbl[ptcb->OSTCBX];
;>>>> #if OS_EVENT_EN > 0
LAC * ,AR0
ADLK _OSMapTbl+0,0
SACL *
LAR AR4,* ,AR4
LAC * ,AR3
ADRK 2
SACL *
.line 43
;>>>> ptcb->OSTCBEventPtr = (OS_EVENT *)0; /* Task is not pending on an event */
;>>>> #endif
;>>>> #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0) && (OS_TASK_DEL_EN > 0)
;>>>> ptcb->OSTCBFlagNode = (OS_FLAG_NODE *)0; /* Task is not pending on an event flag */
;>>>> #endif
;>>>> #if (OS_MBOX_EN > 0) || ((OS_Q_EN > 0) && (OS_MAX_QS > 0))
;>>>> ptcb->OSTCBMsg = (void *)0; /* No message received */
;>>>> #endif
;>>>> #if OS_VERSION >= 204
LACK 0
SBRK 6
SACL *
.line 55
;>>>> OSTCBInitHook(ptcb);
;>>>> #endif
SBRK 3
MAR * ,AR1
SAR AR3,*+
CALL _OSTCBInitHook
MAR *-,AR2
.line 58
;>>>> OSTaskCreateHook(ptcb); /* Call user defined hook */
LARK AR2,1
MAR *0+
LAC * ,AR1
SACL *+
CALL _OSTaskCreateHook
MAR *-
.line 60
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.line 61
;>>>> OSTCBPrioTbl[prio] = ptcb;
MAR * ,AR2
LARK AR2,-3+LF18
MAR *0+
LAC * ,AR0
ADLK _OSTCBPrioTbl+0,0
SACL *
LAR AR3,* ,AR2
ADRK 4-LF18
LAC * ,AR3
SACL * ,AR2
.line 62
;>>>> ptcb->OSTCBNext = OSTCBList; /* Link into TCB chain */
LAR AR3,* ,AR3
MAR *+
BLKD #_OSTCBList,*+
.line 63
;>>>> ptcb->OSTCBPrev = (OS_TCB *)0;
LACK 0
SACL *
.line 64
;>>>> if (OSTCBList != (OS_TCB *)0) {
LDPK _OSTCBList
LAC _OSTCBList
BZ L31
.line 65
;>>>> OSTCBList->OSTCBPrev = ptcb;
LAR AR4,_OSTCBList
SBRK 2
MAR * ,AR4
ADRK 2
SAR AR3,*
L31:
.line 67
;>>>> OSTCBList = ptcb;
MAR * ,AR2
BLDD * ,#_OSTCBList
.line 68
;>>>> OSRdyGrp |= ptcb->OSTCBBitY; /* Make task ready to run */
LAR AR3,* ,AR3
LAC _OSRdyGrp
ADRK 10
OR * ,AR2
SACL _OSRdyGrp
.line 69
;>>>> 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 70
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 71
;>>>> return (OS_NO_ERR);
LACK 0
B EPI0_18
L30:
.line 73
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 74
;>>>> return (OS_NO_MORE_TCB);
LACK 70
EPI0_18:
.line 75
MAR * ,AR1
SBRK 3
LAR AR0,*-
PSHD *
RET
.endfunc 1109,000000000H,2
.file "os_sem.c"
.sym _OSSemCreate,_OSSemCreate,104,2,0,.fake0
.globl _OSSemCreate
.func 83
;>>>> 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
;>>>> #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;>>>> OS_CPU_SR cpu_sr;
;>>>> #endif
;>>>> OS_EVENT *pevent;
.line 9
;>>>> if (OSIntNesting > 0) { /* See if called from ISR ... */
LDPK _OSIntNesting
LAC _OSIntNesting
BZ L32
.line 10
;>>>> return ((OS_EVENT *)0); /* ... can't CREATE from an ISR */
LACK 0
B EPI0_19
L32:
.line 12
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.line 13
;>>>> pevent = OSEventFreeList; /* Get next free event control block */
MAR * ,AR2
LARK AR2,1
MAR *0+
BLKD #_OSEventFreeList,*
.line 14
;>>>> if (OSEventFreeList != (OS_EVENT *)0) { /* See if pool of free ECB pool was empty */
LAC _OSEventFreeList
BZ L33
.line 15
;>>>> OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
LAR AR3,_OSEventFreeList
MAR * ,AR3
ADRK 3
BLDD * ,#_OSEventFreeList
L33:
.line 17
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 18
;>>>> if (pevent != (OS_EVENT *)0) { /* Get an event control block */
MAR * ,AR2
LAC *
BZ L34
.line 19
;>>>> pevent->OSEventType = OS_EVENT_TYPE_SEM;
LAR AR3,* ,AR3
LACK 3
SACL * ,AR2
.line 20
;>>>> pevent->OSEventCnt = cnt; /* Set semaphore value */
SBRK 4-LF19
LAC * ,AR3
ADRK 2
SACL *+
.line 21
;>>>> pevent->OSEventPtr = (void *)0; /* Unlink from ECB free list */
LACK 0
SACL *
.line 22
;>>>> OS_EventWaitListInit(pevent); /* Initialize to 'nobody waiting' on sem. */
SBRK 3
MAR * ,AR1
SAR AR3,*+
CALL _OS_EventWaitListInit
MAR *-
L34:
.line 24
;>>>> return (pevent);
MAR * ,AR2
LARK AR2,1
MAR *0+
ZALS *
EPI0_19:
.line 25
MAR * ,AR1
SBRK 3
LAR AR0,*-
PSHD *
RET
.endfunc 107,000000000H,2
.sym _OSSemPend,_OSSemPend,32,2,0
.globl _OSSemPend
.func 244
;>>>> 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,30,9,16
.line 2
;>>>> #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;>>>> OS_CPU_SR cpu_sr;
;>>>> #endif
.line 8
;>>>> if (OSIntNesting > 0) { /* See if called from ISR ... */
LDPK _OSIntNesting
LAC _OSIntNesting
BZ L35
.line 9
;>>>> *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
MAR * ,AR2
LARK AR2,-5+LF20
MAR *0+
LAR AR3,* ,AR3
LACK 2
SACL *
.line 10
;>>>> return;
;>>>> #if OS_ARG_CHK_EN > 0
B EPI0_20
L35:
.line 13
;>>>> if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
MAR * ,AR2
LARK AR2,-3+LF20
MAR *0+
LAC *
BNZ L36
.line 14
;>>>> *err = OS_ERR_PEVENT_NULL;
SBRK 2
LAR AR3,* ,AR3
LACK 4
SACL *
.line 15
;>>>> return;
B EPI0_20
L36:
.line 17
;>>>> if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
LAR AR3,* ,AR3
LAC *
SUBK 3
BZ L37
.line 18
;>>>> *err = OS_ERR_EVENT_TYPE;
MAR * ,AR2
SBRK 2
LAR AR4,* ,AR4
LACK 1
SACL *
.line 19
;>>>> return;
;>>>> #endif
B EPI0_20
L37:
.line 22
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.line 23
;>>>> if (pevent->OSEventCnt > 0) { /* If sem. is positive, resource available ... */
ADRK 2
LAC *
BZ L38
.line 24
;>>>> pevent->OSEventCnt--; /* ... decrement semaphore only if positive. */
LAC *
SUBK 1
SACL *
.line 25
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 26
;>>>> *err = OS_NO_ERR;
MAR * ,AR2
SBRK 2
LAR AR4,* ,AR4
LACK 0
SACL *
.line 27
;>>>> return;
B EPI0_20
L38:
.line 30
;>>>> OSTCBCur->OSTCBStat |= OS_STAT_SEM; /* Resource not available, pend on semaphore */
LAR AR4,_OSTCBCur
MAR * ,AR4
ADRK 5
LACK 1
OR *
SACL *-,AR2
.line 31
;>>>> OSTCBCur->OSTCBDly = timeout; /* Store pend timeout in TCB */
MAR *-
LAC * ,AR4
SACL * ,AR3
.line 32
;>>>> OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
SBRK 2
MAR * ,AR1
SAR AR3,*+
CALL _OS_EventTaskWait
MAR *-
.line 33
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 34
;>>>> OS_Sched(); /* Find next highest priority task ready */
CALL _OS_Sched
.line 35
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.line 36
;>>>> if (OSTCBCur->OSTCBStat & OS_STAT_SEM) { /* Must have timed out if still waiting for event*/
LDPK _OSTCBCur
LAR AR3,_OSTCBCur
MAR * ,AR3
ADRK 5
BIT * ,15
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -