📄 os_task.lis
字号:
.module OS_TASK.c
.area text(rom, con, rel)
0000 .dbfile F:\AVRPRA~1\ucosii-port2-mega8\OS_TASK.c
0000 .dbfunc e OSTaskChangePrio _OSTaskChangePrio fc
0000 .dbstruct 0 9 .1
0000 .dbfield 0 OSEventType c
0000 .dbfield 1 OSEventGrp c
0000 .dbfield 2 OSEventCnt i
0000 .dbfield 4 OSEventPtr pV
0000 .dbfield 6 OSEventTbl A[3:3]c
0000 .dbend
0000 .dbstruct 0 16 os_tcb
0000 .dbfield 0 OSTCBStkPtr pc
0000 .dbfield 2 OSTCBNext pS[os_tcb]
0000 .dbfield 4 OSTCBPrev pS[os_tcb]
0000 .dbfield 6 OSTCBEventPtr pS[.1]
0000 .dbfield 8 OSTCBDly i
0000 .dbfield 10 OSTCBStat c
0000 .dbfield 11 OSTCBPrio c
0000 .dbfield 12 OSTCBX c
0000 .dbfield 13 OSTCBY c
0000 .dbfield 14 OSTCBBitX c
0000 .dbfield 15 OSTCBBitY c
0000 .dbend
0000 ; pevent -> R20,R21
0000 ; bity -> R14
0000 ; bitx -> R10
0000 ; x -> R22
0000 ; y -> y+1
0000 ; cpu_sr -> y+0
0000 ; ptcb -> R12,R13
0000 ; newprio -> y+12
0000 ; oldprio -> R20
.even
0000 _OSTaskChangePrio::
0000 3A93 st -y,r19
0002 2A93 st -y,r18
0004 00D0 rcall push_gset5
0006 402F mov R20,R16
0008 2297 sbiw R28,2
000A .dbline -1
000A .dbline 43
000A ; /*
000A ; *********************************************************************************************************
000A ; * uC/OS-II
000A ; * The Real-Time Kernel
000A ; * TASK MANAGEMENT
000A ; *
000A ; * (c) Copyright 1992-2001, Jean J. Labrosse, Weston, FL
000A ; * All Rights Reserved
000A ; *
000A ; * File : OS_TASK.C
000A ; * By : Jean J. Labrosse
000A ; *********************************************************************************************************
000A ; */
000A ;
000A ; #include <string.h>
000A ;
000A ; #ifndef OS_MASTER_FILE
000A ; #include "includes.h"
000A ; #endif
000A ;
000A ; /*
000A ; *********************************************************************************************************
000A ; * CHANGE PRIORITY OF A TASK
000A ; *
000A ; * Description: This function allows you to change the priority of a task dynamically. Note that the new
000A ; * priority MUST be available.
000A ; *
000A ; * Arguments : oldp is the old priority
000A ; *
000A ; * newp is the new priority
000A ; *
000A ; * Returns : OS_NO_ERR is the call was successful
000A ; * OS_PRIO_INVALID if the priority you specify is higher that the maximum allowed
000A ; * (i.e. >= OS_LOWEST_PRIO)
000A ; * OS_PRIO_EXIST if the new priority already exist.
000A ; * OS_PRIO_ERR there is no task with the specified OLD priority (i.e. the OLD task does
000A ; * not exist.
000A ; *********************************************************************************************************
000A ; */
000A ;
000A ; #if OS_TASK_CHANGE_PRIO_EN > 0
000A ; INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio)
000A ; {
000A .dbline 66
000A ; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
000A ; OS_CPU_SR cpu_sr;
000A ; #endif
000A ;
000A ; #if OS_EVENT_EN > 0
000A ; OS_EVENT *pevent;
000A ; #endif
000A ;
000A ; OS_TCB *ptcb;
000A ; INT8U x;
000A ; INT8U y;
000A ; INT8U bitx;
000A ; INT8U bity;
000A ;
000A ;
000A ;
000A ; #if OS_ARG_CHK_EN > 0
000A ; if ((oldprio >= OS_LOWEST_PRIO && oldprio != OS_PRIO_SELF) ||
000A ; newprio >= OS_LOWEST_PRIO) {
000A ; return (OS_PRIO_INVALID);
000A ; }
000A ; #endif
000A ; OS_ENTER_CRITICAL();
000A 00D0 rcall _OS_CPU_SR_Save
000C 0883 std y+0,R16
000E .dbline 67
000E ; if (OSTCBPrioTbl[newprio] != (OS_TCB *)0) { /* New priority must not already exist */
000E 82E0 ldi R24,2
0010 0C84 ldd R0,y+12
0012 809D mul R24,R0
0014 F001 movw R30,R0
0016 80E0 ldi R24,<_OSTCBPrioTbl
0018 90E0 ldi R25,>_OSTCBPrioTbl
001A E80F add R30,R24
001C F91F adc R31,R25
001E 2080 ldd R2,z+0
0020 3180 ldd R3,z+1
0022 2220 tst R2
0024 11F4 brne X0
0026 3320 tst R3
0028 21F0 breq L4
002A X0:
002A .dbline 67
002A .dbline 68
002A ; OS_EXIT_CRITICAL();
002A 0881 ldd R16,y+0
002C 00D0 rcall _OS_CPU_SR_Restore
002E .dbline 69
002E ; return (OS_PRIO_EXIST);
002E 08E2 ldi R16,40
0030 D4C0 rjmp L3
0032 L4:
0032 .dbline 70
0032 ; } else {
0032 .dbline 71
0032 ; OSTCBPrioTbl[newprio] = (OS_TCB *)1; /* Reserve the entry to prevent others */
0032 82E0 ldi R24,2
0034 0C84 ldd R0,y+12
0036 809D mul R24,R0
0038 F001 movw R30,R0
003A 80E0 ldi R24,<_OSTCBPrioTbl
003C 90E0 ldi R25,>_OSTCBPrioTbl
003E E80F add R30,R24
0040 F91F adc R31,R25
0042 81E0 ldi R24,1
0044 90E0 ldi R25,0
0046 9183 std z+1,R25
0048 8083 std z+0,R24
004A .dbline 72
004A ; OS_EXIT_CRITICAL();
004A 0881 ldd R16,y+0
004C 00D0 rcall _OS_CPU_SR_Restore
004E .dbline 73
004E ; y = newprio >> 3; /* Precompute to reduce INT. latency */
004E 2C84 ldd R2,y+12
0050 2694 lsr R2
0052 2694 lsr R2
0054 2694 lsr R2
0056 2982 std y+1,R2
0058 .dbline 74
0058 ; bity = OSMapTbl[y];
0058 80E0 ldi R24,<_OSMapTbl
005A 90E0 ldi R25,>_OSMapTbl
005C E22D mov R30,R2
005E FF27 clr R31
0060 E80F add R30,R24
0062 F91F adc R31,R25
0064 E490 lpm R14,Z
0066 .dbline 75
0066 ; x = newprio & 0x07;
0066 6C85 ldd R22,y+12
0068 6770 andi R22,7
006A .dbline 76
006A ; bitx = OSMapTbl[x];
006A E62F mov R30,R22
006C FF27 clr R31
006E E80F add R30,R24
0070 F91F adc R31,R25
0072 A490 lpm R10,Z
0074 .dbline 77
0074 ; OS_ENTER_CRITICAL();
0074 00D0 rcall _OS_CPU_SR_Save
0076 0883 std y+0,R16
0078 .dbline 78
0078 ; if (oldprio == OS_PRIO_SELF) { /* See if changing self */
0078 4F3F cpi R20,255
007A 29F4 brne L6
007C .dbline 78
007C .dbline 79
007C ; oldprio = OSTCBCur->OSTCBPrio; /* Yes, get priority */
007C E0910000 lds R30,_OSTCBCur
0080 F0910100 lds R31,_OSTCBCur+1
0084 4385 ldd R20,z+11
0086 .dbline 80
0086 ; }
0086 L6:
0086 .dbline 81
0086 ; if ((ptcb = OSTCBPrioTbl[oldprio]) != (OS_TCB *)0) { /* Task to change must exist */
0086 82E0 ldi R24,2
0088 849F mul R24,R20
008A F001 movw R30,R0
008C 80E0 ldi R24,<_OSTCBPrioTbl
008E 90E0 ldi R25,>_OSTCBPrioTbl
0090 E80F add R30,R24
0092 F91F adc R31,R25
0094 2080 ldd R2,z+0
0096 3180 ldd R3,z+1
0098 6101 movw R12,R2
009A CC20 tst R12
009C 19F4 brne X1
009E DD20 tst R13
00A0 09F4 brne X3
00A2 8CC0 rjmp L8
00A4 X3:
00A4 X1:
00A4 .dbline 81
00A4 .dbline 82
00A4 ; OSTCBPrioTbl[oldprio] = (OS_TCB *)0; /* Remove TCB from old priority */
00A4 82E0 ldi R24,2
00A6 849F mul R24,R20
00A8 F001 movw R30,R0
00AA 80E0 ldi R24,<_OSTCBPrioTbl
00AC 90E0 ldi R25,>_OSTCBPrioTbl
00AE E80F add R30,R24
00B0 F91F adc R31,R25
00B2 2224 clr R2
00B4 3324 clr R3
00B6 3182 std z+1,R3
00B8 2082 std z+0,R2
00BA .dbline 83
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -