📄 os_core.s
字号:
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * MAKE TASK READY TO RUN BASED ON EVENT OCCURING
; *
; * Description: This function is called by other uC/OS-II services and is used to ready a task that was
; * waiting for an event to occur.
; *
; * Arguments : pevent is a pointer to the event control block corresponding to the event.
; *
; * msg is a pointer to a message. This pointer is used by message oriented services
; * such as MAILBOXEs and QUEUEs. The pointer is not used when called by other
; * service functions.
; *
; * msk is a mask that is used to clear the status byte of the TCB. For example,
; * OSSemPost() will pass OS_STAT_SEM, OSMboxPost() will pass OS_STAT_MBOX etc.
; *
; * Returns : none
; *
; * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
; *********************************************************************************************************
; */
; #if OS_EVENT_EN > 0
; INT8U OS_EventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk)
; {
.dbline 586
; OS_TCB *ptcb;
; INT8U x;
; INT8U y;
; INT8U bitx;
; INT8U bity;
; INT8U prio;
;
;
; y = OSUnMapTbl[pevent->OSEventGrp]; /* Find highest prio. task waiting for message */
ldi R24,<_OSUnMapTbl
ldi R25,>_OSUnMapTbl
movw R30,R16
ldd R30,z+1
clr R31
add R30,R24
adc R31,R25
lpm R10,Z
.dbline 587
; bity = OSMapTbl[y];
ldi R24,<_OSMapTbl
ldi R25,>_OSMapTbl
mov R30,R10
clr R31
add R30,R24
adc R31,R25
lpm R12,Z
.dbline 588
; x = OSUnMapTbl[pevent->OSEventTbl[y]];
movw R24,R16
adiw R24,6
mov R30,R10
clr R31
add R30,R24
adc R31,R25
ldd R30,z+0
clr R31
ldi R24,<_OSUnMapTbl
ldi R25,>_OSUnMapTbl
add R30,R24
adc R31,R25
lpm R20,Z
.dbline 589
; bitx = OSMapTbl[x];
ldi R24,<_OSMapTbl
ldi R25,>_OSMapTbl
mov R30,R20
clr R31
add R30,R24
adc R31,R25
lpm R22,Z
.dbline 590
; prio = (INT8U)((y << 3) + x); /* Find priority of task getting the msg */
mov R2,R20
clr R3
mov R20,R10
clr R21
lsl R20
rol R21
lsl R20
rol R21
lsl R20
rol R21
add R20,R2
adc R21,R3
.dbline 591
; if ((pevent->OSEventTbl[y] &= ~bitx) == 0x00) { /* Remove this task from the waiting list */
movw R24,R16
adiw R24,6
mov R2,R10
clr R3
add R2,R24
adc R3,R25
mov R4,R22
com R4
movw R30,R2
ldd R5,z+0
and R5,R4
mov R4,R5
std z+0,R4
tst R5
brne L48
.dbline 591
.dbline 592
; pevent->OSEventGrp &= ~bity; /* Clr group bit if this was only task pending */
movw R24,R16
adiw R24,1
mov R4,R12
com R4
movw R30,R24
ldd R5,z+0
and R5,R4
std z+0,R5
.dbline 593
; }
L48:
.dbline 594
; ptcb = OSTCBPrioTbl[prio]; /* Point to this task's OS_TCB */
ldi R24,2
mul R24,R20
movw R30,R0
ldi R24,<_OSTCBPrioTbl
ldi R25,>_OSTCBPrioTbl
add R30,R24
adc R31,R25
ldd R14,z+0
ldd R15,z+1
.dbline 595
; ptcb->OSTCBDly = 0; /* Prevent OSTimeTick() from readying task */
clr R2
clr R3
movw R30,R14
std z+9,R3
std z+8,R2
.dbline 596
; ptcb->OSTCBEventPtr = (OS_EVENT *)0; /* Unlink ECB from this task */
movw R30,R14
std z+7,R3
std z+6,R2
.dbline 600
; #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
; ptcb->OSTCBMsg = msg; /* Send message directly to waiting task */
; #else
; msg = msg; /* Prevent compiler warning if not used */
.dbline 602
; #endif
; ptcb->OSTCBStat &= ~msk; /* Clear bit associated with event type */
movw R24,R14
adiw R24,10
ldd R4,y+10
com R4
movw R30,R24
ldd R5,z+0
and R5,R4
std z+0,R5
.dbline 603
; if (ptcb->OSTCBStat == OS_STAT_RDY) { /* See if task is ready (could be susp'd) */
movw R30,R14
ldd R2,z+10
tst R2
brne L50
.dbline 603
.dbline 604
; OSRdyGrp |= bity; /* Put task in the ready to run list */
lds R2,_OSRdyGrp
or R2,R12
sts _OSRdyGrp,R2
.dbline 605
; OSRdyTbl[y] |= bitx;
ldi R24,<_OSRdyTbl
ldi R25,>_OSRdyTbl
mov R2,R10
clr R3
add R2,R24
adc R3,R25
movw R30,R2
ldd R4,z+0
or R4,R22
std z+0,R4
.dbline 606
; }
L50:
.dbline 607
; return (prio);
mov R16,R20
.dbline -2
L47:
rcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r bity 12 c
.dbsym r bitx 22 c
.dbsym r prio 20 c
.dbsym r x 20 c
.dbsym r ptcb 14 pS[os_tcb]
.dbsym r y 10 c
.dbsym l msk 10 c
.dbsym r msg 18 pV
.dbsym r pevent 16 pS[.1]
.dbend
.dbfunc e OS_EventTaskWait _OS_EventTaskWait fV
; pevent -> R16,R17
.even
_OS_EventTaskWait::
.dbline -1
.dbline 627
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * MAKE TASK WAIT FOR EVENT TO OCCUR
; *
; * Description: This function is called by other uC/OS-II services to suspend a task because an event has
; * not occurred.
; *
; * Arguments : pevent is a pointer to the event control block for which the task will be waiting for.
; *
; * Returns : none
; *
; * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
; *********************************************************************************************************
; */
; #if OS_EVENT_EN > 0
; void OS_EventTaskWait (OS_EVENT *pevent)
; {
.dbline 628
; OSTCBCur->OSTCBEventPtr = pevent; /* Store pointer to event control block in TCB */
lds R30,_OSTCBCur
lds R31,_OSTCBCur+1
std z+7,R17
std z+6,R16
.dbline 629
; if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0x00) { /* Task no longer ready */
ldi R24,<_OSRdyTbl
ldi R25,>_OSRdyTbl
ldd R2,z+13
clr R3
add R2,R24
adc R3,R25
lds R30,_OSTCBCur
lds R31,_OSTCBCur+1
ldd R4,z+14
com R4
movw R30,R2
ldd R5,z+0
and R5,R4
mov R4,R5
std z+0,R4
tst R5
brne L53
.dbline 629
.dbline 630
; OSRdyGrp &= ~OSTCBCur->OSTCBBitY; /* Clear event grp bit if this was only task pending */
lds R30,_OSTCBCur
lds R31,_OSTCBCur+1
ldd R2,z+15
com R2
lds R3,_OSRdyGrp
and R3,R2
sts _OSRdyGrp,R3
.dbline 631
; }
L53:
.dbline 632
; pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX; /* Put task in waiting list */
movw R24,R16
adiw R24,6
lds R30,_OSTCBCur
lds R31,_OSTCBCur+1
ldd R2,z+13
clr R3
add R2,R24
adc R3,R25
lds R30,_OSTCBCur
lds R31,_OSTCBCur+1
ldd R4,z+14
movw R30,R2
ldd R5,z+0
or R5,R4
std z+0,R5
.dbline 633
; pevent->OSEventGrp |= OSTCBCur->OSTCBBitY;
movw R24,R16
adiw R24,1
lds R30,_OSTCBCur
lds R31,_OSTCBCur+1
ldd R4,z+15
movw R30,R24
ldd R5,z+0
or R5,R4
std z+0,R5
.dbline -2
L52:
.dbline 0 ; func end
ret
.dbsym r pevent 16 pS[.1]
.dbend
.dbfunc e OS_EventTO _OS_EventTO fV
; pevent -> R16,R17
.even
_OS_EventTO::
.dbline -1
.dbline 653
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * MAKE TASK READY TO RUN BASED ON EVENT TIMEOUT
; *
; * Description: This function is called by other uC/OS-II services to make a task ready to run because a
; * timeout occurred.
; *
; * Arguments : pevent is a pointer to the event control block which is readying a task.
; *
; * Returns : none
; *
; * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
; *********************************************************************************************************
; */
; #if OS_EVENT_EN > 0
; void OS_EventTO (OS_EVENT *pevent)
; {
.dbline 654
; if ((pevent->OSEventTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0x00) {
movw R24,R16
adiw R24,6
lds R30,_OSTCBCur
lds R31,_OSTCBCur+1
ldd R2,z+13
clr R3
add R2,R24
adc R3,R25
lds R30,_OSTCBCur
lds R31,_OSTCBCur+1
ldd R4,z+14
com R4
movw R30,R2
ldd R5,z+0
and R5,R4
mov R4,R5
std z+0,R4
tst R5
brne L56
.dbline 654
.dbline 655
; pevent->OSEventGrp &= ~OSTCBCur->OSTCBBitY;
movw R24,R16
adiw R24,1
lds R30,_OSTCBCur
lds R31,_OSTCBCur+1
ldd R4,z+15
com R4
movw R30,R24
ldd R5,z+0
and R5,R4
std z+0,R5
.dbline 656
; }
L56:
.dbline 657
; OSTCBCur->OSTCBStat = OS_STAT_RDY; /* Set status to ready */
clr R2
lds R30,_OSTCBCur
lds R31,_OSTCBCur+1
std z+10,R2
.dbline 658
; OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* No longer waiting for event */
clr R3
lds R30,_OSTCBCur
lds R31,_OSTCBCur+1
std z+7,R3
std z+6,R2
.dbline -2
L55:
.dbline 0 ; func end
ret
.dbsym r pevent 16 pS[.1]
.dbend
.dbfunc e OS_EventWaitListInit _OS_EventWaitListInit fV
; ptbl -> R20,R21
; pevent -> R16,R17
.even
_OS_EventWaitListInit::
rcall push_gset1
.dbline -1
.dbline 677
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * INITIALIZE EVENT CONTROL BLOCK'S WAIT LIST
; *
; * Description: This function is called by other uC/OS-II services to initialize the event wait list.
; *
; * Arguments : pevent is a pointer to the event control block allocated to the event.
; *
; * Returns : none
; *
; * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
; *********************************************************************************************************
; */
; #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0) || (OS_SEM_EN > 0) || (OS_MUTEX_EN > 0)
; void OS_EventWaitListInit (OS_EVENT *pevent)
; {
.dbline 681
; INT8U *ptbl;
;
;
; pevent->OSEventGrp = 0x00; /* No task waiting on event */
clr R2
movw R30,R16
std z+1,R2
.dbline 682
; ptbl = &pevent->OSEventTbl[0];
movw R20,R16
subi R20,250 ; offset = 6
sbci R21,255
.dbline 685
;
; #if OS_EVENT_TBL_SIZE > 0
; *ptbl++ = 0x00;
movw R30,R20
st Z+,R2
.dbline 689
; #endif
;
; #if OS_EVENT_TBL_SIZE > 1
; *ptbl++ = 0x00;
st Z+,R2
.dbline 693
; #endif
;
; #if OS_EVENT_TBL_SIZE > 2
; *ptbl++ = 0x00;
st Z+,R2
movw R20,R30
.dbline -2
L58:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r ptbl 20 pc
.dbsym r pevent 16 pS[.1]
.dbend
.dbfunc e OS_Sched _OS_Sched fV
; y -> R12
; cpu_sr -> R10
.even
_OS_Sched::
rcall push_gset4
.dbline -1
.dbline 736
; #endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -