📄 os_task.lst
字号:
1 .file "os_task.c"
2 .arch atmega128
3 __SREG__ = 0x3f
4 __SP_H__ = 0x3e
5 __SP_L__ = 0x3d
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
11 .text
12 .Ltext0:
132 .global OSTaskChangePrio
134 OSTaskChangePrio:
1:os/source/os_task.c **** /*
2:os/source/os_task.c **** ***************************************************************************************************
3:os/source/os_task.c **** * uC/OS-II
4:os/source/os_task.c **** * The Real-Time Kernel
5:os/source/os_task.c **** * TASK MANAGEMENT
6:os/source/os_task.c **** *
7:os/source/os_task.c **** * (c) Copyright 1992-2001, Jean J. Labrosse, Weston, FL
8:os/source/os_task.c **** * All Rights Reserved
9:os/source/os_task.c **** *
10:os/source/os_task.c **** * File : OS_TASK.C
11:os/source/os_task.c **** * By : Jean J. Labrosse
12:os/source/os_task.c **** ***************************************************************************************************
13:os/source/os_task.c **** */
14:os/source/os_task.c ****
15:os/source/os_task.c **** #ifndef OS_MASTER_FILE
16:os/source/os_task.c **** #include <include.h>
17:os/source/os_task.c **** #endif
18:os/source/os_task.c ****
19:os/source/os_task.c **** /*
20:os/source/os_task.c **** ***************************************************************************************************
21:os/source/os_task.c **** * CHANGE PRIORITY OF A TASK
22:os/source/os_task.c **** *
23:os/source/os_task.c **** * Description: This function allows you to change the priority of a task dynamically. Note that th
24:os/source/os_task.c **** * priority MUST be available.
25:os/source/os_task.c **** *
26:os/source/os_task.c **** * Arguments : oldp is the old priority
27:os/source/os_task.c **** *
28:os/source/os_task.c **** * newp is the new priority
29:os/source/os_task.c **** *
30:os/source/os_task.c **** * Returns : OS_NO_ERR is the call was successful
31:os/source/os_task.c **** * OS_PRIO_INVALID if the priority you specify is higher that the maximum allowed
32:os/source/os_task.c **** * (i.e. >= OS_LOWEST_PRIO)
33:os/source/os_task.c **** * OS_PRIO_EXIST if the new priority already exist.
34:os/source/os_task.c **** * OS_PRIO_ERR there is no task with the specified OLD priority (i.e. the OLD task
35:os/source/os_task.c **** * not exist.
36:os/source/os_task.c **** ***************************************************************************************************
37:os/source/os_task.c **** */
38:os/source/os_task.c ****
39:os/source/os_task.c **** #if OS_TASK_CHANGE_PRIO_EN > 0
40:os/source/os_task.c **** INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio)
41:os/source/os_task.c **** {
136 .LM1:
137 /* prologue: frame size=0 */
138 0000 BF92 push r11
139 0002 CF92 push r12
140 0004 DF92 push r13
141 0006 EF92 push r14
142 0008 FF92 push r15
143 000a 0F93 push r16
144 000c 1F93 push r17
145 000e CF93 push r28
146 0010 DF93 push r29
147 /* prologue end (size=9) */
148 0012 482F mov r20,r24
149 0014 F62E mov r15,r22
42:os/source/os_task.c **** #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register
43:os/source/os_task.c **** OS_CPU_SR cpu_sr;
44:os/source/os_task.c **** #endif
45:os/source/os_task.c ****
46:os/source/os_task.c **** #if OS_EVENT_EN > 0
47:os/source/os_task.c **** OS_EVENT *pevent;
48:os/source/os_task.c **** #endif
49:os/source/os_task.c ****
50:os/source/os_task.c **** OS_TCB *ptcb;
51:os/source/os_task.c **** INT8U x;
52:os/source/os_task.c **** INT8U y;
53:os/source/os_task.c **** INT8U bitx;
54:os/source/os_task.c **** INT8U bity;
55:os/source/os_task.c ****
56:os/source/os_task.c ****
57:os/source/os_task.c ****
58:os/source/os_task.c **** #if OS_ARG_CHK_EN > 0
59:os/source/os_task.c **** if ((oldprio >= OS_LOWEST_PRIO && oldprio != OS_PRIO_SELF) ||
60:os/source/os_task.c **** newprio >= OS_LOWEST_PRIO) {
61:os/source/os_task.c **** return (OS_PRIO_INVALID);
62:os/source/os_task.c **** }
63:os/source/os_task.c **** #endif
64:os/source/os_task.c **** OS_ENTER_CRITICAL();
151 .LM2:
152 /* #APP */
153 0016 F894 cli
65:os/source/os_task.c **** if (OSTCBPrioTbl[newprio] != (OS_TCB *)0) { /* New priority must not already ex
155 .LM3:
156 /* #NOAPP */
157 0018 262F mov r18,r22
158 001a 3327 clr r19
159 001c D901 movw r26,r18
160 001e A20F add r26,r18
161 0020 B31F adc r27,r19
162 0022 A050 subi r26,lo8(-(OSTCBPrioTbl))
163 0024 B040 sbci r27,hi8(-(OSTCBPrioTbl))
164 0026 6D91 ld r22,X+
165 0028 7C91 ld r23,X
166 002a 1197 sbiw r26,1
167 002c 6115 cp r22,__zero_reg__
168 002e 7105 cpc r23,__zero_reg__
169 0030 21F0 breq .L2
66:os/source/os_task.c **** OS_EXIT_CRITICAL();
171 .LM4:
172 /* #APP */
173 0032 7894 sei
67:os/source/os_task.c **** return (OS_PRIO_EXIST);
175 .LM5:
176 /* #NOAPP */
177 0034 88E2 ldi r24,lo8(40)
178 0036 90E0 ldi r25,hi8(40)
179 0038 84C0 rjmp .L1
180 .L2:
68:os/source/os_task.c **** } else {
69:os/source/os_task.c **** OSTCBPrioTbl[newprio] = (OS_TCB *)1; /* Reserve the entry to prevent oth
182 .LM6:
183 003a 81E0 ldi r24,lo8(1)
184 003c 90E0 ldi r25,hi8(1)
185 003e 1196 adiw r26,1
186 0040 9C93 st X,r25
187 0042 8E93 st -X,r24
70:os/source/os_task.c **** OS_EXIT_CRITICAL();
189 .LM7:
190 /* #APP */
191 0044 7894 sei
71:os/source/os_task.c **** y = newprio >> 3; /* Precompute to reduce INT. latenc
193 .LM8:
194 /* #NOAPP */
195 0046 BF2C mov r11,r15
196 0048 B694 lsr r11
197 004a B694 lsr r11
198 004c B694 lsr r11
72:os/source/os_task.c **** bity = OSMapTbl[y];
200 .LM9:
201 004e 0B2D mov r16,r11
202 0050 1127 clr r17
203 0052 F801 movw r30,r16
204 0054 E050 subi r30,lo8(-(OSMapTbl))
205 0056 F040 sbci r31,hi8(-(OSMapTbl))
206 0058 D080 ld r13,Z
73:os/source/os_task.c **** x = newprio & 0x07;
208 .LM10:
209 005a 87E0 ldi r24,lo8(7)
210 005c C82E mov r12,r24
211 005e CF20 and r12,r15
74:os/source/os_task.c **** bitx = OSMapTbl[x];
213 .LM11:
214 0060 EC2D mov r30,r12
215 0062 FF27 clr r31
216 0064 E050 subi r30,lo8(-(OSMapTbl))
217 0066 F040 sbci r31,hi8(-(OSMapTbl))
218 0068 E080 ld r14,Z
75:os/source/os_task.c **** OS_ENTER_CRITICAL();
220 .LM12:
221 /* #APP */
222 006a F894 cli
76:os/source/os_task.c **** if (oldprio == OS_PRIO_SELF) { /* See if changing self
224 .LM13:
225 /* #NOAPP */
226 006c 4F3F cpi r20,lo8(-1)
227 006e 29F4 brne .L4
77:os/source/os_task.c **** oldprio = OSTCBCur->OSTCBPrio; /* Yes, get priority
229 .LM14:
230 0070 E091 0000 lds r30,OSTCBCur
231 0074 F091 0000 lds r31,(OSTCBCur)+1
232 0078 418D ldd r20,Z+25
233 .L4:
78:os/source/os_task.c **** }
79:os/source/os_task.c **** if ((ptcb = OSTCBPrioTbl[oldprio]) != (OS_TCB *)0) { /* Task to change must exist
235 .LM15:
236 007a E42F mov r30,r20
237 007c FF27 clr r31
238 007e EE0F add r30,r30
239 0080 FF1F adc r31,r31
240 0082 E050 subi r30,lo8(-(OSTCBPrioTbl))
241 0084 F040 sbci r31,hi8(-(OSTCBPrioTbl))
242 0086 C081 ld r28,Z
243 0088 D181 ldd r29,Z+1
244 008a 2097 sbiw r28,0
245 008c 09F4 brne .+2
246 008e 54C0 rjmp .L5
80:os/source/os_task.c **** OSTCBPrioTbl[oldprio] = (OS_TCB *)0; /* Remove TCB from old priority
248 .LM16:
249 0090 7183 std Z+1,r23
250 0092 6083 st Z,r22
81:os/source/os_task.c **** if ((OSRdyTbl[ptcb->OSTCBY] & ptcb->OSTCBBitX) != 0x00) { /* If task is ready make it
252 .LM17:
253 0094 8B8D ldd r24,Y+27
254 0096 482F mov r20,r24
255 0098 5527 clr r21
256 009a FA01 movw r30,r20
257 009c E050 subi r30,lo8(-(OSRdyTbl))
258 009e F040 sbci r31,hi8(-(OSRdyTbl))
259 00a0 7081 ld r23,Z
260 00a2 9C8D ldd r25,Y+28
261 00a4 872F mov r24,r23
262 00a6 8923 and r24,r25
263 00a8 C9F0 breq .L6
82:os/source/os_task.c **** if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0x00) {
265 .LM18:
266 00aa 892F mov r24,r25
267 00ac 8095 com r24
268 00ae 8723 and r24,r23
269 00b0 8083 st Z,r24
270 00b2 8823 tst r24
271 00b4 39F4 brne .L7
83:os/source/os_task.c **** OSRdyGrp &= ~ptcb->OSTCBBitY;
273 .LM19:
274 00b6 9D8D ldd r25,Y+29
275 00b8 9095 com r25
276 00ba 8091 0000 lds r24,OSRdyGrp
277 00be 8923 and r24,r25
278 00c0 8093 0000 sts OSRdyGrp,r24
279 .L7:
84:os/source/os_task.c **** }
85:os/source/os_task.c **** OSRdyGrp |= bity; /* Make new priority ready to run
281 .LM20:
282 00c4 8091 0000 lds r24,OSRdyGrp
283 00c8 8D29 or r24,r13
284 00ca 8093 0000 sts OSRdyGrp,r24
86:os/source/os_task.c **** OSRdyTbl[y] |= bitx;
286 .LM21:
287 00ce F801 movw r30,r16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -