📄 os_q.lst
字号:
278:os/source/os_q.c **** }
279:os/source/os_q.c **** if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type
280:os/source/os_q.c **** return (OS_ERR_EVENT_TYPE);
281:os/source/os_q.c **** }
282:os/source/os_q.c **** #endif
283:os/source/os_q.c **** OS_ENTER_CRITICAL();
388 .LM43:
389 /* #APP */
390 00f8 F894 cli
284:os/source/os_q.c **** pq = (OS_Q *)pevent->OSEventPtr; /* Point to queue storage structure
392 .LM44:
393 /* #NOAPP */
394 00fa 0480 ldd __tmp_reg__,Z+4
395 00fc F581 ldd r31,Z+5
396 00fe E02D mov r30,__tmp_reg__
285:os/source/os_q.c **** pq->OSQIn = pq->OSQStart;
398 .LM45:
399 0100 8281 ldd r24,Z+2
400 0102 9381 ldd r25,Z+3
401 0104 9783 std Z+7,r25
402 0106 8683 std Z+6,r24
286:os/source/os_q.c **** pq->OSQOut = pq->OSQStart;
404 .LM46:
405 0108 9187 std Z+9,r25
406 010a 8087 std Z+8,r24
287:os/source/os_q.c **** pq->OSQEntries = 0;
408 .LM47:
409 010c 1586 std Z+13,__zero_reg__
410 010e 1486 std Z+12,__zero_reg__
288:os/source/os_q.c **** OS_EXIT_CRITICAL();
412 .LM48:
413 /* #APP */
414 0110 7894 sei
289:os/source/os_q.c **** return (OS_NO_ERR);
290:os/source/os_q.c **** }
416 .LM49:
417 /* #NOAPP */
418 0112 80E0 ldi r24,lo8(0)
419 0114 90E0 ldi r25,hi8(0)
420 /* epilogue: frame size=0 */
421 0116 0895 ret
422 /* epilogue end (size=1) */
423 /* function OSQFlush size 19 (18) */
428 .Lscope2:
433 .global OSQPend
435 OSQPend:
291:os/source/os_q.c **** #endif
292:os/source/os_q.c ****
293:os/source/os_q.c **** /*$PAGE*/
294:os/source/os_q.c **** /*
295:os/source/os_q.c **** ***************************************************************************************************
296:os/source/os_q.c **** * PEND ON A QUEUE FOR A MESSAGE
297:os/source/os_q.c **** *
298:os/source/os_q.c **** * Description: This function waits for a message to be sent to a queue
299:os/source/os_q.c **** *
300:os/source/os_q.c **** * Arguments : pevent is a pointer to the event control block associated with the desired qu
301:os/source/os_q.c **** *
302:os/source/os_q.c **** * timeout is an optional timeout period (in clock ticks). If non-zero, your tas
303:os/source/os_q.c **** * wait for a message to arrive at the queue up to the amount of time
304:os/source/os_q.c **** * specified by this argument. If you specify 0, however, your task will
305:os/source/os_q.c **** * forever at the specified queue or, until a message arrives.
306:os/source/os_q.c **** *
307:os/source/os_q.c **** * err is a pointer to where an error message will be deposited. Possible er
308:os/source/os_q.c **** * messages are:
309:os/source/os_q.c **** *
310:os/source/os_q.c **** * OS_NO_ERR The call was successful and your task received a
311:os/source/os_q.c **** * message.
312:os/source/os_q.c **** * OS_TIMEOUT A message was not received within the specified ti
313:os/source/os_q.c **** * OS_ERR_EVENT_TYPE You didn't pass a pointer to a queue
314:os/source/os_q.c **** * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer
315:os/source/os_q.c **** * OS_ERR_PEND_ISR If you called this function from an ISR and the re
316:os/source/os_q.c **** * would lead to a suspension.
317:os/source/os_q.c **** *
318:os/source/os_q.c **** * Returns : != (void *)0 is a pointer to the message received
319:os/source/os_q.c **** * == (void *)0 if no message was received or,
320:os/source/os_q.c **** * if 'pevent' is a NULL pointer or,
321:os/source/os_q.c **** * if you didn't pass a pointer to a queue.
322:os/source/os_q.c **** ***************************************************************************************************
323:os/source/os_q.c **** */
324:os/source/os_q.c ****
325:os/source/os_q.c **** void *OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
326:os/source/os_q.c **** {
437 .LM50:
438 /* prologue: frame size=0 */
439 0118 BF92 push r11
440 011a CF92 push r12
441 011c DF92 push r13
442 011e EF92 push r14
443 0120 FF92 push r15
444 0122 0F93 push r16
445 0124 1F93 push r17
446 0126 CF93 push r28
447 0128 DF93 push r29
448 /* prologue end (size=9) */
449 012a 7C01 movw r14,r24
450 012c 6A01 movw r12,r20
327:os/source/os_q.c **** #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register
328:os/source/os_q.c **** OS_CPU_SR cpu_sr;
329:os/source/os_q.c **** #endif
330:os/source/os_q.c **** void *msg;
331:os/source/os_q.c **** OS_Q *pq;
332:os/source/os_q.c ****
333:os/source/os_q.c ****
334:os/source/os_q.c **** if (OSIntNesting > 0) { /* See if called from ISR ...
452 .LM51:
453 012e B090 0000 lds r11,OSIntNesting
454 0132 BB20 tst r11
455 0134 31F0 breq .L14
335:os/source/os_q.c **** *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR
457 .LM52:
458 0136 82E0 ldi r24,lo8(2)
459 0138 FA01 movw r30,r20
460 013a 8083 st Z,r24
336:os/source/os_q.c **** return ((void *)0);
462 .LM53:
463 013c 80E0 ldi r24,lo8(0)
464 013e 90E0 ldi r25,hi8(0)
465 0140 52C0 rjmp .L13
466 .L14:
337:os/source/os_q.c **** }
338:os/source/os_q.c **** #if OS_ARG_CHK_EN > 0
339:os/source/os_q.c **** if (pevent == (OS_EVENT *)0) { /* Validate 'pevent'
340:os/source/os_q.c **** *err = OS_ERR_PEVENT_NULL;
341:os/source/os_q.c **** return ((void *)0);
342:os/source/os_q.c **** }
343:os/source/os_q.c **** if (pevent->OSEventType != OS_EVENT_TYPE_Q) {/* Validate event block type
344:os/source/os_q.c **** *err = OS_ERR_EVENT_TYPE;
345:os/source/os_q.c **** return ((void *)0);
346:os/source/os_q.c **** }
347:os/source/os_q.c **** #endif
348:os/source/os_q.c **** OS_ENTER_CRITICAL();
468 .LM54:
469 /* #APP */
470 0142 F894 cli
349:os/source/os_q.c **** pq = (OS_Q *)pevent->OSEventPtr; /* Point at queue control block
472 .LM55:
473 /* #NOAPP */
474 0144 FC01 movw r30,r24
475 0146 A481 ldd r26,Z+4
476 0148 B581 ldd r27,Z+5
350:os/source/os_q.c **** if (pq->OSQEntries != 0) { /* See if any messages in the queue
478 .LM56:
479 014a FD01 movw r30,r26
480 014c C485 ldd r28,Z+12
481 014e D585 ldd r29,Z+13
482 0150 2097 sbiw r28,0
483 0152 B9F0 breq .L15
351:os/source/os_q.c **** msg = *pq->OSQOut++; /* Yes, extract oldest message from the queue
485 .LM57:
486 0154 2085 ldd r18,Z+8
487 0156 3185 ldd r19,Z+9
488 0158 F901 movw r30,r18
489 015a 8191 ld r24,Z+
490 015c 9191 ld r25,Z+
491 015e 9F01 movw r18,r30
492 0160 FD01 movw r30,r26
493 0162 3187 std Z+9,r19
494 0164 2087 std Z+8,r18
495 0166 8C01 movw r16,r24
352:os/source/os_q.c **** pq->OSQEntries--; /* Update the number of entries in the queue
497 .LM58:
498 0168 2197 sbiw r28,1
499 016a D587 std Z+13,r29
500 016c C487 std Z+12,r28
353:os/source/os_q.c **** if (pq->OSQOut == pq->OSQEnd) { /* Wrap OUT pointer if we are at the end of the qu
502 .LM59:
503 016e 8481 ldd r24,Z+4
504 0170 9581 ldd r25,Z+5
505 0172 2817 cp r18,r24
506 0174 3907 cpc r19,r25
507 0176 59F5 brne .L19
354:os/source/os_q.c **** pq->OSQOut = pq->OSQStart;
509 .LM60:
510 0178 8281 ldd r24,Z+2
511 017a 9381 ldd r25,Z+3
512 017c 9187 std Z+9,r25
513 017e 8087 std Z+8,r24
514 0180 26C0 rjmp .L19
515 .L15:
355:os/source/os_q.c **** }
356:os/source/os_q.c **** OS_EXIT_CRITICAL();
357:os/source/os_q.c **** *err = OS_NO_ERR;
358:os/source/os_q.c **** return (msg); /* Return message received
359:os/source/os_q.c **** }
360:os/source/os_q.c **** OSTCBCur->OSTCBStat |= OS_STAT_Q; /* Task will have to pend for a message to be post
517 .LM61:
518 0182 E091 0000 lds r30,OSTCBCur
519 0186 F091 0000 lds r31,(OSTCBCur)+1
520 018a 808D ldd r24,Z+24
521 018c 8460 ori r24,lo8(4)
522 018e 808F std Z+24,r24
361:os/source/os_q.c **** OSTCBCur->OSTCBDly = timeout; /* Load timeout into TCB
524 .LM62:
525 0190 E091 0000 lds r30,OSTCBCur
526 0194 F091 0000 lds r31,(OSTCBCur)+1
527 0198 778B std Z+23,r23
528 019a 668B std Z+22,r22
362:os/source/os_q.c **** OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs
530 .LM63:
531 019c C701 movw r24,r14
532 019e 0E94 0000 call OS_EventTaskWait
363:os/source/os_q.c **** OS_EXIT_CRITICAL();
534 .LM64:
535 /* #APP */
536 01a2 7894 sei
364:os/source/os_q.c **** OS_Sched(); /* Find next highest priority task ready to run
538 .LM65:
539 /* #NOAPP */
540 01a4 0E94 0000 call OS_Sched
365:os/source/os_q.c **** OS_ENTER_CRITICAL();
542 .LM66:
543 /* #APP */
544 01a8 F894 cli
366:os/source/os_q.c **** msg = OSTCBCur->OSTCBMsg;
546 .LM67:
547 /* #NOAPP */
548 01aa E091 0000 lds r30,OSTCBCur
549 01ae F091 0000 lds r31,(OSTCBCur)+1
550 01b2 0489 ldd r16,Z+20
551 01b4 1589 ldd r17,Z+21
367:os/source/os_q.c **** if (msg != (void *)0) { /* Did we get a message?
553 .LM68:
554 01b6 0115 cp r16,__zero_reg__
555 01b8 1105 cpc r17,__zero_reg__
556 01ba 69F0 breq .L17
368:os/source/os_q.c **** OSTCBCur->OSTCBMsg = (void *)0; /* Extract message from TCB (Put there by QPost)
558 .LM69:
559 01bc D58B std Z+21,r29
560 01be C48B std Z+20,r28
369:os/source/os_q.c **** OSTCBCur->OSTCBStat = OS_STAT_RDY;
562 .LM70:
563 01c0 B08E std Z+24,r11
370:os/source/os_q.c **** OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* No longer waiting for event
565 .LM71:
566 01c2 E091 0000 lds r30,OSTCBCur
567 01c6 F091 0000 lds r31,(OSTCBCur)+1
568 01ca D38B std Z+19,r29
569 01cc C28B std Z+18,r28
570 .L19:
371:os/source/os_q.c **** OS_EXIT_CRITICAL();
572 .LM72:
573 /* #APP */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -