📄 death.s43
字号:
// 126 /*-----------------------------------------------------------*/
// 127
RSEG CODE:CODE:REORDER:NOROOT(1)
// 128 static portTASK_FUNCTION( vSuicidalTask, pvParameters )
vSuicidalTask:
CFI Block cfiBlock1 Using cfiCommon0
CFI Function vSuicidalTask
// 129 {
FUNCALL vSuicidalTask, vTaskDelay
LOCFRAME CSTACK, 16, STACK
FUNCALL vSuicidalTask, vTaskDelay
LOCFRAME CSTACK, 16, STACK
FUNCALL vSuicidalTask, vTaskDelete
LOCFRAME CSTACK, 16, STACK
FUNCALL vSuicidalTask, vTaskDelete
LOCFRAME CSTACK, 16, STACK
PUSH.W R10
CFI R10 Frame(CFA, -4)
CFI CFA SP+4
PUSH.W R11
CFI R11 Frame(CFA, -6)
CFI CFA SP+6
PUSH.W R8
CFI R8 Frame(CFA, -8)
CFI CFA SP+8
SUB.W #0x8, SP
CFI CFA SP+16
MOV.W R12, R10
// 130 volatile portLONG l1, l2;
// 131 xTaskHandle xTaskToKill;
// 132 const portTickType xDelay = ( portTickType ) 200 / portTICK_RATE_MS;
MOV.W #0xc8, R8
// 133
// 134 if( pvParameters != NULL )
CMP.W #0x0, R10
JEQ ??vSuicidalTask_1
// 135 {
// 136 /* This task is periodically created four times. Two created tasks are
// 137 passed a handle to the other task so it can kill it before killing itself.
// 138 The other task is passed in null. */
// 139 xTaskToKill = *( xTaskHandle* )pvParameters;
MOV.W @R10, R11
JMP ??vSuicidalTask_0
// 140 }
// 141 else
// 142 {
// 143 xTaskToKill = NULL;
??vSuicidalTask_1:
MOV.W #0x0, R11
// 144 }
// 145
// 146 for( ;; )
// 147 {
// 148 /* Do something random just to use some stack and registers. */
// 149 l1 = 2;
??vSuicidalTask_0:
MOV.W #0x2, 0x4(SP)
MOV.W #0x0, 0x6(SP)
// 150 l2 = 89;
MOV.W #0x59, 0x0(SP)
MOV.W #0x0, 0x2(SP)
// 151 l2 *= l1;
MOV.W 0x0(SP), R12
MOV.W 0x2(SP), R13
MOV.W 0x4(SP), R14
MOV.W 0x6(SP), R15
CALL #?Mul32
MOV.W R12, 0x0(SP)
MOV.W R13, 0x2(SP)
// 152 vTaskDelay( xDelay );
MOV.W R8, R12
CALL #vTaskDelay
// 153
// 154 if( xTaskToKill != NULL )
CMP.W #0x0, R11
JEQ ??vSuicidalTask_0
// 155 {
// 156 /* Make sure the other task has a go before we delete it. */
// 157 vTaskDelay( ( portTickType ) 0 );
MOV.W #0x0, R12
CALL #vTaskDelay
// 158 /* Kill the other task that was created by vCreateTasks(). */
// 159 vTaskDelete( xTaskToKill );
MOV.W R11, R12
CALL #vTaskDelete
// 160 /* Kill ourselves. */
// 161 vTaskDelete( NULL );
MOV.W #0x0, R12
CALL #vTaskDelete
JMP ??vSuicidalTask_0
CFI EndBlock cfiBlock1
// 162 }
// 163 }
// 164 }/*lint !e818 !e550 Function prototype must be as per standard for task functions. */
// 165 /*-----------------------------------------------------------*/
// 166
RSEG CODE:CODE:REORDER:NOROOT(1)
// 167 static portTASK_FUNCTION( vCreateTasks, pvParameters )
vCreateTasks:
CFI Block cfiBlock2 Using cfiCommon0
CFI Function vCreateTasks
// 168 {
FUNCALL vCreateTasks, vPortFree
LOCFRAME CSTACK, 8, STACK
FUNCALL vCreateTasks, vTaskDelay
LOCFRAME CSTACK, 8, STACK
FUNCALL vCreateTasks, xTaskCreate
LOCFRAME CSTACK, 16, STACK
FUNCALL vCreateTasks, xTaskCreate
LOCFRAME CSTACK, 24, STACK
FUNCALL vCreateTasks, xTaskCreate
LOCFRAME CSTACK, 32, STACK
FUNCALL vCreateTasks, xTaskCreate
LOCFRAME CSTACK, 40, STACK
PUSH.W R10
CFI R10 Frame(CFA, -4)
CFI CFA SP+4
PUSH.W R11
CFI R11 Frame(CFA, -6)
CFI CFA SP+6
PUSH.W R8
CFI R8 Frame(CFA, -8)
CFI CFA SP+8
MOV.W R12, R10
// 169 const portTickType xDelay = ( portTickType ) 1000 / portTICK_RATE_MS;
MOV.W #0x3e8, R11
// 170 unsigned portBASE_TYPE uxPriority;
// 171
// 172 uxPriority = *( unsigned portBASE_TYPE * ) pvParameters;
MOV.W @R10, R8
// 173 vPortFree( pvParameters );
MOV.W R10, R12
CALL #vPortFree
// 174
// 175 for( ;; )
// 176 {
// 177 /* Just loop round, delaying then creating the four suicidal tasks. */
// 178 vTaskDelay( xDelay );
??vCreateTasks_0:
MOV.W R11, R12
CALL #vTaskDelay
// 179
// 180 xTaskCreate( vSuicidalTask, "SUICID1", deathSTACK_SIZE, NULL, uxPriority, &xCreatedTask1 );
PUSH.W #xCreatedTask1
CFI CFA SP+10
PUSH.W R8
CFI CFA SP+12
PUSH.W #0x0
CFI CFA SP+14
PUSH.W #0x58
CFI CFA SP+16
MOV.W #`?<Constant "SUICID1">`, R14
MOV.W #vSuicidalTask, R12
CALL #xTaskCreate
// 181 xTaskCreate( vSuicidalTask, "SUICID2", deathSTACK_SIZE, &xCreatedTask1, uxPriority, NULL );
PUSH.W #0x0
CFI CFA SP+18
PUSH.W R8
CFI CFA SP+20
PUSH.W #xCreatedTask1
CFI CFA SP+22
PUSH.W #0x58
CFI CFA SP+24
MOV.W #`?<Constant "SUICID2">`, R14
MOV.W #vSuicidalTask, R12
CALL #xTaskCreate
// 182
// 183 xTaskCreate( vSuicidalTask, "SUICID1", deathSTACK_SIZE, NULL, uxPriority, &xCreatedTask2 );
PUSH.W #xCreatedTask2
CFI CFA SP+26
PUSH.W R8
CFI CFA SP+28
PUSH.W #0x0
CFI CFA SP+30
PUSH.W #0x58
CFI CFA SP+32
MOV.W #`?<Constant "SUICID1">`, R14
MOV.W #vSuicidalTask, R12
CALL #xTaskCreate
// 184 xTaskCreate( vSuicidalTask, "SUICID2", deathSTACK_SIZE, &xCreatedTask2, uxPriority, NULL );
PUSH.W #0x0
CFI CFA SP+34
PUSH.W R8
CFI CFA SP+36
PUSH.W #xCreatedTask2
CFI CFA SP+38
PUSH.W #0x58
CFI CFA SP+40
MOV.W #`?<Constant "SUICID2">`, R14
MOV.W #vSuicidalTask, R12
CALL #xTaskCreate
// 185
// 186 ++usCreationCount;
ADD.W #0x1, &usCreationCount
ADD.W #0x20, SP
CFI CFA SP+8
JMP ??vCreateTasks_0
CFI EndBlock cfiBlock2
// 187 }
// 188 }
// 189 /*-----------------------------------------------------------*/
// 190
// 191 /* This is called to check that the creator task is still running and that there
// 192 are not any more than four extra tasks. */
RSEG CODE:CODE:REORDER:NOROOT(1)
// 193 portBASE_TYPE xIsCreateTaskStillRunning( void )
xIsCreateTaskStillRunning:
CFI Block cfiBlock3 Using cfiCommon0
CFI Function xIsCreateTaskStillRunning
// 194 {
FUNCALL xIsCreateTaskStillRunning, uxTaskGetNumberOfTasks
LOCFRAME CSTACK, 4, STACK
PUSH.W R10
CFI R10 Frame(CFA, -4)
CFI CFA SP+4
// 195 static portSHORT usLastCreationCount = -1;
// 196 portBASE_TYPE xReturn = pdTRUE;
MOV.W #0x1, R10
// 197 static unsigned portBASE_TYPE uxTasksRunningNow;
// 198
// 199 if( usLastCreationCount == usCreationCount )
CMP.W &usCreationCount, &??usLastCreationCount
JNE ??xIsCreateTaskStillRunning_0
// 200 {
// 201 xReturn = pdFALSE;
MOV.W #0x0, R10
JMP ??xIsCreateTaskStillRunning_1
// 202 }
// 203 else
// 204 {
// 205 usLastCreationCount = usCreationCount;
??xIsCreateTaskStillRunning_0:
MOV.W &usCreationCount, &??usLastCreationCount
// 206 }
// 207
// 208 uxTasksRunningNow = ( unsigned portBASE_TYPE ) uxTaskGetNumberOfTasks();
??xIsCreateTaskStillRunning_1:
CALL #uxTaskGetNumberOfTasks
MOV.W R12, &??uxTasksRunningNow
// 209
// 210 if( uxTasksRunningNow < uxTasksRunningAtStart )
CMP.W &uxTasksRunningAtStart, &??uxTasksRunningNow
JC ??xIsCreateTaskStillRunning_2
// 211 {
// 212 xReturn = pdFALSE;
MOV.W #0x0, R10
JMP ??xIsCreateTaskStillRunning_3
// 213 }
// 214 else if( ( uxTasksRunningNow - uxTasksRunningAtStart ) > uxMaxNumberOfExtraTasksRunning )
??xIsCreateTaskStillRunning_2:
MOV.W &??uxTasksRunningNow, R15
SUB.W &uxTasksRunningAtStart, R15
CMP.W R15, &uxMaxNumberOfExtraTasksRunning
JC ??xIsCreateTaskStillRunning_3
// 215 {
// 216 xReturn = pdFALSE;
MOV.W #0x0, R10
// 217 }
// 218 else
// 219 {
// 220 /* Everything is okay. */
// 221 }
// 222
// 223 return xReturn;
??xIsCreateTaskStillRunning_3:
MOV.W R10, R12
POP.W R10
CFI R10 SameValue
CFI CFA SP+2
RET
CFI EndBlock cfiBlock3
// 224 }
RSEG DATA16_I:DATA:SORT:NOROOT(1)
REQUIRE ?cstart_init_copy
??usLastCreationCount:
DS8 2
REQUIRE `?<Initializer for usLastCreationCount>`
RSEG DATA16_Z:DATA:SORT:NOROOT(1)
REQUIRE ?cstart_init_zero
??uxTasksRunningNow:
DS8 2
RSEG DATA16_ID:CONST:SORT:NOROOT(1)
`?<Initializer for usLastCreationCount>`:
DC16 -1
RSEG CODE:CODE:REORDER:NOROOT(1)
?setjmp_save_r4:
REQUIRE ?setjmp_r4
REQUIRE ?longjmp_r4
RSEG CODE:CODE:REORDER:NOROOT(1)
?setjmp_save_r5:
REQUIRE ?setjmp_r5
REQUIRE ?longjmp_r5
END
// 225
// 226
//
// 354 bytes in segment CODE
// 26 bytes in segment DATA16_C
// 2 bytes in segment DATA16_I
// 2 bytes in segment DATA16_ID
// 10 bytes in segment DATA16_Z
//
// 354 bytes of CODE memory
// 28 bytes of CONST memory
// 12 bytes of DATA memory
//
//Errors: none
//Warnings: 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -