📄 ucos_ii.asm
字号:
MAR *-
L46:
.line 17
;>>>> return (pevent); /* Return pointer to event control block */
MAR * ,AR2
LARK AR2,1
MAR *0+
ZALS *
EPI0_19:
.line 18
MAR * ,AR1
SBRK 3
LAR AR0,*-
PSHD *
RET
.endfunc 88,000000000H,2
.sym _OSMboxPend,_OSMboxPend,96,2,0
.globl _OSMboxPend
.func 118
;>>>> void *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
******************************************************
* FUNCTION DEF : _OSMboxPend
******************************************************
_OSMboxPend:
LF20 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,2
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
.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+LF20
MAR *0+
LAR AR3,* ,AR3
ADRK 4
LAC *
SUBK 1
BZ L47
.line 8
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 9
;>>>> *err = OS_ERR_EVENT_TYPE;
MAR * ,AR2
SBRK 2
LAR AR4,* ,AR4
LACK 1
SACL *
.line 10
;>>>> return ((void *)0);
LACK 0
B EPI0_20
L47:
.line 12
;>>>> msg = pevent->OSEventPtr;
SBRK 4
LAC * ,AR2
ADRK 4-LF20
SACL *
.line 13
;>>>> if (msg != (void *)0) { /* See if there is already a message */
LAC *
BZ L48
.line 14
;>>>> pevent->OSEventPtr = (void *)0; /* Clear the mailbox */
LACK 0
MAR * ,AR3
SACL *
.line 15
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 16
;>>>> *err = OS_NO_ERR;
MAR * ,AR2
SBRK 6-LF20
LAR AR4,* ,AR4
SACL *
B L49
L48:
.line 17
;>>>> } else if (OSIntNesting > 0) { /* See if called from ISR ... */
LDPK _OSIntNesting
LAC _OSIntNesting
BZ L50
.line 18
;>>>> OS_EXIT_CRITICAL(); /* ... can't PEND from an ISR */
CLRC INTM
.line 19
;>>>> *err = OS_ERR_PEND_ISR;
;>>>> } else {
SBRK 6-LF20
LAR AR4,* ,AR4
LACK 2
SACL *
B L49
L50:
.line 21
;>>>> OSTCBCur->OSTCBStat |= OS_STAT_MBOX; /* Message not available, task will pend */
LAR AR4,_OSTCBCur
MAR * ,AR4
ADRK 6
LACK 2
OR *
SACL * ,AR2
.line 22
;>>>> OSTCBCur->OSTCBDly = timeout; /* Load timeout in TCB */
SBRK 5-LF20
LAC * ,AR4
MAR *-
SACL * ,AR1
.line 23
;>>>> OSEventTaskWait(pevent); /* Suspend task until event or timeout occurs */
SAR AR3,*+
CALL _OSEventTaskWait
MAR *-
.line 24
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 25
;>>>> OSSched(); /* Find next highest priority task ready to run */
CALL _OSSched
.line 26
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.line 27
;>>>> if ((msg = OSTCBCur->OSTCBMsg) != (void *)0) { /* See if we were given the message */
LDPK _OSTCBCur
LAR AR3,_OSTCBCur
MAR * ,AR3
ADRK 4
LAC * ,AR2
LARK AR2,1
MAR *0+
SACL *
ANDK 0FFFFh
BZ L51
.line 28
;>>>> OSTCBCur->OSTCBMsg = (void *)0; /* Yes, clear message received */
LACK 0
MAR * ,AR3
SACL *
.line 29
;>>>> OSTCBCur->OSTCBStat = OS_STAT_RDY;
ADRK 2
SACL *
.line 30
;>>>> OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* No longer waiting for event */
SBRK 3
SACL *
.line 31
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 32
;>>>> *err = OS_NO_ERR;
MAR * ,AR2
SBRK 6-LF20
LAR AR4,* ,AR4
SACL *
B L49
L51:
.line 33
;>>>> } else if (OSTCBCur->OSTCBStat & OS_STAT_MBOX) { /* If status is not OS_STAT_RDY, timed out */
MAR * ,AR3
ADRK 2
BIT * ,14
BBZ L53
.line 34
;>>>> OSEventTO(pevent); /* Make task ready */
MAR * ,AR2
SBRK 4-LF20
LAC * ,AR1
SACL *+
CALL _OSEventTO
MAR *-
.line 35
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 36
;>>>> msg = (void *)0; /* Set message contents to NULL */
LACK 0
MAR * ,AR2
LARK AR2,1
MAR *0+
SACL *
.line 37
;>>>> *err = OS_TIMEOUT; /* Indicate that a timeout occured */
;>>>> } else {
SBRK 6-LF20
LAR AR3,* ,AR3
LACK 10
SACL *
B L49
L53:
.line 39
;>>>> msg = pevent->OSEventPtr; /* Message received */
MAR * ,AR2
SBRK 4-LF20
LAR AR4,* ,AR4
LAC * ,AR2
ADRK 4-LF20
SACL * ,AR4
.line 40
;>>>> pevent->OSEventPtr = (void *)0; /* Clear the mailbox */
LACK 0
SACL * ,AR3
.line 41
;>>>> OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
SBRK 3
SACL *
.line 42
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 43
;>>>> *err = OS_NO_ERR;
MAR * ,AR2
SBRK 6-LF20
LAR AR5,* ,AR5
SACL *
L49:
.line 46
;>>>> return (msg); /* Return the message received (or NULL) */
MAR * ,AR2
ADRK 6-LF20
ZALS *
EPI0_20:
.line 47
MAR * ,AR1
SBRK 3
LAR AR0,*-
PSHD *
RET
.endfunc 164,000000000H,2
.sym _OSMboxPost,_OSMboxPost,44,2,0
.globl _OSMboxPost
.func 184
;>>>> INT8U OSMboxPost (OS_EVENT *pevent, void *msg)
******************************************************
* FUNCTION DEF : _OSMboxPost
******************************************************
_OSMboxPost:
LF21 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,1
LAR AR0,*0+
.sym _pevent,-3+LF21,24,9,16,.fake0
.sym _msg,-4+LF21,16,9,16
.line 2
.line 3
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.line 4
;>>>> if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
MAR * ,AR2
LARK AR2,-3+LF21
MAR *0+
LAR AR3,* ,AR3
ADRK 4
LAC *
SUBK 1
BZ L54
.line 5
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 6
;>>>> return (OS_ERR_EVENT_TYPE);
LACK 1
B EPI0_21
L54:
.line 8
;>>>> if (pevent->OSEventGrp) { /* See if any task pending on mailbox */
MAR *+
LAC *
BZ L55
.line 9
;>>>> OSEventTaskRdy(pevent, msg, OS_STAT_MBOX); /* Ready highest priority task waiting on event */
MAR * ,AR1
LACK 2
SACL *+,AR2
MAR *-
LAC * ,AR1
SACL *+,AR3
SBRK 5
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
L55:
.line 14
;>>>> if (pevent->OSEventPtr != (void *)0) { /* Make sure mailbox doesn't already have a msg */
SBRK 5
LAC *
BZ L56
.line 15
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 16
;>>>> return (OS_MBOX_FULL);
;>>>> } else {
LACK 20
B EPI0_21
L56:
.line 18
;>>>> pevent->OSEventPtr = msg; /* Place message in mailbox */
MAR * ,AR2
MAR *-
LAC * ,AR3
SACL *
.line 19
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 20
;>>>> return (OS_NO_ERR);
LACK 0
EPI0_21:
.line 23
MAR * ,AR1
SBRK 2
LAR AR0,*-
PSHD *
RET
.endfunc 206,000000000H,1
.sym _OSMboxQuery,_OSMboxQuery,44,2,0
.globl _OSMboxQuery
.func 224
;>>>> INT8U OSMboxQuery (OS_EVENT *pevent, OS_MBOX_DATA *pdata)
******************************************************
* FUNCTION DEF : _OSMboxQuery
******************************************************
_OSMboxQuery:
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_MBOX) { /* Validate event block type */
MAR * ,AR2
LARK AR2,-3+LF22
MAR *0+
LAR AR3,* ,AR3
ADRK 4
LAC *
SUBK 1
BZ L57
.line 10
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 11
;>>>> return (OS_ERR_EVENT_TYPE);
LACK 1
B EPI0_22
L57:
.line 13
;>>>> pdata->OSEventGrp = pevent->OSEventGrp; /* Copy message mailbox wait list */
MAR *+,AR2
MAR *-
LAR AR4,* ,AR3
LAC * ,AR4
ADRK 3
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 *
ZALS *
SUBK 2
BGEZ L59
MAR *+
L58:
.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 *
ZALS *+
SUBK 2
BLZ L58
L59:
.line 19
;>>>> pdata->OSMsg = pevent->OSEventPtr; /* Get message from mailbox */
LARK AR2,-3+LF22
MAR *0+
LAR AR3,*-
LAR AR4,* ,AR3
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 245,000000000H,4
.file "Os_sem.c"
.sym _OSSemAccept,_OSSemAccept,46,2,0
.globl _OSSemAccept
.func 39
;>>>> INT16U OSSemAccept (OS_EVENT *pevent)
******************************************************
* FUNCTION DEF : _OSSemAccept
******************************************************
_OSSemAccept:
LF23 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,2
LAR AR0,*0+
.sym _pevent,-3+LF23,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+LF23
MAR *0+
LAR AR3,* ,AR3
ADRK 4
LAC *
SUBK 3
BZ L60
.line 8
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 9
;>>>> return (0);
LACK 0
B EPI0_23
L60:
.line 11
;>>>> cnt = pevent->OSEventCnt;
MAR *-
LAC * ,AR2
ADRK 4-LF23
SACL *
.line 12
;>>>> if (cnt > 0) { /* See if resource is available */
LAC *
BZ L61
.line 13
;>>>> pevent->OSEventCnt--; /* Yes, decrement semaphore and notify caller */
MAR * ,AR3
LAC *
SUBK 1
SACL *
L61:
.line 15
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 16
;>>>> return (cnt); /* Return semaphore count */
MAR * ,AR2
ZALS *
EPI0_23:
.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:
LF24 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,2
LAR AR0,*0+
.sym _cnt,-3+LF24,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 */
LDP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -