📄 tasks.lst
字号:
\ 000000C0 ........ _BLF vListInitialise,vListInitialise??rT
\ 000000C4 2548 LDR R0,??xTaskCreate_7 ;; ??xDelayedTaskList1
\ 000000C6 ........ _BLF vListInitialise,vListInitialise??rT
\ 000000CA 2548 LDR R0,??xTaskCreate_7+0x4 ;; ??xDelayedTaskList2
\ 000000CC ........ _BLF vListInitialise,vListInitialise??rT
\ 000000D0 .... LDR R0,??DataTable30 ;; ??xPendingReadyList
\ 000000D2 ........ _BLF vListInitialise,vListInitialise??rT
\ 000000D6 .... LDR R0,??DataTable25 ;; ??xSuspendedTaskList
\ 000000D8 ........ _BLF vListInitialise,vListInitialise??rT
\ 000000DC .... LDR R0,??DataTable17 ;; ??pxDelayedTaskList
\ 000000DE 1F49 LDR R1,??xTaskCreate_7 ;; ??xDelayedTaskList1
\ 000000E0 0160 STR R1,[R0, #+0]
\ 000000E2 .... LDR R0,??DataTable16 ;; ??pxOverflowDelayedTaskList
\ 000000E4 1E49 LDR R1,??xTaskCreate_7+0x4 ;; ??xDelayedTaskList2
\ 000000E6 0160 STR R1,[R0, #+0]
\ 000000E8 09E0 B ??xTaskCreate_8
\ ??xTaskCreate_6:
\ 000000EA .... LDR R0,??DataTable9 ;; ??xSchedulerRunning
\ 000000EC 0068 LDR R0,[R0, #+0]
\ 000000EE 0028 CMP R0,#+0
\ 000000F0 05D1 BNE ??xTaskCreate_8
\ 000000F2 0898 LDR R0,[SP, #+0x20]
\ 000000F4 3168 LDR R1,[R6, #+0]
\ 000000F6 C968 LDR R1,[R1, #+0xC]
\ 000000F8 8842 CMP R0,R1
\ 000000FA 00D3 BCC ??xTaskCreate_8
\ 000000FC 3560 STR R5,[R6, #+0]
\ ??xTaskCreate_8:
\ 000000FE E868 LDR R0,[R5, #+0xC]
\ 00000100 1849 LDR R1,??xTaskCreate_7+0x8 ;; ??uxTopUsedPriority
\ 00000102 0A68 LDR R2,[R1, #+0]
\ 00000104 8242 CMP R2,R0
\ 00000106 00D2 BCS ??xTaskCreate_9
\ 00000108 0860 STR R0,[R1, #+0]
\ ??xTaskCreate_9:
\ 0000010A 1748 LDR R0,??xTaskCreate_7+0xC ;; ??uxTaskNumber
\ 0000010C 0168 LDR R1,[R0, #+0]
\ 0000010E A960 STR R1,[R5, #+0x8]
\ 00000110 491C ADD R1,R1,#+0x1
\ 00000112 0160 STR R1,[R0, #+0]
\ 00000114 0020 MOV R0,#+0
\ 00000116 2861 STR R0,[R5, #+0x10]
\ 00000118 E868 LDR R0,[R5, #+0xC]
\ 0000011A .... LDR R1,??DataTable28 ;; ??uxTopReadyPriority
\ 0000011C 0A68 LDR R2,[R1, #+0]
\ 0000011E 8242 CMP R2,R0
\ 00000120 00D2 BCS ??xTaskCreate_10
\ 00000122 0860 STR R0,[R1, #+0]
\ ??xTaskCreate_10:
\ 00000124 291C MOV R1,R5
\ 00000126 1031 ADD R1,#+0x10
\ 00000128 E868 LDR R0,[R5, #+0xC]
\ 0000012A 4001 LSL R0,R0,#+0x5
\ 0000012C 3818 ADD R0,R7,R0
\ 0000012E ........ _BLF vListInsertEnd,vListInsertEnd??rT
\ 00000132 0127 MOV R7,#+0x1
\ 00000134 ........ _BLF vPortExitCritical,vPortExitCritical??rT
520
521 if( xReturn == pdPASS )
522 {
523 if( ( void * ) pxCreatedTask != NULL )
\ 00000138 002C CMP R4,#+0
\ 0000013A 00D0 BEQ ??xTaskCreate_11
524 {
525 /* Pass the TCB out - in an anonymous way. The calling function/
526 task can use this as a handle to delete the task later if
527 required.*/
528 *pxCreatedTask = ( xTaskHandle ) pxNewTCB;
\ 0000013C 2560 STR R5,[R4, #+0]
529 }
530
531 if( xSchedulerRunning != pdFALSE )
\ ??xTaskCreate_11:
\ 0000013E .... LDR R0,??DataTable9 ;; ??xSchedulerRunning
\ 00000140 0068 LDR R0,[R0, #+0]
\ 00000142 0028 CMP R0,#+0
\ 00000144 05D0 BEQ ??xTaskCreate_2
532 {
533 /* If the created task is of a higher priority than the current task
534 then it should run now. */
535 if( pxCurrentTCB->uxPriority < uxPriority )
\ 00000146 3068 LDR R0,[R6, #+0]
\ 00000148 C068 LDR R0,[R0, #+0xC]
\ 0000014A 0899 LDR R1,[SP, #+0x20]
\ 0000014C 8842 CMP R0,R1
\ 0000014E 00D2 BCS ??xTaskCreate_2
536 {
537 taskYIELD();
\ 00000150 00DF SWI 0
538 }
539 }
540 }
541
542 return xReturn;
\ ??xTaskCreate_2:
\ 00000152 381C MOV R0,R7
\ 00000154 03B0 ADD SP,#+0xC
\ 00000156 F0BC POP {R4-R7}
\ 00000158 02BC POP {R1}
\ 0000015A 0847 BX R1 ;; return
\ ??xTaskCreate_7:
\ 0000015C ........ DC32 ??xDelayedTaskList1
\ 00000160 ........ DC32 ??xDelayedTaskList2
\ 00000164 ........ DC32 ??uxTopUsedPriority
\ 00000168 ........ DC32 ??uxTaskNumber
543 }
\ In segment DATA_Z, align 4, align-sorted
\ ??uxTaskNumber:
\ 00000000 DS8 4
544 /*-----------------------------------------------------------*/
545
546 #if ( INCLUDE_vTaskDelete == 1 )
547
548 void vTaskDelete( xTaskHandle pxTaskToDelete )
549 {
550 tskTCB *pxTCB;
551
552 taskENTER_CRITICAL();
553 {
554 /* If null is passed in here then we are deleting ourselves. */
555 pxTCB = prvGetTCBFromHandle( pxTaskToDelete );
556
557 /* Remove task from the ready list and place in the termination list.
558 This will stop the task from be scheduled. The idle task will check
559 the termination list and free up any memory allocated by the
560 scheduler for the TCB and stack. */
561 vListRemove( &( pxTCB->xGenericListItem ) );
562
563 /* Is the task waiting on an event also? */
564 if( pxTCB->xEventListItem.pvContainer )
565 {
566 vListRemove( &( pxTCB->xEventListItem ) );
567 }
568
569 vListInsertEnd( ( xList * ) &xTasksWaitingTermination, &( pxTCB->xGenericListItem ) );
570
571 /* Increment the ucTasksDeleted variable so the idle task knows
572 there is a task that has been deleted and that it should therefore
573 check the xTasksWaitingTermination list. */
574 ++uxTasksDeleted;
575 }
576 taskEXIT_CRITICAL();
577
578 /* Force a reschedule if we have just deleted the current task. */
579 if( ( void * ) pxTaskToDelete == NULL )
580 {
581 taskYIELD();
582 }
583 }
584
585 #endif
586
587
588
589
590
591
592 /*-----------------------------------------------------------
593 * TASK CONTROL API documented in task.h
594 *----------------------------------------------------------*/
595
596 #if ( INCLUDE_vTaskDelayUntil == 1 )
\ In segment CODE, align 4, keep-with-next
597 void vTaskDelayUntil( portTickType *pxPreviousWakeTime, portTickType xTimeIncrement )
598 {
\ vTaskDelayUntil:
\ 00000000 F0B5 PUSH {R4-R7,LR}
\ 00000002 041C MOV R4,R0
\ 00000004 0E1C MOV R6,R1
599 portTickType xTimeToWake;
600 portBASE_TYPE xAlreadyYielded, xShouldDelay = pdFALSE;
\ 00000006 0025 MOV R5,#+0
601
602 vTaskSuspendAll();
\ 00000008 ........ BL vTaskSuspendAll
603 {
604 /* Generate the tick time at which the task wants to wake. */
605 xTimeToWake = *pxPreviousWakeTime + xTimeIncrement;
\ 0000000C 2168 LDR R1,[R4, #+0]
\ 0000000E 8E19 ADD R6,R1,R6
606
607 if( xTickCount < *pxPreviousWakeTime )
\ 00000010 .... LDR R7,??DataTable33 ;; ??xTickCount
\ 00000012 3A68 LDR R2,[R7, #+0]
\ 00000014 8A42 CMP R2,R1
\ 00000016 05D2 BCS ??vTaskDelayUntil_0
608 {
609 /* The tick count has overflowed since this function was
610 lasted called. In this case the only time we should ever
611 actually delay is if the wake time has also overflowed,
612 and the wake time is greater than the tick time. When this
613 is the case it is as if neither time had overflowed. */
614 if( ( xTimeToWake < *pxPreviousWakeTime ) && ( xTimeToWake > xTickCount ) )
\ 00000018 8E42 CMP R6,R1
\ 0000001A 09D2 BCS ??vTaskDelayUntil_1
\ 0000001C 3968 LDR R1,[R7, #+0]
\ 0000001E B142 CMP R1,R6
\ 00000020 06D2 BCS ??vTaskDelayUntil_1
615 {
616 xShouldDelay = pdTRUE;
\ 00000022 04E0 B ??vTaskDelayUntil_2
617 }
618 }
619 else
620 {
621 /* The tick time has not overflowed. In this case we will
622 delay if either the wake time has overflowed, and/or the
623 tick time is less than the wake time. */
624 if( ( xTimeToWake < *pxPreviousWakeTime ) || ( xTimeToWake > xTickCount ) )
\ ??vTaskDelayUntil_0:
\ 00000024 8E42 CMP R6,R1
\ 00000026 02D3 BCC ??vTaskDelayUntil_2
\ 00000028 3968 LDR R1,[R7, #+0]
\ 0000002A B142 CMP R1,R6
\ 0000002C 00D2 BCS ??vTaskDelayUntil_1
625 {
626 xShouldDelay = pdTRUE;
\ ??vTaskDelayUntil_2:
\ 0000002E 0125 MOV R5,#+0x1
627 }
628 }
629
630 /* Update the wake time ready for the next call. */
631 *pxPreviousWakeTime = xTimeToWake;
\ ??vTaskDelayUntil_1:
\ 00000030 2660 STR R6,[R4, #+0]
632
633 if( xShouldDelay )
\ 00000032 002D CMP R5,#+0
\ 00000034 12D0 BEQ ??vTaskDelayUntil_3
634 {
635 /* We must remove ourselves from the ready list before adding
636 ourselves to the blocked list as the same list item is used for
637 both lists. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -