📄 os_task.s
字号:
.module OS_TASK.c
.area text(rom, con, rel)
.dbfile F:\AVRPRA~1\ucosii-port2-mega8\OS_TASK.c
.dbfunc e OSTaskChangePrio _OSTaskChangePrio fc
.dbstruct 0 9 .1
.dbfield 0 OSEventType c
.dbfield 1 OSEventGrp c
.dbfield 2 OSEventCnt i
.dbfield 4 OSEventPtr pV
.dbfield 6 OSEventTbl A[3:3]c
.dbend
.dbstruct 0 16 os_tcb
.dbfield 0 OSTCBStkPtr pc
.dbfield 2 OSTCBNext pS[os_tcb]
.dbfield 4 OSTCBPrev pS[os_tcb]
.dbfield 6 OSTCBEventPtr pS[.1]
.dbfield 8 OSTCBDly i
.dbfield 10 OSTCBStat c
.dbfield 11 OSTCBPrio c
.dbfield 12 OSTCBX c
.dbfield 13 OSTCBY c
.dbfield 14 OSTCBBitX c
.dbfield 15 OSTCBBitY c
.dbend
; pevent -> R20,R21
; bity -> R14
; bitx -> R10
; x -> R22
; y -> y+1
; cpu_sr -> y+0
; ptcb -> R12,R13
; newprio -> y+12
; oldprio -> R20
.even
_OSTaskChangePrio::
st -y,r19
st -y,r18
rcall push_gset5
mov R20,R16
sbiw R28,2
.dbline -1
.dbline 43
; /*
; *********************************************************************************************************
; * uC/OS-II
; * The Real-Time Kernel
; * TASK MANAGEMENT
; *
; * (c) Copyright 1992-2001, Jean J. Labrosse, Weston, FL
; * All Rights Reserved
; *
; * File : OS_TASK.C
; * By : Jean J. Labrosse
; *********************************************************************************************************
; */
;
; #include <string.h>
;
; #ifndef OS_MASTER_FILE
; #include "includes.h"
; #endif
;
; /*
; *********************************************************************************************************
; * CHANGE PRIORITY OF A TASK
; *
; * Description: This function allows you to change the priority of a task dynamically. Note that the new
; * priority MUST be available.
; *
; * Arguments : oldp is the old priority
; *
; * newp is the new priority
; *
; * Returns : OS_NO_ERR is the call was successful
; * OS_PRIO_INVALID if the priority you specify is higher that the maximum allowed
; * (i.e. >= OS_LOWEST_PRIO)
; * OS_PRIO_EXIST if the new priority already exist.
; * OS_PRIO_ERR there is no task with the specified OLD priority (i.e. the OLD task does
; * not exist.
; *********************************************************************************************************
; */
;
; #if OS_TASK_CHANGE_PRIO_EN > 0
; INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio)
; {
.dbline 66
; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
; OS_CPU_SR cpu_sr;
; #endif
;
; #if OS_EVENT_EN > 0
; OS_EVENT *pevent;
; #endif
;
; OS_TCB *ptcb;
; INT8U x;
; INT8U y;
; INT8U bitx;
; INT8U bity;
;
;
;
; #if OS_ARG_CHK_EN > 0
; if ((oldprio >= OS_LOWEST_PRIO && oldprio != OS_PRIO_SELF) ||
; newprio >= OS_LOWEST_PRIO) {
; return (OS_PRIO_INVALID);
; }
; #endif
; OS_ENTER_CRITICAL();
rcall _OS_CPU_SR_Save
std y+0,R16
.dbline 67
; if (OSTCBPrioTbl[newprio] != (OS_TCB *)0) { /* New priority must not already exist */
ldi R24,2
ldd R0,y+12
mul R24,R0
movw R30,R0
ldi R24,<_OSTCBPrioTbl
ldi R25,>_OSTCBPrioTbl
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
tst R2
brne X0
tst R3
breq L4
X0:
.dbline 67
.dbline 68
; OS_EXIT_CRITICAL();
ldd R16,y+0
rcall _OS_CPU_SR_Restore
.dbline 69
; return (OS_PRIO_EXIST);
ldi R16,40
rjmp L3
L4:
.dbline 70
; } else {
.dbline 71
; OSTCBPrioTbl[newprio] = (OS_TCB *)1; /* Reserve the entry to prevent others */
ldi R24,2
ldd R0,y+12
mul R24,R0
movw R30,R0
ldi R24,<_OSTCBPrioTbl
ldi R25,>_OSTCBPrioTbl
add R30,R24
adc R31,R25
ldi R24,1
ldi R25,0
std z+1,R25
std z+0,R24
.dbline 72
; OS_EXIT_CRITICAL();
ldd R16,y+0
rcall _OS_CPU_SR_Restore
.dbline 73
; y = newprio >> 3; /* Precompute to reduce INT. latency */
ldd R2,y+12
lsr R2
lsr R2
lsr R2
std y+1,R2
.dbline 74
; bity = OSMapTbl[y];
ldi R24,<_OSMapTbl
ldi R25,>_OSMapTbl
mov R30,R2
clr R31
add R30,R24
adc R31,R25
lpm R14,Z
.dbline 75
; x = newprio & 0x07;
ldd R22,y+12
andi R22,7
.dbline 76
; bitx = OSMapTbl[x];
mov R30,R22
clr R31
add R30,R24
adc R31,R25
lpm R10,Z
.dbline 77
; OS_ENTER_CRITICAL();
rcall _OS_CPU_SR_Save
std y+0,R16
.dbline 78
; if (oldprio == OS_PRIO_SELF) { /* See if changing self */
cpi R20,255
brne L6
.dbline 78
.dbline 79
; oldprio = OSTCBCur->OSTCBPrio; /* Yes, get priority */
lds R30,_OSTCBCur
lds R31,_OSTCBCur+1
ldd R20,z+11
.dbline 80
; }
L6:
.dbline 81
; if ((ptcb = OSTCBPrioTbl[oldprio]) != (OS_TCB *)0) { /* Task to change must exist */
ldi R24,2
mul R24,R20
movw R30,R0
ldi R24,<_OSTCBPrioTbl
ldi R25,>_OSTCBPrioTbl
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
movw R12,R2
tst R12
brne X1
tst R13
brne X3
rjmp L8
X3:
X1:
.dbline 81
.dbline 82
; OSTCBPrioTbl[oldprio] = (OS_TCB *)0; /* Remove TCB from old priority */
ldi R24,2
mul R24,R20
movw R30,R0
ldi R24,<_OSTCBPrioTbl
ldi R25,>_OSTCBPrioTbl
add R30,R24
adc R31,R25
clr R2
clr R3
std z+1,R3
std z+0,R2
.dbline 83
; if ((OSRdyTbl[ptcb->OSTCBY] & ptcb->OSTCBBitX) != 0x00) { /* If task is ready make it not */
ldi R24,<_OSRdyTbl
ldi R25,>_OSRdyTbl
movw R30,R12
ldd R30,z+13
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
movw R30,R12
ldd R3,z+14
and R2,R3
brne X4
rjmp L10
X4:
.dbline 83
.dbline 84
; if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0x00) {
movw R30,R12
ldd R2,z+13
clr R3
add R2,R24
adc R3,R25
movw R30,R12
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 L12
.dbline 84
.dbline 85
; OSRdyGrp &= ~ptcb->OSTCBBitY;
movw R30,R12
ldd R2,z+15
com R2
lds R3,_OSRdyGrp
and R3,R2
sts _OSRdyGrp,R3
.dbline 86
; }
L12:
.dbline 87
; OSRdyGrp |= bity; /* Make new priority ready to run */
lds R2,_OSRdyGrp
or R2,R14
sts _OSRdyGrp,R2
.dbline 88
; OSRdyTbl[y] |= bitx;
ldi R24,<_OSRdyTbl
ldi R25,>_OSRdyTbl
ldd R2,y+1
clr R3
add R2,R24
adc R3,R25
movw R30,R2
ldd R4,z+0
or R4,R10
std z+0,R4
.dbline 90
rjmp L11
L10:
.dbline 90
; #if OS_EVENT_EN > 0
; } else {
.dbline 91
; if ((pevent = ptcb->OSTCBEventPtr) != (OS_EVENT *)0) { /* Remove from event wait list */
movw R30,R12
ldd R2,z+6
ldd R3,z+7
movw R20,R2
cpi R20,0
cpc R20,R21
brne X5
rjmp L14
X5:
X2:
.dbline 91
.dbline 92
; if ((pevent->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
movw R24,R20
adiw R24,6
movw R30,R12
ldd R2,z+13
clr R3
add R2,R24
adc R3,R25
movw R30,R12
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 L16
.dbline 92
.dbline 93
; pevent->OSEventGrp &= ~ptcb->OSTCBBitY;
movw R24,R20
adiw R24,1
movw R30,R12
ldd R4,z+15
com R4
movw R30,R24
ldd R5,z+0
and R5,R4
std z+0,R5
.dbline 94
; }
L16:
.dbline 95
; pevent->OSEventGrp |= bity; /* Add new priority to wait list */
movw R24,R20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -