📄 queue.lst
字号:
\ 000074 0343 NOP
\ 000076 9253.... ADD.W #0x1, &usCriticalNesting
\ 00007A 0F49 MOV.W R9, R15
\ 00007C 9F532200 ADD.W #0x1, 0x22(R15)
\ 000080 0F49 MOV.W R9, R15
\ 000082 9F532400 ADD.W #0x1, 0x24(R15)
\ 000086 8293.... CMP.W #0x0, &usCriticalNesting
\ 00008A 0624 JEQ ??xQueueReceive_3
\ 00008C B253.... ADD.W #0xffff, &usCriticalNesting
\ 000090 8293.... CMP.W #0x0, &usCriticalNesting
\ 000094 0120 JNE ??xQueueReceive_3
\ 000096 32D2 EINT
455 }
456 taskEXIT_CRITICAL();
\ ??xQueueReceive_3:
\ 000098 8293.... CMP.W #0x0, &usCriticalNesting
\ 00009C 0624 JEQ ??xQueueReceive_1
\ 00009E B253.... ADD.W #0xffff, &usCriticalNesting
\ 0000A2 8293.... CMP.W #0x0, &usCriticalNesting
\ 0000A6 0120 JNE ??xQueueReceive_1
\ 0000A8 32D2 EINT
457 }
458 }
459
460 taskENTER_CRITICAL();
\ ??xQueueReceive_1:
\ 0000AA 32C2 DINT
\ 0000AC 0343 NOP
\ 0000AE 9253.... ADD.W #0x1, &usCriticalNesting
461 {
462 if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 )
\ 0000B2 89931C00 CMP.W #0x0, 0x1c(R9)
\ 0000B6 1A24 JEQ ??xQueueReceive_4
463 {
464 pxQueue->pcReadFrom += pxQueue->uxItemSize;
\ 0000B8 0F49 MOV.W R9, R15
\ 0000BA 9F5920000600 ADD.W 0x20(R9), 0x6(R15)
465 if( pxQueue->pcReadFrom >= pxQueue->pcTail )
\ 0000C0 999902000600 CMP.W 0x2(R9), 0x6(R9)
\ 0000C6 0228 JNC ??xQueueReceive_5
466 {
467 pxQueue->pcReadFrom = pxQueue->pcHead;
\ 0000C8 A9490600 MOV.W @R9, 0x6(R9)
468 }
469 --( pxQueue->uxMessagesWaiting );
\ ??xQueueReceive_5:
\ 0000CC 0F49 MOV.W R9, R15
\ 0000CE BF531C00 ADD.W #0xffff, 0x1c(R15)
470 memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->pcReadFrom, ( unsigned ) pxQueue->uxItemSize );
\ 0000D2 19122000 PUSH.W 0x20(R9)
\ 0000D6 1E490600 MOV.W 0x6(R9), R14
\ 0000DA 0C4A MOV.W R10, R12
\ 0000DC B012.... CALL #memcpy
471
472 /* Increment the lock count so prvUnlockQueue knows to check for
473 tasks waiting for space to become available on the queue. */
474 ++( pxQueue->xRxLock );
\ 0000E0 0F49 MOV.W R9, R15
\ 0000E2 9F532200 ADD.W #0x1, 0x22(R15)
475 xReturn = pdPASS;
\ 0000E6 1843 MOV.W #0x1, R8
\ 0000E8 2153 ADD.W #0x2, SP
\ 0000EA 013C JMP ??xQueueReceive_6
476 }
477 else
478 {
479 xReturn = pdFAIL;
\ ??xQueueReceive_4:
\ 0000EC 0843 MOV.W #0x0, R8
480 }
481 }
482 taskEXIT_CRITICAL();
\ ??xQueueReceive_6:
\ 0000EE 8293.... CMP.W #0x0, &usCriticalNesting
\ 0000F2 0624 JEQ ??xQueueReceive_7
\ 0000F4 B253.... ADD.W #0xffff, &usCriticalNesting
\ 0000F8 8293.... CMP.W #0x0, &usCriticalNesting
\ 0000FC 0120 JNE ??xQueueReceive_7
\ 0000FE 32D2 EINT
483
484 /* We no longer require exclusive access to the queue. */
485 if( prvUnlockQueue( pxQueue ) )
\ ??xQueueReceive_7:
\ 000100 0C49 MOV.W R9, R12
\ 000102 B012.... CALL #prvUnlockQueue
\ 000106 0C93 CMP.W #0x0, R12
\ 000108 0724 JEQ ??xQueueReceive_8
486 {
487 if( !xTaskResumeAll() )
\ 00010A B012.... CALL #xTaskResumeAll
\ 00010E 0C93 CMP.W #0x0, R12
\ 000110 0520 JNE ??xQueueReceive_9
488 {
489 taskYIELD();
\ 000112 B012.... CALL #vPortYield
\ 000116 023C JMP ??xQueueReceive_9
490 }
491 }
492 else
493 {
494 xTaskResumeAll();
\ ??xQueueReceive_8:
\ 000118 B012.... CALL #xTaskResumeAll
495 }
496
497 return xReturn;
\ ??xQueueReceive_9:
\ 00011C 0C48 MOV.W R8, R12
\ 00011E 3040.... BR #?Epilogue4
498 }
499 /*-----------------------------------------------------------*/
500
\ In segment CODE, align 2
501 signed portBASE_TYPE xQueueReceiveFromISR( xQueueHandle pxQueue, void *pvBuffer, signed portBASE_TYPE *pxTaskWoken )
\ xQueueReceiveFromISR:
502 {
\ 000000 0A12 PUSH.W R10
\ 000002 0B12 PUSH.W R11
\ 000004 0812 PUSH.W R8
\ 000006 0912 PUSH.W R9
\ 000008 0A4C MOV.W R12, R10
\ 00000A 0B4E MOV.W R14, R11
\ 00000C 18410A00 MOV.W 0xa(SP), R8
503 signed portBASE_TYPE xReturn;
504
505 /* We cannot block from an ISR, so check there is data available. */
506 if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 )
\ 000010 8A931C00 CMP.W #0x0, 0x1c(R10)
\ 000014 2C24 JEQ ??xQueueReceiveFromISR_0
507 {
508 /* Copy the data from the queue. */
509 pxQueue->pcReadFrom += pxQueue->uxItemSize;
\ 000016 0F4A MOV.W R10, R15
\ 000018 9F5A20000600 ADD.W 0x20(R10), 0x6(R15)
510 if( pxQueue->pcReadFrom >= pxQueue->pcTail )
\ 00001E 9A9A02000600 CMP.W 0x2(R10), 0x6(R10)
\ 000024 0228 JNC ??xQueueReceiveFromISR_1
511 {
512 pxQueue->pcReadFrom = pxQueue->pcHead;
\ 000026 AA4A0600 MOV.W @R10, 0x6(R10)
513 }
514 --( pxQueue->uxMessagesWaiting );
\ ??xQueueReceiveFromISR_1:
\ 00002A 0F4A MOV.W R10, R15
\ 00002C BF531C00 ADD.W #0xffff, 0x1c(R15)
515 memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->pcReadFrom, ( unsigned ) pxQueue->uxItemSize );
\ 000030 1A122000 PUSH.W 0x20(R10)
\ 000034 1E4A0600 MOV.W 0x6(R10), R14
\ 000038 0C4B MOV.W R11, R12
\ 00003A B012.... CALL #memcpy
516
517 /* If the queue is locked we will not modify the event list. Instead
518 we update the lock count so the task that unlocks the queue will know
519 that an ISR has removed data while the queue was locked. */
520 if( pxQueue->xRxLock == queueUNLOCKED )
\ 00003E 2153 ADD.W #0x2, SP
\ 000040 BA932200 CMP.W #0xffff, 0x22(R10)
\ 000044 0F20 JNE ??xQueueReceiveFromISR_2
521 {
522 /* We only want to wake one task per ISR, so check that a task has
523 not already been woken. */
524 if( !( *pxTaskWoken ) )
\ 000046 88930000 CMP.W #0x0, 0(R8)
\ 00004A 0F20 JNE ??xQueueReceiveFromISR_3
525 {
526 if( !listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) )
\ 00004C 8A930800 CMP.W #0x0, 0x8(R10)
\ 000050 0C24 JEQ ??xQueueReceiveFromISR_3
527 {
528 if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE )
\ 000052 0C4A MOV.W R10, R12
\ 000054 3C52 ADD.W #0x8, R12
\ 000056 B012.... CALL #xTaskRemoveFromEventList
\ 00005A 0C93 CMP.W #0x0, R12
\ 00005C 0624 JEQ ??xQueueReceiveFromISR_3
529 {
530 /* The task waiting has a higher priority than us so
531 force a context switch. */
532 *pxTaskWoken = pdTRUE;
\ 00005E 98430000 MOV.W #0x1, 0(R8)
\ 000062 033C JMP ??xQueueReceiveFromISR_3
533 }
534 }
535 }
536 }
537 else
538 {
539 /* Increment the lock count so the task that unlocks the queue
540 knows that data was removed while it was locked. */
541 ++( pxQueue->xRxLock );
\ ??xQueueReceiveFromISR_2:
\ 000064 0F4A MOV.W R10, R15
\ 000066 9F532200 ADD.W #0x1, 0x22(R15)
542 }
543
544 xReturn = pdPASS;
\ ??xQueueReceiveFromISR_3:
\ 00006A 1943 MOV.W #0x1, R9
\ 00006C 013C JMP ??xQueueReceiveFromISR_4
545 }
546 else
547 {
548 xReturn = pdFAIL;
\ ??xQueueReceiveFromISR_0:
\ 00006E 0943 MOV.W #0x0, R9
549 }
550
551 return xReturn;
\ ??xQueueReceiveFromISR_4:
\ 000070 0C49 MOV.W R9, R12
\ 000072 3040.... BR #?Epilogue4
552 }
553 /*-----------------------------------------------------------*/
554
\ In segment CODE, align 2
555 unsigned portBASE_TYPE uxQueueMessagesWaiting( xQueueHandle pxQueue )
\ uxQueueMessagesWaiting:
556 {
\ 000000 0F4C MOV.W R12, R15
557 unsigned portBASE_TYPE uxReturn;
558
559 taskENTER_CRITICAL();
\ 000002 32C2 DINT
\ 000004 0343 NOP
\ 000006 9253.... ADD.W #0x1, &usCriticalNesting
560 uxReturn = pxQueue->uxMessagesWaiting;
\ 00000A 1C4F1C00 MOV.W 0x1c(R15), R12
561 taskEXIT_CRITICAL();
\ 00000E 8293.... CMP.W #0x0, &usCriticalNesting
\ 000012 0624 JEQ ??uxQueueMessagesWaiting_0
\ 000014 B253.... ADD.W #0xffff, &usCriticalNesting
\ 000018 8293.... CMP.W #0x0, &usCriticalNesting
\ 00001C 0120 JNE ??uxQueueMessagesWaiting_0
\ 00001E 32D2 EINT
562
563 return uxReturn;
\ ??uxQueueMessagesWaiting_0:
\ 000020 3041 RET
564 }
565 /*-----------------------------------------------------------*/
566
\ In segment CODE, align 2
567 void vQueueDelete( xQueueHandle pxQueue )
\ vQueueDelete:
568 {
\ 000000 0A12 PUSH.W R10
\ 000002 0A4C MOV.W R12, R10
569 vPortFree( pxQueue->pcHead );
\ 000004 2C4A MOV.W @R10, R12
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -