📄 ucos_ii.asm
字号:
BBZ L39
.line 37
;>>>> OS_EventTO(pevent);
MAR * ,AR2
LARK AR2,-3+LF20
MAR *0+
LAC * ,AR1
SACL *+
CALL _OS_EventTO
MAR *-
.line 38
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 39
;>>>> *err = OS_TIMEOUT; /* Indicate that didn't get event within TO */
MAR * ,AR2
LARK AR2,-5+LF20
MAR *0+
LAR AR3,* ,AR3
LACK 10
SACL *
.line 40
;>>>> return;
B EPI0_20
L39:
.line 42
;>>>> OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
LACK 0
SBRK 2
SACL *
.line 43
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 44
;>>>> *err = OS_NO_ERR;
MAR * ,AR2
LARK AR2,-5+LF20
MAR *0+
LAR AR4,* ,AR4
SACL *
EPI0_20:
.line 45
MAR * ,AR1
SBRK 2
LAR AR0,*-
PSHD *
RET
.endfunc 288,000000000H,1
.sym _OSSemPost,_OSSemPost,46,2,0
.globl _OSSemPost
.func 308
;>>>> INT8U OSSemPost (OS_EVENT *pevent)
******************************************************
* FUNCTION DEF : _OSSemPost
******************************************************
_OSSemPost:
LF21 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,3
LAR AR0,*0+,AR2
.sym _pevent,-3+LF21,24,9,16,.fake0
.line 2
;>>>> #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;>>>> OS_CPU_SR cpu_sr;
;>>>> #endif
;>>>> #if OS_ARG_CHK_EN > 0
.line 9
;>>>> if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
LARK AR2,-3+LF21
MAR *0+
LAC *
BNZ L40
.line 10
;>>>> return (OS_ERR_PEVENT_NULL);
LACK 4
B EPI0_21
L40:
.line 12
;>>>> if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
LAR AR3,* ,AR3
LAC *
SUBK 3
BZ L41
.line 13
;>>>> return (OS_ERR_EVENT_TYPE);
;>>>> #endif
LACK 1
B EPI0_21
L41:
.line 16
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.line 17
;>>>> if (pevent->OSEventGrp != 0x00) { /* See if any task waiting for semaphore */
MAR *+
LAC *
BZ L42
.line 18
;>>>> OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM); /* Ready highest prio task waiting on event */
MAR *-,AR1
LACK 1
SACL *+
LACK 0
SACL *+,AR1
SAR AR3,*+
CALL _OS_EventTaskRdy
SBRK 3
.line 19
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 20
;>>>> OS_Sched(); /* Find highest priority task ready to run */
CALL _OS_Sched
.line 21
;>>>> return (OS_NO_ERR);
LACK 0
B EPI0_21
L42:
.line 23
;>>>> if (pevent->OSEventCnt < 65535) { /* Make sure semaphore will not overflow */
MAR *+
ZALS *
BNV $+2
MAR * ,AR2
ADRK 4-LF21
SACL *+
SACH *-
LT *+
MPYK 1
LPH *
RSXM
LACK 65535
SPAC
BNV $+6
BGZ L43
B $+4
BLEZ L43
.line 24
;>>>> pevent->OSEventCnt++; /* Increment semaphore count to register event */
MAR * ,AR3
LAC *
ADDK 1
SACL *
.line 25
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 26
;>>>> return (OS_NO_ERR);
LACK 0
B EPI0_21
L43:
.line 28
;>>>> OS_EXIT_CRITICAL(); /* Semaphore value has reached its maximum */
CLRC INTM
.line 29
;>>>> return (OS_SEM_OVF);
LACK 50
EPI0_21:
.line 30
MAR * ,AR1
SBRK 4
LAR AR0,*-
PSHD *
RET
.endfunc 337,000000000H,3
.file "os_task.c"
.sym _OSTaskCreate,_OSTaskCreate,46,2,0
.globl _OSTaskCreate
.func 158
;>>>> INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio)
******************************************************
* FUNCTION DEF : _OSTaskCreate
******************************************************
_OSTaskCreate:
LF22 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,3
LAR AR0,*0+,AR2
.sym _task,-3+LF22,144,9,16
.sym _pdata,-4+LF22,16,9,16
.sym _ptos,-5+LF22,30,9,16
.sym _prio,-6+LF22,14,9,16
.sym _psp,1,30,1,16
.sym _err,2,14,1,16
.line 2
;>>>> #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;>>>> OS_CPU_SR cpu_sr;
;>>>> #endif
;>>>> OS_STK *psp;
;>>>> INT8U err;
;>>>> #if OS_ARG_CHK_EN > 0
.line 11
;>>>> if (prio > OS_LOWEST_PRIO) { /* Make sure priority is within allowable range */
LARK AR2,-6+LF22
MAR *0+
ZALS *
SUBK 12
BLEZ L44
.line 12
;>>>> return (OS_PRIO_INVALID);
;>>>> #endif
LACK 42
B EPI0_22
L44:
.line 15
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.line 16
;>>>> if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority */
ADLK _OSTCBPrioTbl+12,0
MAR * ,AR0
SACL *
LAR AR3,* ,AR3
LAC *
BNZ L45
.line 17
;>>>> 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 19
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 20
;>>>> psp = (OS_STK *)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 21
;>>>> err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0);
LACK 0
SACL *+
SACL *+
SACL *+
SACH *+
SACL *+
SACL *+,AR2
LAC * ,AR1
SACL *+,AR2
SBRK 7-LF22
LAC * ,AR1
SACL *+
CALL _OS_TCBInit
SBRK 8
MAR * ,AR2
LARK AR2,2
MAR *0+
SACL *
.line 22
;>>>> if (err == OS_NO_ERR) {
LAC *
BNZ L46
.line 23
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.line 24
;>>>> OSTaskCtr++; /* Increment the #tasks counter */
LDPK _OSTaskCtr
LAC _OSTaskCtr
ADDK 1
SACL _OSTaskCtr
.line 25
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 26
;>>>> if (OSRunning == TRUE) { /* Find highest priority task if multitasking has started */
LAC _OSRunning
SUBK 1
BNZ L48
.line 27
;>>>> OS_Sched();
;>>>> } else {
CALL _OS_Sched,AR1
B L48
L46:
.line 30
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.line 31
;>>>> OSTCBPrioTbl[prio] = (OS_TCB *)0;/* Make this priority available to others */
SBRK 8-LF22
LAC * ,AR0
ADLK _OSTCBPrioTbl+0,0
SACL *
LAR AR3,* ,AR3
LACK 0
SACL *
.line 32
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
L48:
.line 34
;>>>> return (err);
MAR * ,AR2
LARK AR2,2
MAR *0+
ZALS *
B EPI0_22
L45:
.line 36
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 37
;>>>> return (OS_PRIO_EXIST);
LACK 40
EPI0_22:
.line 38
MAR * ,AR1
SBRK 4
LAR AR0,*-
PSHD *
RET
.endfunc 195,000000000H,3
.file "os_time.c"
.sym _OSTimeDly,_OSTimeDly,32,2,0
.globl _OSTimeDly
.func 35
;>>>> void OSTimeDly (INT16U ticks)
******************************************************
* FUNCTION DEF : _OSTimeDly
******************************************************
_OSTimeDly:
LF23 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,1
LAR AR0,*0+,AR2
.sym _ticks,-3+LF23,14,9,16
.line 2
;>>>> #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;>>>> OS_CPU_SR cpu_sr;
;>>>> #endif
.line 8
;>>>> if (ticks > 0) { /* 0 means no delay! */
LARK AR2,-3+LF23
MAR *0+
LAC *
BZ L49
.line 9
;>>>> OS_ENTER_CRITICAL();
SETC INTM
.line 10
;>>>> if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) { /* Delay current task */
LDPK _OSTCBCur
LAR AR3,_OSTCBCur
MAR * ,AR3
ADRK 9
ZALS *-,AR1
CMPL
SACL * ,AR3
LAC * ,AR0
ADLK _OSRdyTbl+0,0
SACL *
LAR AR4,* ,AR1
ZALS * ,AR4
AND *
SACL *
BNZ L50
.line 11
;>>>> OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
MAR * ,AR3
ADRK 2
LAC *
CMPL
AND _OSRdyGrp
SACL _OSRdyGrp
L50:
.line 13
;>>>> OSTCBCur->OSTCBDly = ticks; /* Load ticks in TCB */
LAR AR3,_OSTCBCur
MAR * ,AR2
LAC * ,AR3
ADRK 4
SACL *
.line 14
;>>>> OS_EXIT_CRITICAL();
CLRC INTM
.line 15
;>>>> OS_Sched(); /* Find next task to run! */
CALL _OS_Sched,AR1
L49:
EPI0_23:
.line 17
MAR * ,AR1
SBRK 2
LAR AR0,*-
PSHD *
RET
.endfunc 51,000000000H,1
.sym _OSTimeDlyHMSM,_OSTimeDlyHMSM,46,2,0
.globl _OSTimeDlyHMSM
.func 79
;>>>> INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli)
******************************************************
* FUNCTION DEF : _OSTimeDlyHMSM
******************************************************
_OSTimeDlyHMSM:
LF24 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,10
LAR AR0,*0+,AR2
.sym _hours,-3+LF24,14,9,16
.sym _minutes,-4+LF24,14,9,16
.sym _seconds,-5+LF24,14,9,16
.sym _milli,-6+LF24,14,9,16
.sym _ticks,1,15,1,32
.sym _loops,3,14,1,16
.line 2
;>>>> INT32U ticks;
;>>>> INT16U loops;
.line 7
;>>>> if (hours > 0 || minutes > 0 || seconds > 0 || milli > 0) {
LARK AR2,-3+LF24
MAR *0+
LAC *
BNZ LL26
MAR *-
LAC *
BNZ LL26
MAR *-
LAC *
BNZ LL26
MAR *-
LAC *
BZ L51
LL26:
.line 8
;>>>> if (minutes > 59) {
LARK AR2,-4+LF24
MAR *0+
ZALS *
SUBK 59
BLEZ L52
.line 9
;>>>> return (OS_TIME_INVALID_MINUTES); /* Validate arguments to be within range */
LACK 81
B EPI0_24
L52:
.line 11
;>>>> if (seconds > 59) {
MAR *-
ZALS *
SUBK 59
BLEZ L53
.line 12
;>>>> return (OS_TIME_INVALID_SECONDS);
LACK 82
B EPI0_24
L53:
.line 14
;>>>> if (milli > 999) {
MAR *-
ZALS *
SUBK 999
BLEZ L54
.line 15
;>>>> return (OS_TIME_INVALID_MILLI);
LACK 83
B EPI0_24
L54:
.line 19
;>>>> ticks = ((INT32U)hours * 3600L + (INT32U)minutes * 60L + (INT32U)seconds) * OS_TICKS_PER_SEC
;>>>> + OS_TICKS_PER_SEC * ((INT32U)milli + 500L / OS_TICKS_PER_SEC) / 1000L;
ADRK 2
ZALS * ,AR1
SACL *+
SACH *+
SACL *+
LACK 60
MAR *-
CALL L$$MPY
MAR * ,AR2
ADRK 8-LF24
SACL *+
SACH *
SBRK 8-LF24
ZALS * ,AR1
SACL *+
SACH *+
SACL *+
LACK 3600
MAR *-
CALL L$$MPY
MAR * ,AR2
ADRK 7-LF24
ADDS *+
ADDH *
SBRK 10-LF24
ADDS * ,AR1
SACL *+
SACH *+
SACL *+
LACK 100
MAR *-
CALL L$$MPY
MAR * ,AR2
ADRK 11-LF24
SACL *+
SACH *
LACK 5
SBRK 13-LF24
ADDS * ,AR1
SACL *+
SACH *+
SACL *+
LACK 100
MAR *-
CALL L$$MPY
MAR * ,AR2
ADRK 14-LF24
SACL *+
SACH *-,AR1
LACK 1000
SACL *+
SACH *+,AR2
ZALS *+
ADDH * ,AR1
CALL L$$DIVU
MAR * ,AR2
SBRK 3
ADDS *+
ADDH *
SBRK 6
SACL *+
SACH *
.line 21
;>>>> loops = (INT16U)(ticks / 65536L); /* Compute the integral number of 65536 tick delays */
ZALS *+
SACL *
.line 22
;>>>> ticks = ticks % 65536L; /* Obtain the fractional number of ticks */
SBRK 2
ZALS *
ANDK 65535
SACL *+
ZAC
SACL *-
.line 23
;>>>> OSTimeDly((INT16U)ticks);
LAC * ,AR1
SACL *+
CALL _OSTimeDly
MAR *-,AR2
.line 24
;>>>> while (loops > 0) {
LA
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -