📄 tasks.lst
字号:
638 vListRemove( ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) );
\ 00000036 .... LDR R4,??DataTable24 ;; pxCurrentTCB
\ 00000038 2068 LDR R0,[R4, #+0]
\ 0000003A 1030 ADD R0,#+0x10
\ 0000003C ........ _BLF vListRemove,vListRemove??rT
639
640 /* The list item will be inserted in wake time order. */
641 listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xGenericListItem ), xTimeToWake );
\ 00000040 2068 LDR R0,[R4, #+0]
\ 00000042 0661 STR R6,[R0, #+0x10]
642
643 if( xTimeToWake < xTickCount )
\ 00000044 3868 LDR R0,[R7, #+0]
\ 00000046 8642 CMP R6,R0
\ 00000048 2168 LDR R1,[R4, #+0]
\ 0000004A 02D2 BCS ??vTaskDelayUntil_4
644 {
645 /* Wake time has overflowed. Place this item in the
646 overflow list. */
647 vListInsert( ( xList * ) pxOverflowDelayedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) );
\ 0000004C 1031 ADD R1,#+0x10
\ 0000004E .... LDR R0,??DataTable16 ;; ??pxOverflowDelayedTaskList
\ 00000050 01E0 B ??vTaskDelayUntil_5
648 }
649 else
650 {
651 /* The wake time has not overflowed, so we can use the
652 current block list. */
653 vListInsert( ( xList * ) pxDelayedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) );
\ ??vTaskDelayUntil_4:
\ 00000052 1031 ADD R1,#+0x10
\ 00000054 .... LDR R0,??DataTable17 ;; ??pxDelayedTaskList
\ ??vTaskDelayUntil_5:
\ 00000056 0068 LDR R0,[R0, #+0]
\ 00000058 ........ _BLF vListInsert,vListInsert??rT
654 }
655 }
656 }
657 xAlreadyYielded = xTaskResumeAll();
658
659 /* Force a reschedule if xTaskResumeAll has not already done so, we may
660 have put ourselves to sleep. */
661 if( !xAlreadyYielded )
\ ??vTaskDelayUntil_3:
\ 0000005C ........ BL xTaskResumeAll
\ 00000060 0028 CMP R0,#+0
\ 00000062 00D1 BNE ??vTaskDelayUntil_6
662 {
663 taskYIELD();
\ 00000064 00DF SWI 0
664 }
665 }
\ ??vTaskDelayUntil_6:
\ 00000066 F0BC POP {R4-R7}
\ 00000068 01BC POP {R0}
\ 0000006A 0047 BX R0 ;; return
666 #endif
667 /*-----------------------------------------------------------*/
668
669 #if ( INCLUDE_vTaskDelay == 1 )
\ In segment CODE, align 4, keep-with-next
670 void vTaskDelay( portTickType xTicksToDelay )
671 {
\ vTaskDelay:
\ 00000000 70B5 PUSH {R4-R6,LR}
\ 00000002 051C MOV R5,R0
672 portTickType xTimeToWake;
673 signed portBASE_TYPE xAlreadyYielded = pdFALSE;
674
675 /* A delay time of zero just forces a reschedule. */
676 if( xTicksToDelay > ( portTickType ) 0 )
\ 00000004 1BD0 BEQ ??vTaskDelay_0
677 {
678 vTaskSuspendAll();
\ 00000006 ........ BL vTaskSuspendAll
679 {
680 /* A task that is removed from the event list while the
681 scheduler is suspended will not get placed in the ready
682 list or removed from the blocked list until the scheduler
683 is resumed.
684
685 This task cannot be in an event list as it is the currently
686 executing task. */
687
688 /* Calculate the time to wake - this may overflow but this is
689 not a problem. */
690 xTimeToWake = xTickCount + xTicksToDelay;
\ 0000000A .... LDR R4,??DataTable33 ;; ??xTickCount
\ 0000000C 2068 LDR R0,[R4, #+0]
\ 0000000E 4619 ADD R6,R0,R5
691
692 /* We must remove ourselves from the ready list before adding
693 ourselves to the blocked list as the same list item is used for
694 both lists. */
695 vListRemove( ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) );
\ 00000010 .... LDR R5,??DataTable24 ;; pxCurrentTCB
\ 00000012 2868 LDR R0,[R5, #+0]
\ 00000014 1030 ADD R0,#+0x10
\ 00000016 ........ _BLF vListRemove,vListRemove??rT
696
697 /* The list item will be inserted in wake time order. */
698 listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xGenericListItem ), xTimeToWake );
\ 0000001A 2868 LDR R0,[R5, #+0]
\ 0000001C 0661 STR R6,[R0, #+0x10]
699
700 if( xTimeToWake < xTickCount )
\ 0000001E 2068 LDR R0,[R4, #+0]
\ 00000020 8642 CMP R6,R0
\ 00000022 2968 LDR R1,[R5, #+0]
\ 00000024 02D2 BCS ??vTaskDelay_1
701 {
702 /* Wake time has overflowed. Place this item in the
703 overflow list. */
704 vListInsert( ( xList * ) pxOverflowDelayedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) );
\ 00000026 1031 ADD R1,#+0x10
\ 00000028 .... LDR R0,??DataTable16 ;; ??pxOverflowDelayedTaskList
\ 0000002A 01E0 B ??vTaskDelay_2
705 }
706 else
707 {
708 /* The wake time has not overflowed, so we can use the
709 current block list. */
710 vListInsert( ( xList * ) pxDelayedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) );
\ ??vTaskDelay_1:
\ 0000002C 1031 ADD R1,#+0x10
\ 0000002E .... LDR R0,??DataTable17 ;; ??pxDelayedTaskList
\ ??vTaskDelay_2:
\ 00000030 0068 LDR R0,[R0, #+0]
\ 00000032 ........ _BLF vListInsert,vListInsert??rT
711 }
712 }
713 xAlreadyYielded = xTaskResumeAll();
714 }
715
716 /* Force a reschedule if xTaskResumeAll has not already done so, we may
717 have put ourselves to sleep. */
718 if( !xAlreadyYielded )
\ 00000036 ........ BL xTaskResumeAll
\ 0000003A 0028 CMP R0,#+0
\ 0000003C 00D1 BNE ??vTaskDelay_3
719 {
720 taskYIELD();
\ ??vTaskDelay_0:
\ 0000003E 00DF SWI 0
721 }
722 }
\ ??vTaskDelay_3:
\ 00000040 70BC POP {R4-R6}
\ 00000042 01BC POP {R0}
\ 00000044 0047 BX R0 ;; return
723 #endif
724 /*-----------------------------------------------------------*/
725
726 #if ( INCLUDE_uxTaskPriorityGet == 1 )
727
\ In segment CODE, align 4, keep-with-next
728 unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask )
729 {
\ uxTaskPriorityGet:
\ 00000000 10B5 PUSH {R4,LR}
\ 00000002 041C MOV R4,R0
730 tskTCB *pxTCB;
731 unsigned portBASE_TYPE uxReturn;
732
733 taskENTER_CRITICAL();
\ 00000004 ........ _BLF vPortEnterCritical,vPortEnterCritical??rT
734 {
735 /* If null is passed in here then we are changing the
736 priority of the calling function. */
737 pxTCB = prvGetTCBFromHandle( pxTask );
\ 00000008 002C CMP R4,#+0
\ 0000000A 01D1 BNE ??uxTaskPriorityGet_0
\ 0000000C .... LDR R0,??DataTable24 ;; pxCurrentTCB
\ 0000000E 0468 LDR R4,[R0, #+0]
738 uxReturn = pxTCB->uxPriority;
\ ??uxTaskPriorityGet_0:
\ 00000010 E468 LDR R4,[R4, #+0xC]
739 }
740 taskEXIT_CRITICAL();
\ 00000012 ........ _BLF vPortExitCritical,vPortExitCritical??rT
741
742 return uxReturn;
\ 00000016 201C MOV R0,R4
\ 00000018 10BC POP {R4}
\ 0000001A 02BC POP {R1}
\ 0000001C 0847 BX R1 ;; return
743 }
744
745 #endif
746 /*-----------------------------------------------------------*/
747
748 #if ( INCLUDE_vTaskPrioritySet == 1 )
749
\ In segment CODE, align 4, keep-with-next
750 void vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority )
751 {
\ vTaskPrioritySet:
\ 00000000 30B5 PUSH {R4,R5,LR}
\ 00000002 041C MOV R4,R0
\ 00000004 0D1C MOV R5,R1
752 tskTCB *pxTCB;
753 unsigned portBASE_TYPE uxCurrentPriority;
754
755 /* Ensure the new priority is valid. */
756 if( uxNewPriority >= configMAX_PRIORITIES )
\ 00000006 0529 CMP R1,#+0x5
\ 00000008 00D3 BCC ??vTaskPrioritySet_0
757 {
758 uxNewPriority = configMAX_PRIORITIES - 1;
\ 0000000A 0425 MOV R5,#+0x4
759 }
760
761 taskENTER_CRITICAL();
\ ??vTaskPrioritySet_0:
\ 0000000C ........ _BLF vPortEnterCritical,vPortEnterCritical??rT
762 {
763 /* If null is passed in here then we are changing the
764 priority of the calling function. */
765 pxTCB = prvGetTCBFromHandle( pxTask );
\ 00000010 002C CMP R4,#+0
\ 00000012 01D1 BNE ??vTaskPrioritySet_1
\ 00000014 .... LDR R0,??DataTable24 ;; pxCurrentTCB
\ 00000016 0468 LDR R4,[R0, #+0]
766 uxCurrentPriority = pxTCB->uxPriority;
\ ??vTaskPrioritySet_1:
\ 00000018 E068 LDR R0,[R4, #+0xC]
767
768 if( uxCurrentPriority != uxNewPriority )
\ 0000001A A842 CMP R0,R5
\ 0000001C 20D0 BEQ ??vTaskPrioritySet_2
769 {
770 pxTCB
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -