📄 ucos_ii.asm
字号:
LACK 2
SACL *
B L49
L50:
.line 16
;>>>> OSTCBCur->OSTCBStat |= OS_STAT_SEM; /* Resource not available, pend on semaphore */
LAR AR4,_OSTCBCur
MAR * ,AR4
ADRK 5
LACK 1
OR *
SACL *-,AR2
.line 17
;>>>> OSTCBCur->OSTCBDly = timeout; /* Store pend timeout in TCB */
LARK AR2,-4+LF20
MAR *0+
LAC * ,AR4
SACL * ,AR3
.line 18
;>>>> OSEventTaskWait(pevent); /* Suspend task until event or timeout occurs */
SBRK 2
MAR * ,AR1
SAR AR3,*+
CALL _OSEventTaskWait
MAR *-
.line 19
;>>>> OS_EXIT_CRITICAL();
clrc intm
.line 20
;>>>> OSSched(); /* Find next highest priority task ready */
CALL _OSSched
.line 21
;>>>> OS_ENTER_CRITICAL();
setc intm
.line 22
;>>>> 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
BBZ L51
.line 23
;>>>> OSEventTO(pevent);
MAR * ,AR2
LARK AR2,-3+LF20
MAR *0+
LAC * ,AR1
SACL *+
CALL _OSEventTO
MAR *-
.line 24
;>>>> OS_EXIT_CRITICAL();
clrc intm
.line 25
;>>>> *err = OS_TIMEOUT; /* Indicate that didn't get event within TO */
;>>>> } else {
MAR * ,AR2
LARK AR2,-5+LF20
MAR *0+
LAR AR3,* ,AR3
LACK 10
SACL *
B L49
L51:
.line 27
;>>>> OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
LACK 0
SBRK 2
SACL *
.line 28
;>>>> OS_EXIT_CRITICAL();
clrc intm
.line 29
;>>>> *err = OS_NO_ERR;
MAR * ,AR2
LARK AR2,-5+LF20
MAR *0+
LAR AR4,* ,AR4
SACL *
L49:
EPI0_20:
.line 32
MAR * ,AR1
SBRK 2
LAR AR0,*-
PSHD *
RET
.endfunc 155,000000000H,1
.sym _OSSemPost,_OSSemPost,44,2,0
.globl _OSSemPost
.func 174
;>>>> INT8U OSSemPost (OS_EVENT *pevent)
******************************************************
* FUNCTION DEF : _OSSemPost
******************************************************
_OSSemPost:
LF21 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,3
LAR AR0,*0+
.sym _pevent,-3+LF21,24,9,16,.fake0
.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+LF21
MAR *0+
LAR AR3,* ,AR3
ADRK 3
LAC *
SUBK 3
BZ L53
.line 5
;>>>> OS_EXIT_CRITICAL();
clrc intm
.line 6
;>>>> return (OS_ERR_EVENT_TYPE);
LACK 1
B EPI0_21
L53:
.line 8
;>>>> if (pevent->OSEventGrp) { /* See if any task waiting for semaphore */
MAR *+
LAC *
BZ L54
.line 9
;>>>> OSEventTaskRdy(pevent, (void *)0, OS_STAT_SEM); /* Ready highest prio task waiting on event */
MAR * ,AR1
LACK 1
SACL *+
LACK 0
SACL *+,AR3
SBRK 4
MAR * ,AR1
SAR AR3,*+
CALL _OSEventTaskRdy
SBRK 3
.line 10
;>>>> OS_EXIT_CRITICAL();
clrc intm
.line 11
;>>>> OSSched(); /* Find highest priority task ready to run */
CALL _OSSched
.line 12
;>>>> return (OS_NO_ERR);
;>>>> } else {
LACK 0
B EPI0_21
L54:
.line 14
;>>>> if (pevent->OSEventCnt < 65535) { /* Make sure semaphore will not overflow */
SBRK 2
ZALS *
BNV $+2
MAR * ,AR2
ADRK 4-LF21
SACL *+
SACH *-
LT *+
MPYK 1
LPH *
RSXM
LACK 65535
SPAC
BNV $+6
BGZ L55
B $+4
BLEZ L55
.line 15
;>>>> pevent->OSEventCnt++; /* Increment semaphore count to register event */
MAR * ,AR3
LAC *
ADDK 1
SACL *
.line 16
;>>>> OS_EXIT_CRITICAL();
clrc intm
.line 17
;>>>> return (OS_NO_ERR);
;>>>> } else { /* Semaphore value has reached its maximum */
LACK 0
B EPI0_21
L55:
.line 19
;>>>> OS_EXIT_CRITICAL();
clrc intm
.line 20
;>>>> return (OS_SEM_OVF);
LACK 50
EPI0_21:
.line 23
MAR * ,AR1
SBRK 4
LAR AR0,*-
PSHD *
RET
.endfunc 196,000000000H,3
.sym _OSSemQuery,_OSSemQuery,44,2,0
.globl _OSSemQuery
.func 214
;>>>> INT8U OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *pdata)
******************************************************
* FUNCTION DEF : _OSSemQuery
******************************************************
_OSSemQuery:
LF22 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,4
LAR AR0,*0+
.sym _pevent,-3+LF22,24,9,16,.fake0
.sym _pdata,-4+LF22,24,9,16,.fake1
.sym _i,1,12,1,16
.sym _psrc,2,28,1,16
.sym _pdest,3,28,1,16
.line 2
;>>>> INT8U i;
;>>>> INT8U *psrc;
;>>>> INT8U *pdest;
.line 8
;>>>> OS_ENTER_CRITICAL();
setc intm
.line 9
;>>>> if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
MAR * ,AR2
LARK AR2,-3+LF22
MAR *0+
LAR AR3,* ,AR3
ADRK 3
LAC *
SUBK 3
BZ L56
.line 10
;>>>> OS_EXIT_CRITICAL();
clrc intm
.line 11
;>>>> return (OS_ERR_EVENT_TYPE);
LACK 1
B EPI0_22
L56:
.line 13
;>>>> pdata->OSEventGrp = pevent->OSEventGrp; /* Copy message mailbox wait list */
MAR *+,AR2
MAR *-
LAR AR4,* ,AR3
LAC * ,AR4
ADRK 2
SACL * ,AR2
.line 14
;>>>> psrc = &pevent->OSEventTbl[0];
MAR *+
LAC *
ADDK 1
ADRK 5-LF22
SACL *
.line 15
;>>>> pdest = &pdata->OSEventTbl[0];
SBRK 6-LF22
LAC *
ADDK 1
ADRK 7-LF22
SACL *
.line 16
;>>>> for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
LACK 0
SBRK 2
SACL *
LAC *
BNZ L58
MAR *+
L57:
.line 17
;>>>> *pdest++ = *psrc++;
LAR AR3,*+
LAR AR4,*-,AR3
LAC *+,AR2
SAR AR3,*+,AR4
SACL *+,AR2
SAR AR4,*
.line 16
SBRK 2
LAC *
ADDK 1
SACL *
LAC *+
BZ L57
L58:
.line 19
;>>>> pdata->OSCnt = pevent->OSEventCnt; /* Get semaphore count */
LARK AR2,-3+LF22
MAR *0+
LAR AR3,*-
LAR AR4,* ,AR3
ADRK 2
LAC * ,AR4
SACL *
.line 20
;>>>> OS_EXIT_CRITICAL();
clrc intm
.line 21
;>>>> return (OS_NO_ERR);
LACK 0
EPI0_22:
.line 22
MAR * ,AR1
SBRK 5
LAR AR0,*-
PSHD *
RET
.endfunc 235,000000000H,4
.file "os_task.c"
.sym _OSDummy,_OSDummy,32,3,0
.func 43
;>>>> static void OSDummy (void)
******************************************************
* FUNCTION DEF : _OSDummy
******************************************************
_OSDummy:
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,1
LAR AR0,*0+
EPI0_23:
.line 3
SBRK 2
LAR AR0,*-
PSHD *
RET
.endfunc 45,000000000H,1
.sym _OSTaskCreate,_OSTaskCreate,44,2,0
.globl _OSTaskCreate
.func 173
;>>>> INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio)
******************************************************
* FUNCTION DEF : _OSTaskCreate
******************************************************
_OSTaskCreate:
LF24 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,3
LAR AR0,*0+,AR2
.sym _task,-3+LF24,144,9,16
.sym _pdata,-4+LF24,16,9,16
.sym _ptos,-5+LF24,30,9,16
.sym _prio,-6+LF24,12,9,16
.sym _psp,1,16,1,16
.sym _err,2,12,1,16
.line 2
;>>>> void *psp;
;>>>> INT8U err;
.line 7
;>>>> if (prio > OS_LOWEST_PRIO) { /* Make sure priority is within allowable range */
LARK AR2,-6+LF24
MAR *0+
ZALS *
SUBK 3
BLEZ L59
.line 8
;>>>> return (OS_PRIO_INVALID);
LACK 42
B EPI0_24
L59:
.line 10
;>>>> OS_ENTER_CRITICAL();
setc intm
.line 11
;>>>> if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority */
ADLK _OSTCBPrioTbl+3,0
MAR * ,AR0
SACL *
LAR AR3,* ,AR3
LAC *
BNZ L60
.line 12
;>>>> OSTCBPrioTbl[prio] = (OS_TCB *)1; /* Reserve the priority to prevent others from doing ... */
MAR * ,AR2
LAC * ,AR0
ADLK _OSTCBPrioTbl+0,0
SACL *
LAR AR3,* ,AR3
LACK 1
SACL *
.line 14
;>>>> OS_EXIT_CRITICAL();
clrc intm
.line 15
;>>>> psp = (void *)OSTaskStkInit(task, pdata, ptos, 0); /* Initialize the task's stack */
MAR * ,AR1
LACK 0
SACL *+,AR2
MAR *+
LAC *+,AR1
SACL *+,AR2
LAC *+,AR1
SACL *+,AR2
LAC * ,AR1
SACL *+
CALL _OSTaskStkInit
SBRK 4
MAR * ,AR2
LARK AR2,1
MAR *0+
SACL * ,AR1
.line 16
;>>>> err = OSTCBInit(prio, psp, (void *)0, 0, 0, (void *)0, 0);
LACK 0
SACL *+
SACL *+
SACL *+
SACL *+
SACL *+,AR2
LAC * ,AR1
SACL *+,AR2
SBRK 7-LF24
LAC * ,AR1
SACL *+
CALL _OSTCBInit
SBRK 7
MAR * ,AR2
LARK AR2,2
MAR *0+
SACL *
.line 17
;>>>> if (err == OS_NO_ERR) {
LAC *
BNZ L61
.line 18
;>>>> OS_ENTER_CRITICAL();
setc intm
.line 19
;>>>> OSTaskCtr++; /* Increment the #tasks counter */
LDPK _OSTaskCtr
LAC _OSTaskCtr
ADDK 1
SACL _OSTaskCtr
.line 20
;>>>> OSTaskCreateHook(OSTCBPrioTbl[prio]); /* Call user defined hook */
SBRK 8-LF24
LAC * ,AR0
ADLK _OSTCBPrioTbl+0,0
SACL *
LAR AR3,* ,AR3
LAC * ,AR1
SACL *+
CALL _OSTaskCreateHook
MAR *-
.line 21
;>>>> OS_EXIT_CRITICAL();
clrc intm
.line 22
;>>>> if (OSRunning) { /* Find highest priority task if multitasking has started */
LDPK _OSRunning
LAC _OSRunning
BZ L63
.line 23
;>>>> OSSched();
;>>>> } else {
CALL _OSSched
B L63
L61:
.line 26
;>>>> OS_ENTER_CRITICAL();
setc intm
.line 27
;>>>> OSTCBPrioTbl[prio] = (OS_TCB *)0;/* Make this priority available to others */
SBRK 8-LF24
LAC * ,AR0
ADLK _OSTCBPrioTbl+0,0
SACL *
LAR AR3,* ,AR3
LACK 0
SACL *
.line 28
;>>>> OS_EXIT_CRITICAL();
clrc intm
L63:
.line 30
;>>>> return (err);
;>>>> } else {
MAR * ,AR2
LARK AR2,2
MAR *0+
ZALS *
B EPI0_24
L60:
.line 32
;>>>> OS_EXIT_CRITICAL();
clrc intm
.line 33
;>>>> return (OS_PRIO_EXIST);
LACK 40
EPI0_24:
.line 35
MAR * ,AR1
SBRK 4
LAR AR0,*-
PSHD *
RET
.endfunc 207,000000000H,3
.sym _OSTaskQuery,_OSTaskQuery,44,2,0
.globl _OSTaskQuery
.func 700
;>>>> INT8U OSTaskQuery (INT8U prio, OS_TCB *pdata)
******************************************************
* FUNCTION DEF : _OSTaskQuery
******************************************************
_OSTaskQuery:
LF25 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,2
LAR AR0,*0+,AR2
.sym _prio,-3+LF25,12,9,16
.sym _pdata,-4+LF25,24,9,16,_os_tcb
.sym _ptcb,1,24,1,16,_os_tcb
.line 2
;>>>> OS_TCB *ptcb;
.line 6
;>>>> if (prio > OS_LOWEST_PRIO && prio != OS_PRIO_SELF) { /* Task priority valid ? */
LARK AR2,-3+LF25
MAR *0+
ZALS *
SUBK 3
BLEZ L64
LAC *
SUBK 255
BZ L64
.line 7
;>>>> return (OS_PRIO_INVALID);
LACK 42
B EPI0_25
L64:
.line 9
;>>>> OS_ENTER_CRITICAL();
setc intm
.line 10
;>>>> if (prio == OS_PRIO_SELF) { /* See if suspend SELF */
LAC *
SUBK 255
BNZ L65
.line 11
;>>>> prio = OSTCBCur->OSTCBPrio;
LDPK _OSTCBCur
LAR AR3,_OSTCBCur
MAR * ,AR3
ADRK 6
LAC * ,AR2
SACL *
L65:
.line 13
;>>>> if ((ptcb = OSTCBPrioTbl[prio]) == (OS_TCB *)0) { /* Task to query must exist */
LAC * ,AR0
ADLK _OSTCBPrioTbl+0,0
SACL *
LAR AR3,* ,AR3
LAC * ,AR2
ADRK 4-LF25
SACL *
ANDK 0FFFFh
BNZ
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -