os_sem.lst
来自「atmega单片机用的ucos系统 占用内存适中 是atmega单片机合适的操作」· LST 代码 · 共 1,188 行 · 第 1/4 页
LST
1,188 行
258 0090 1F93 push r17
259 0092 CF93 push r28
260 0094 DF93 push r29
261 /* prologue end (size=5) */
262 0096 EC01 movw r28,r24
263 0098 8A01 movw r16,r20
159:OSsrc/os_sem.c **** BOOLEAN tasks_waiting;
160:OSsrc/os_sem.c **** #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status regis
161:OSsrc/os_sem.c **** OS_CPU_SR cpu_sr;
162:OSsrc/os_sem.c ****
163:OSsrc/os_sem.c ****
164:OSsrc/os_sem.c ****
165:OSsrc/os_sem.c **** cpu_sr = 0; /* Prevent compiler warning
166:OSsrc/os_sem.c **** #endif
167:OSsrc/os_sem.c **** if (OSIntNesting > 0) { /* See if called from ISR ...
265 .LM29:
266 009a 8091 0000 lds r24,OSIntNesting
267 009e 8823 tst r24
268 00a0 11F0 breq .L10
168:OSsrc/os_sem.c **** *err = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR
270 .LM30:
271 00a2 8CE8 ldi r24,lo8(-116)
272 00a4 5DC0 rjmp .L27
273 .L10:
169:OSsrc/os_sem.c **** return (pevent);
170:OSsrc/os_sem.c **** }
171:OSsrc/os_sem.c **** #if OS_ARG_CHK_EN > 0
172:OSsrc/os_sem.c **** if (pevent == (OS_EVENT *)0) { /* Validate 'pevent'
275 .LM31:
276 00a6 2097 sbiw r28,0
277 00a8 11F4 brne .L11
173:OSsrc/os_sem.c **** *err = OS_ERR_PEVENT_NULL;
279 .LM32:
280 00aa 84E0 ldi r24,lo8(4)
281 00ac 59C0 rjmp .L27
282 .L11:
174:OSsrc/os_sem.c **** return (pevent);
175:OSsrc/os_sem.c **** }
176:OSsrc/os_sem.c **** #endif
177:OSsrc/os_sem.c **** if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type
284 .LM33:
285 00ae 8881 ld r24,Y
286 00b0 8330 cpi r24,lo8(3)
287 00b2 11F0 breq .L12
178:OSsrc/os_sem.c **** *err = OS_ERR_EVENT_TYPE;
289 .LM34:
290 00b4 81E0 ldi r24,lo8(1)
291 00b6 54C0 rjmp .L27
292 .L12:
179:OSsrc/os_sem.c **** return (pevent);
180:OSsrc/os_sem.c **** }
181:OSsrc/os_sem.c **** OS_ENTER_CRITICAL();
294 .LM35:
295 /* #APP */
296 00b8 0FB6 in __tmp_reg__,__SREG__
297 00ba F894 cli
298 00bc 0F92 push __tmp_reg__
182:OSsrc/os_sem.c **** if (pevent->OSEventGrp != 0x00) { /* See if any tasks waiting on semaphore
300 .LM36:
301 /* #NOAPP */
302 00be 8981 ldd r24,Y+1
303 00c0 8823 tst r24
304 00c2 19F0 breq .L13
183:OSsrc/os_sem.c **** tasks_waiting = TRUE; /* Yes
306 .LM37:
307 00c4 91E0 ldi r25,lo8(1)
308 00c6 F92E mov r15,r25
309 00c8 01C0 rjmp .L14
310 .L13:
184:OSsrc/os_sem.c **** } else {
185:OSsrc/os_sem.c **** tasks_waiting = FALSE; /* No
312 .LM38:
313 00ca F82E mov r15,r24
314 .L14:
186:OSsrc/os_sem.c **** }
187:OSsrc/os_sem.c **** switch (opt) {
316 .LM39:
317 00cc 7727 clr r23
318 00ce 6115 cp r22,__zero_reg__
319 00d0 7105 cpc r23,__zero_reg__
320 00d2 21F0 breq .L16
321 00d4 6130 cpi r22,1
322 00d6 7105 cpc r23,__zero_reg__
323 00d8 D1F0 breq .L19
324 00da 3FC0 rjmp .L24
325 .L16:
188:OSsrc/os_sem.c **** case OS_DEL_NO_PEND: /* Delete semaphore only if no task wait
189:OSsrc/os_sem.c **** if (tasks_waiting == FALSE) {
327 .LM40:
328 00dc FF20 tst r15
329 00de 99F4 brne .L17
190:OSsrc/os_sem.c **** #if OS_EVENT_NAME_SIZE > 1
191:OSsrc/os_sem.c **** pevent->OSEventName[0] = '?'; /* Unknown name
331 .LM41:
332 00e0 8FE3 ldi r24,lo8(63)
333 00e2 8E87 std Y+14,r24
192:OSsrc/os_sem.c **** pevent->OSEventName[1] = OS_ASCII_NUL;
335 .LM42:
336 00e4 FF86 std Y+15,r15
193:OSsrc/os_sem.c **** #endif
194:OSsrc/os_sem.c **** pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
338 .LM43:
339 00e6 F882 st Y,r15
195:OSsrc/os_sem.c **** pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free li
341 .LM44:
342 00e8 8091 0000 lds r24,OSEventFreeList
343 00ec 9091 0000 lds r25,(OSEventFreeList)+1
344 00f0 8C83 std Y+4,r24
345 00f2 9D83 std Y+5,r25
196:OSsrc/os_sem.c **** pevent->OSEventCnt = 0;
347 .LM45:
348 00f4 6A83 std Y+2,r22
349 00f6 7B83 std Y+3,r23
197:OSsrc/os_sem.c **** OSEventFreeList = pevent; /* Get next free event control block
351 .LM46:
352 00f8 D093 0000 sts (OSEventFreeList)+1,r29
353 00fc C093 0000 sts OSEventFreeList,r28
198:OSsrc/os_sem.c **** OS_EXIT_CRITICAL();
355 .LM47:
356 /* #APP */
357 0100 0F90 pop __tmp_reg__
358 0102 0FBE out __SREG__,__tmp_reg__
359 /* #NOAPP */
360 0104 25C0 rjmp .L23
361 .L17:
199:OSsrc/os_sem.c **** *err = OS_NO_ERR;
200:OSsrc/os_sem.c **** return ((OS_EVENT *)0); /* Semaphore has been deleted
201:OSsrc/os_sem.c **** } else {
202:OSsrc/os_sem.c **** OS_EXIT_CRITICAL();
363 .LM48:
364 /* #APP */
365 0106 0F90 pop __tmp_reg__
366 0108 0FBE out __SREG__,__tmp_reg__
203:OSsrc/os_sem.c **** *err = OS_ERR_TASK_WAITING;
368 .LM49:
369 /* #NOAPP */
370 010a 88E0 ldi r24,lo8(8)
371 010c 29C0 rjmp .L27
372 .L19:
204:OSsrc/os_sem.c **** return (pevent);
205:OSsrc/os_sem.c **** }
206:OSsrc/os_sem.c ****
207:OSsrc/os_sem.c **** case OS_DEL_ALWAYS: /* Always delete the semaphore
208:OSsrc/os_sem.c **** while (pevent->OSEventGrp != 0x00) { /* Ready ALL tasks waiting for semaphore
209:OSsrc/os_sem.c **** (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM);
374 .LM50:
375 010e 8823 tst r24
376 0110 41F0 breq .L26
377 0112 41E0 ldi r20,lo8(1)
378 0114 60E0 ldi r22,lo8(0)
379 0116 70E0 ldi r23,hi8(0)
380 0118 CE01 movw r24,r28
381 011a 0E94 0000 call OS_EventTaskRdy
382 011e 8981 ldd r24,Y+1
383 0120 F6CF rjmp .L19
384 .L26:
210:OSsrc/os_sem.c **** }
211:OSsrc/os_sem.c **** #if OS_EVENT_NAME_SIZE > 1
212:OSsrc/os_sem.c **** pevent->OSEventName[0] = '?'; /* Unknown name
386 .LM51:
387 0122 8FE3 ldi r24,lo8(63)
388 0124 8E87 std Y+14,r24
213:OSsrc/os_sem.c **** pevent->OSEventName[1] = OS_ASCII_NUL;
390 .LM52:
391 0126 1F86 std Y+15,__zero_reg__
214:OSsrc/os_sem.c **** #endif
215:OSsrc/os_sem.c **** pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
393 .LM53:
394 0128 1882 st Y,__zero_reg__
216:OSsrc/os_sem.c **** pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free li
396 .LM54:
397 012a 8091 0000 lds r24,OSEventFreeList
398 012e 9091 0000 lds r25,(OSEventFreeList)+1
399 0132 8C83 std Y+4,r24
400 0134 9D83 std Y+5,r25
217:OSsrc/os_sem.c **** pevent->OSEventCnt = 0;
402 .LM55:
403 0136 1A82 std Y+2,__zero_reg__
404 0138 1B82 std Y+3,__zero_reg__
218:OSsrc/os_sem.c **** OSEventFreeList = pevent; /* Get next free event control block
406 .LM56:
407 013a D093 0000 sts (OSEventFreeList)+1,r29
408 013e C093 0000 sts OSEventFreeList,r28
219:OSsrc/os_sem.c **** OS_EXIT_CRITICAL();
410 .LM57:
411 /* #APP */
412 0142 0F90 pop __tmp_reg__
413 0144 0FBE out __SREG__,__tmp_reg__
220:OSsrc/os_sem.c **** if (tasks_waiting == TRUE) { /* Reschedule only if task(s) were waiti
415 .LM58:
416 /* #NOAPP */
417 0146 F1E0 ldi r31,lo8(1)
418 0148 FF16 cp r15,r31
419 014a 11F4 brne .L23
221:OSsrc/os_sem.c **** OS_Sched(); /* Find highest priority task ready to r
421 .LM59:
422 014c 0E94 0000 call OS_Sched
423 .L23:
222:OSsrc/os_sem.c **** }
223:OSsrc/os_sem.c **** *err = OS_NO_ERR;
425 .LM60:
426 0150 F801 movw r30,r16
427 0152 1082 st Z,__zero_reg__
224:OSsrc/os_sem.c **** return ((OS_EVENT *)0); /* Semaphore has been deleted
429 .LM61:
430 0154 80E0 ldi r24,lo8(0)
431 0156 90E0 ldi r25,hi8(0)
432 0158 06C0 rjmp .L9
433 .L24:
225:OSsrc/os_sem.c ****
226:OSsrc/os_sem.c **** default:
227:OSsrc/os_sem.c **** OS_EXIT_CRITICAL();
435 .LM62:
436 /* #APP */
437 015a 0F90 pop __tmp_reg__
438 015c 0FBE out __SREG__,__tmp_reg__
228:OSsrc/os_sem.c **** *err = OS_ERR_INVALID_OPT;
440 .LM63:
441 /* #NOAPP */
442 015e 87E0 ldi r24,lo8(7)
443 .L27:
444 0160 F801 movw r30,r16
445 0162 8083 st Z,r24
229:OSsrc/os_sem.c **** return (pevent);
447 .LM64:
448 0164 CE01 movw r24,r28
449 .L9:
450 /* epilogue: frame size=0 */
451 0166 DF91 pop r29
452 0168 CF91 pop r28
453 016a 1F91 pop r17
454 016c 0F91 pop r16
455 016e FF90 pop r15
456 0170 0895 ret
457 /* epilogue end (size=6) */
458 /* function OSSemDel size 126 (115) */
463 .Lscope2:
468 .global OSSemPend
470 OSSemPend:
230:OSsrc/os_sem.c **** }
231:OSsrc/os_sem.c **** }
232:OSsrc/os_sem.c **** #endif
233:OSsrc/os_sem.c ****
234:OSsrc/os_sem.c **** /*$PAGE*/
235:OSsrc/os_sem.c **** /*
236:OSsrc/os_sem.c **** ***************************************************************************************************
237:OSsrc/os_sem.c **** * PEND ON SEMAPHORE
238:OSsrc/os_sem.c **** *
239:OSsrc/os_sem.c **** * Description: This function waits for a semaphore.
240:OSsrc/os_sem.c **** *
241:OSsrc/os_sem.c **** * Arguments : pevent is a pointer to the event control block associated with the desired
242:OSsrc/os_sem.c **** * semaphore.
243:OSsrc/os_sem.c **** *
244:OSsrc/os_sem.c **** * timeout is an optional timeout period (in clock ticks). If non-zero, your tas
245:OSsrc/os_sem.c **** * wait for the resource up to the amount of time specified by this argum
246:OSsrc/os_sem.c **** * If you specify 0, however, your task will wait forever at the specifie
247:OSsrc/os_sem.c **** * semaphore or, until the resource becomes available (or the event occur
248:OSsrc/os_sem.c **** *
249:OSsrc/os_sem.c **** * err is a pointer to where an error message will be deposited. Possible er
250:OSsrc/os_sem.c **** * messages are:
251:OSsrc/os_sem.c **** *
252:OSsrc/os_sem.c **** * OS_NO_ERR The call was successful and your task owns the res
253:OSsrc/os_sem.c **** * or, the event you are waiting for occurred.
254:OSsrc/os_sem.c **** * OS_TIMEOUT The semaphore was not received within the specifie
255:OSsrc/os_sem.c **** * timeout.
256:OSsrc/os_sem.c **** * OS_ERR_EVENT_TYPE If you didn't pass a pointer to a semaphore.
257:OSsrc/os_sem.c **** * OS_ERR_PEND_ISR If you called this function from an ISR and the re
258:OSsrc/os_sem.c **** * would lead to a suspension.
259:OSsrc/os_sem.c **** * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer.
260:OSsrc/os_sem.c **** *
261:OSsrc/os_sem.c **** * Returns : none
262:OSsrc/os_sem.c **** ***************************************************************************************************
263:OSsrc/os_sem.c **** */
264:OSsrc/os_sem.c ****
265:OSsrc/os_sem.c **** void OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
266:OSsrc/os_sem.c **** {
472 .LM65:
473 /* prologue: frame size=0 */
474 0172 0F93 push r16
475 0174 1F93 push r17
476 0176 CF93 push r28
477 0178 DF93 push r29
478 /* prologue end (size=4) */
479 017a EC01 movw r28,r24
480 017c 8A01 movw r16,r20
267:OSsrc/os_sem.c **** #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register
268:OSsrc/os_sem.c **** OS_CPU_SR cpu_sr;
269:OSsrc/os_sem.c ****
270:OSsrc/os_sem.c ****
271:OSsrc/os_sem.c ****
272:OSsrc/os_sem.c **** cpu_sr = 0; /* Prevent compiler warning
273:OSsrc/os_sem.c **** #endif
274:OSsrc/os_sem.c **** if (OSIntNesting > 0) { /* See if called from ISR ...
482 .LM66:
483 017e 8091 0000 lds r24,OSIntNesting
484 0182 8823 tst r24
485 0184 11F0 breq .L29
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?