📄 dynamic.lst
字号:
250 if( ulLastCounter == ulCounter )
251 {
252 /* The shared variable has not changed. There is a problem
253 with the continuous count task so flag an error. */
254 sError = pdTRUE;
255 }
256 }
257 xTaskResumeAll();
258 }
259
260
261 /* Second section: */
262
263 /* Suspend the continuous counter task so it stops accessing the shared variable. */
264 vTaskSuspend( xContinousIncrementHandle );
265
266 /* Reset the variable. */
267 ulCounter = ( unsigned portLONG ) 0;
268
269 /* Resume the limited count task which has a higher priority than us.
270 We should therefore not return from this call until the limited count
271 task has suspended itself with a known value in the counter variable. */
272 vTaskResume( xLimitedIncrementHandle );
273
274 /* Does the counter variable have the expected value? */
275 if( ulCounter != priMAX_COUNT )
276 {
277 sError = pdTRUE;
278 }
279
280 if( sError == pdFALSE )
\ ??vCounterControlTask_2:
\ 00000010 6946 MOV R1,SP
\ 00000012 0020 MOV R0,#+0
\ 00000014 085E LDRSH R0,[R1, R0]
\ 00000016 0028 CMP R0,#+0
\ 00000018 07D1 BNE ??vCounterControlTask_3
281 {
282 /* If no errors have occurred then increment the check variable. */
283 portENTER_CRITICAL();
\ 0000001A ........ _BLF vPortEnterCritical,vPortEnterCritical??rT
284 usCheckVariable++;
\ 0000001E .... LDR R0,??DataTable15 ;; ??usCheckVariable
\ 00000020 0188 LDRH R1,[R0, #+0]
\ 00000022 491C ADD R1,R1,#+0x1
\ 00000024 0180 STRH R1,[R0, #+0]
285 portEXIT_CRITICAL();
\ 00000026 ........ _BLF vPortExitCritical,vPortExitCritical??rT
286 }
287
288 /* Resume the continuous count task and do it all again. */
289 vTaskResume( xContinousIncrementHandle );
\ ??vCounterControlTask_3:
\ 0000002A .... LDR R0,??DataTable9 ;; ??xContinousIncrementHandle
\ 0000002C 0068 LDR R0,[R0, #+0]
\ 0000002E ........ _BLF vTaskResume,vTaskResume??rT
\ ??vCounterControlTask_1:
\ 00000032 0020 MOV R0,#+0
\ 00000034 2060 STR R0,[R4, #+0]
\ 00000036 0525 MOV R5,#+0x5
\ ??vCounterControlTask_4:
\ 00000038 .... LDR R0,??DataTable9 ;; ??xContinousIncrementHandle
\ 0000003A 0068 LDR R0,[R0, #+0]
\ 0000003C ........ _BLF vTaskSuspend,vTaskSuspend??rT
\ 00000040 2668 LDR R6,[R4, #+0]
\ 00000042 .... LDR R0,??DataTable9 ;; ??xContinousIncrementHandle
\ 00000044 0068 LDR R0,[R0, #+0]
\ 00000046 ........ _BLF vTaskResume,vTaskResume??rT
\ 0000004A 3220 MOV R0,#+0x32
\ 0000004C ........ _BLF vTaskDelay,vTaskDelay??rT
\ 00000050 ........ _BLF vTaskSuspendAll,vTaskSuspendAll??rT
\ 00000054 2068 LDR R0,[R4, #+0]
\ 00000056 8642 CMP R6,R0
\ 00000058 01D1 BNE ??vCounterControlTask_5
\ 0000005A 6846 MOV R0,SP
\ 0000005C 0780 STRH R7,[R0, #+0]
\ ??vCounterControlTask_5:
\ 0000005E ........ _BLF xTaskResumeAll,xTaskResumeAll??rT
\ 00000062 6D1E SUB R5,R5,#+0x1
\ 00000064 E8D1 BNE ??vCounterControlTask_4
\ 00000066 .... LDR R0,??DataTable9 ;; ??xContinousIncrementHandle
\ 00000068 0068 LDR R0,[R0, #+0]
\ 0000006A ........ _BLF vTaskSuspend,vTaskSuspend??rT
\ 0000006E 0020 MOV R0,#+0
\ 00000070 2060 STR R0,[R4, #+0]
\ 00000072 .... LDR R0,??DataTable10 ;; ??xLimitedIncrementHandle
\ 00000074 0068 LDR R0,[R0, #+0]
\ 00000076 ........ _BLF vTaskResume,vTaskResume??rT
\ 0000007A 2068 LDR R0,[R4, #+0]
\ 0000007C FF28 CMP R0,#+0xFF
\ 0000007E C7D0 BEQ ??vCounterControlTask_2
\ 00000080 6846 MOV R0,SP
\ 00000082 0780 STRH R7,[R0, #+0]
\ 00000084 D1E7 B ??vCounterControlTask_3
290 }
291 }
292 /*-----------------------------------------------------------*/
293
\ In segment CODE, align 4, keep-with-next
294 static portTASK_FUNCTION( vQueueSendWhenSuspendedTask, pvParameters )
295 {
\ ??vQueueSendWhenSuspendedTask:
\ 00000000 30B5 PUSH {R4,R5,LR}
296 static unsigned portLONG ulValueToSend = ( unsigned portLONG ) 0;
297
298 /* Just to stop warning messages. */
299 ( void ) pvParameters;
\ 00000002 .... LDR R4,??DataTable14 ;; xSuspendedTestQueue
\ 00000004 0A4D LDR R5,??vQueueSendWhenSuspendedTask_1 ;; ??ulValueToSend
300
301 for( ;; )
302 {
303 vTaskSuspendAll();
\ ??vQueueSendWhenSuspendedTask_2:
\ 00000006 ........ _BLF vTaskSuspendAll,vTaskSuspendAll??rT
304 {
305 /* We must not block while the scheduler is suspended! */
306 if( xQueueSend( xSuspendedTestQueue, ( void * ) &ulValueToSend, priNO_BLOCK ) != pdTRUE )
\ 0000000A 0022 MOV R2,#+0
\ 0000000C 291C MOV R1,R5
\ 0000000E 2068 LDR R0,[R4, #+0]
\ 00000010 ........ _BLF xQueueSend,xQueueSend??rT
\ 00000014 0128 CMP R0,#+0x1
\ 00000016 02D0 BEQ ??vQueueSendWhenSuspendedTask_3
307 {
308 xSuspendedQueueSendError = pdTRUE;
\ 00000018 .... LDR R0,??DataTable16 ;; ??xSuspendedQueueSendError
\ 0000001A 0121 MOV R1,#+0x1
\ 0000001C 0160 STR R1,[R0, #+0]
309 }
310 }
311 xTaskResumeAll();
\ ??vQueueSendWhenSuspendedTask_3:
\ 0000001E ........ _BLF xTaskResumeAll,xTaskResumeAll??rT
312
313 vTaskDelay( priSLEEP_TIME );
\ 00000022 3220 MOV R0,#+0x32
\ 00000024 ........ _BLF vTaskDelay,vTaskDelay??rT
314
315 ++ulValueToSend;
\ 00000028 2868 LDR R0,[R5, #+0]
\ 0000002A 401C ADD R0,R0,#+0x1
\ 0000002C 2860 STR R0,[R5, #+0]
\ 0000002E EAE7 B ??vQueueSendWhenSuspendedTask_2
\ ??vQueueSendWhenSuspendedTask_1:
\ 00000030 ........ DC32 ??ulValueToSend
316 }
317 }
\ In segment DATA_Z, align 4, align-sorted
\ ??ulValueToSend:
\ 00000000 DS8 4
318 /*-----------------------------------------------------------*/
319
\ In segment CODE, align 4, keep-with-next
320 static portTASK_FUNCTION( vQueueReceiveWhenSuspendedTask, pvParameters )
321 {
\ ??vQueueReceiveWhenSuspendedTask:
\ 00000000 F0B5 PUSH {R4-R7,LR}
\ 00000002 104C LDR R4,??vQueueReceiveWhenSuspendedTask_1 ;; ??ulReceivedValue
\ 00000004 .... LDR R5,??DataTable17 ;; ??xSuspendedQueueReceiveError
\ 00000006 0126 MOV R6,#+0x1
322 static unsigned portLONG ulExpectedValue = ( unsigned portLONG ) 0, ulReceivedValue;
323 portBASE_TYPE xGotValue;
324
325 /* Just to stop warning messages. */
326 ( void ) pvParameters;
327
328 for( ;; )
329 {
330 do
331 {
332 /* Suspending the scheduler here is fairly pointless and
333 undesirable for a normal application. It is done here purely
334 to test the scheduler. The inner xTaskResumeAll() should
335 never return pdTRUE as the scheduler is still locked by the
336 outer call. */
337 vTaskSuspendAll();
\ ??vQueueReceiveWhenSuspendedTask_2:
\ 00000008 ........ _BLF vTaskSuspendAll,vTaskSuspendAll??rT
338 {
339 vTaskSuspendAll();
\ 0000000C ........ _BLF vTaskSuspendAll,vTaskSuspendAll??rT
340 {
341 xGotValue = xQueueReceive( xSuspendedTestQueue, ( void * ) &ulReceivedValue, priNO_BLOCK );
\ 00000010 0022 MOV R2,#+0
\ 00000012 211C MOV R1,R4
\ 00000014 .... LDR R0,??DataTable14 ;; xSuspendedTestQueue
\ 00000016 0068 LDR R0,[R0, #+0]
\ 00000018 ........ _BLF xQueueReceive,xQueueReceive??rT
\ 0000001C 071C MOV R7,R0
342 }
343 if( xTaskResumeAll() )
\ 0000001E ........ _BLF xTaskResumeAll,xTaskResumeAll??rT
\ 00000022 0028 CMP R0,#+0
\ 00000024 00D0 BEQ ??vQueueReceiveWhenSuspendedTask_3
344 {
345 xSuspendedQueueReceiveError = pdTRUE;
\ 00000026 2E60 STR R6,[R5, #+0]
346 }
347 }
348 xTaskResumeAll();
\ ??vQueueReceiveWhenSuspendedTask_3:
\ 00000028 ........ _BLF xTaskResumeAll,xTaskResumeAll??rT
349
350 } while( xGotValue == pdFALSE );
\ 0000002C 002F CMP R7,#+0
\ 0000002E EBD0 BEQ ??vQueueReceiveWhenSuspendedTask_2
351
352 if( ulReceivedValue != ulExpectedValue )
\ 00000030 0548 LDR R0,??vQueueReceiveWhenSuspendedTask_1+0x4 ;; ??ulExpectedValue
\ 00000032 0168 LDR R1,[R0, #+0]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -