📄 dynamic.lst
字号:
147 {
\ vStartDynamicPriorityTasks:
\ 00000000 10B5 PUSH {R4,LR}
148 xSuspendedTestQueue = xQueueCreate( priSUSPENDED_QUEUE_LENGTH, sizeof( unsigned portLONG ) );
\ 00000002 0421 MOV R1,#+0x4
\ 00000004 0120 MOV R0,#+0x1
\ 00000006 ........ _BLF xQueueCreate,xQueueCreate??rT
\ 0000000A .... LDR R1,??DataTable14 ;; xSuspendedTestQueue
\ 0000000C 0860 STR R0,[R1, #+0]
149 xTaskCreate( vContinuousIncrementTask, "CNT_INC", priSTACK_SIZE, ( void * ) &ulCounter, tskIDLE_PRIORITY, &xContinousIncrementHandle );
\ 0000000E .... LDR R4,??DataTable4 ;; ??ulCounter
\ 00000010 .... LDR R0,??DataTable9 ;; ??xContinousIncrementHandle
\ 00000012 01B4 PUSH {R0}
\ 00000014 0020 MOV R0,#+0
\ 00000016 01B4 PUSH {R0}
\ 00000018 231C MOV R3,R4
\ 0000001A 8022 MOV R2,#+0x80
\ 0000001C 1649 LDR R1,??vStartDynamicPriorityTasks_0 ;; `?<Constant "CNT_INC">`
\ 0000001E 1748 LDR R0,??vStartDynamicPriorityTasks_0+0x4 ;; ??vContinuousIncrementTask
\ 00000020 ........ _BLF xTaskCreate,xTaskCreate??rT
150 xTaskCreate( vLimitedIncrementTask, "LIM_INC", priSTACK_SIZE, ( void * ) &ulCounter, tskIDLE_PRIORITY + 1, &xLimitedIncrementHandle );
\ 00000024 .... LDR R0,??DataTable10 ;; ??xLimitedIncrementHandle
\ 00000026 01B4 PUSH {R0}
\ 00000028 0120 MOV R0,#+0x1
\ 0000002A 01B4 PUSH {R0}
\ 0000002C 231C MOV R3,R4
\ 0000002E 8022 MOV R2,#+0x80
\ 00000030 1349 LDR R1,??vStartDynamicPriorityTasks_0+0x8 ;; `?<Constant "LIM_INC">`
\ 00000032 1448 LDR R0,??vStartDynamicPriorityTasks_0+0xC ;; ??vLimitedIncrementTask
\ 00000034 ........ _BLF xTaskCreate,xTaskCreate??rT
151 xTaskCreate( vCounterControlTask, "C_CTRL", priSTACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
\ 00000038 0020 MOV R0,#+0
\ 0000003A 01B4 PUSH {R0}
\ 0000003C 01B4 PUSH {R0}
\ 0000003E 0023 MOV R3,#+0
\ 00000040 8022 MOV R2,#+0x80
\ 00000042 1149 LDR R1,??vStartDynamicPriorityTasks_0+0x10 ;; `?<Constant "C_CTRL">`
\ 00000044 1148 LDR R0,??vStartDynamicPriorityTasks_0+0x14 ;; ??vCounterControlTask
\ 00000046 ........ _BLF xTaskCreate,xTaskCreate??rT
152 xTaskCreate( vQueueSendWhenSuspendedTask, "SUSP_TX", priSTACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
\ 0000004A 0020 MOV R0,#+0
\ 0000004C 01B4 PUSH {R0}
\ 0000004E 01B4 PUSH {R0}
\ 00000050 031C MOV R3,R0
\ 00000052 8022 MOV R2,#+0x80
\ 00000054 0E49 LDR R1,??vStartDynamicPriorityTasks_0+0x18 ;; `?<Constant "SUSP_TX">`
\ 00000056 0F48 LDR R0,??vStartDynamicPriorityTasks_0+0x1C ;; ??vQueueSendWhenSuspendedTask
\ 00000058 ........ _BLF xTaskCreate,xTaskCreate??rT
153 xTaskCreate( vQueueReceiveWhenSuspendedTask, "SUSP_RX", priSTACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
\ 0000005C 0020 MOV R0,#+0
\ 0000005E 01B4 PUSH {R0}
\ 00000060 01B4 PUSH {R0}
\ 00000062 031C MOV R3,R0
\ 00000064 8022 MOV R2,#+0x80
\ 00000066 0C49 LDR R1,??vStartDynamicPriorityTasks_0+0x20 ;; `?<Constant "SUSP_RX">`
\ 00000068 0C48 LDR R0,??vStartDynamicPriorityTasks_0+0x24 ;; ??vQueueReceiveWhenSuspendedTask
\ 0000006A ........ _BLF xTaskCreate,xTaskCreate??rT
\ 0000006E 0AB0 ADD SP,#+0x28
154 }
\ 00000070 10BC POP {R4}
\ 00000072 01BC POP {R0}
\ 00000074 0047 BX R0 ;; return
\ 00000076 C046 NOP
\ ??vStartDynamicPriorityTasks_0:
\ 00000078 ........ DC32 `?<Constant "CNT_INC">`
\ 0000007C ........ DC32 ??vContinuousIncrementTask
\ 00000080 ........ DC32 `?<Constant "LIM_INC">`
\ 00000084 ........ DC32 ??vLimitedIncrementTask
\ 00000088 ........ DC32 `?<Constant "C_CTRL">`
\ 0000008C ........ DC32 ??vCounterControlTask
\ 00000090 ........ DC32 `?<Constant "SUSP_TX">`
\ 00000094 ........ DC32 ??vQueueSendWhenSuspendedTask
\ 00000098 ........ DC32 `?<Constant "SUSP_RX">`
\ 0000009C ........ DC32 ??vQueueReceiveWhenSuspendedTask
155 /*-----------------------------------------------------------*/
156
157 /*
158 * Just loops around incrementing the shared variable until the limit has been
159 * reached. Once the limit has been reached it suspends itself.
160 */
\ In segment CODE, align 4, keep-with-next
161 static portTASK_FUNCTION( vLimitedIncrementTask, pvParameters )
162 {
\ ??vLimitedIncrementTask:
\ 00000000 10B5 PUSH {R4,LR}
\ 00000002 041C MOV R4,R0
163 unsigned portLONG *pulCounter;
164
165 /* Take a pointer to the shared variable from the parameters passed into
166 the task. */
167 pulCounter = ( unsigned portLONG * ) pvParameters;
168
169 /* This will run before the control task, so the first thing it does is
170 suspend - the control task will resume it when ready. */
171 vTaskSuspend( NULL );
\ ??vLimitedIncrementTask_1:
\ 00000004 0020 MOV R0,#+0
\ 00000006 ........ _BLF vTaskSuspend,vTaskSuspend??rT
172
173 for( ;; )
174 {
175 /* Just count up to a value then suspend. */
176 ( *pulCounter )++;
\ ??vLimitedIncrementTask_2:
\ 0000000A 2068 LDR R0,[R4, #+0]
\ 0000000C 401C ADD R0,R0,#+0x1
\ 0000000E 2060 STR R0,[R4, #+0]
177
178 if( *pulCounter >= priMAX_COUNT )
\ 00000010 FF28 CMP R0,#+0xFF
\ 00000012 FAD3 BCC ??vLimitedIncrementTask_2
179 {
180 vTaskSuspend( NULL );
\ 00000014 F6E7 B ??vLimitedIncrementTask_1
181 }
182 }
183 }
184 /*-----------------------------------------------------------*/
185
186 /*
187 * Just keep counting the shared variable up. The control task will suspend
188 * this task when it wants.
189 */
\ In segment CODE, align 4, keep-with-next
190 static portTASK_FUNCTION( vContinuousIncrementTask, pvParameters )
191 {
\ ??vContinuousIncrementTask:
\ 00000000 30B5 PUSH {R4,R5,LR}
\ 00000002 041C MOV R4,R0
192 unsigned portLONG *pulCounter;
193 unsigned portBASE_TYPE uxOurPriority;
194
195 /* Take a pointer to the shared variable from the parameters passed into
196 the task. */
197 pulCounter = ( unsigned portLONG * ) pvParameters;
198
199 /* Query our priority so we can raise it when exclusive access to the
200 shared variable is required. */
201 uxOurPriority = uxTaskPriorityGet( NULL );
\ 00000004 0020 MOV R0,#+0
\ 00000006 ........ _BLF uxTaskPriorityGet,uxTaskPriorityGet??rT
\ 0000000A 051C MOV R5,R0
202
203 for( ;; )
204 {
205 /* Raise our priority above the controller task to ensure a context
206 switch does not occur while we are accessing this variable. */
207 vTaskPrioritySet( NULL, uxOurPriority + 1 );
\ ??vContinuousIncrementTask_1:
\ 0000000C 691C ADD R1,R5,#+0x1
\ 0000000E 0020 MOV R0,#+0
\ 00000010 ........ _BLF vTaskPrioritySet,vTaskPrioritySet??rT
208 ( *pulCounter )++;
\ 00000014 2068 LDR R0,[R4, #+0]
\ 00000016 401C ADD R0,R0,#+0x1
\ 00000018 2060 STR R0,[R4, #+0]
209 vTaskPrioritySet( NULL, uxOurPriority );
\ 0000001A 291C MOV R1,R5
\ 0000001C 0020 MOV R0,#+0
\ 0000001E ........ _BLF vTaskPrioritySet,vTaskPrioritySet??rT
\ 00000022 F3E7 B ??vContinuousIncrementTask_1
210 }
211 }
212 /*-----------------------------------------------------------*/
213
214 /*
215 * Controller task as described above.
216 */
\ In segment CODE, align 4, keep-with-next
217 static portTASK_FUNCTION( vCounterControlTask, pvParameters )
218 {
\ ??vCounterControlTask:
\ 00000000 F0B5 PUSH {R4-R7,LR}
\ 00000002 81B0 SUB SP,#+0x4
219 unsigned portLONG ulLastCounter;
220 portSHORT sLoops;
221 portSHORT sError = pdFALSE;
\ 00000004 6846 MOV R0,SP
\ 00000006 0021 MOV R1,#+0
\ 00000008 0180 STRH R1,[R0, #+0]
\ 0000000A .... LDR R4,??DataTable4 ;; ??ulCounter
\ 0000000C 0127 MOV R7,#+0x1
\ 0000000E 10E0 B ??vCounterControlTask_1
222
223 /* Just to stop warning messages. */
224 ( void ) pvParameters;
225
226 for( ;; )
227 {
228 /* Start with the counter at zero. */
229 ulCounter = ( unsigned portLONG ) 0;
230
231 /* First section : */
232
233 /* Check the continuous count task is running. */
234 for( sLoops = 0; sLoops < priLOOPS; sLoops++ )
235 {
236 /* Suspend the continuous count task so we can take a mirror of the
237 shared variable without risk of corruption. */
238 vTaskSuspend( xContinousIncrementHandle );
239 ulLastCounter = ulCounter;
240 vTaskResume( xContinousIncrementHandle );
241
242 /* Now delay to ensure the other task has processor time. */
243 vTaskDelay( priSLEEP_TIME );
244
245 /* Check the shared variable again. This time to ensure mutual
246 exclusion the whole scheduler will be locked. This is just for
247 demo purposes! */
248 vTaskSuspendAll();
249 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -