📄 pollq.s43
字号:
FUNCALL vPolledQueueProducer, vTaskDelay
LOCFRAME CSTACK, 10, 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 #0x2, SP
CFI CFA SP+10
MOV.W R12, R10
// 107 unsigned portSHORT usValue = ( unsigned portSHORT ) 0;
MOV.W #0x0, 0x0(SP)
// 108 signed portBASE_TYPE xError = pdFALSE, xLoop;
MOV.W #0x0, R11
// 109
// 110 for( ;; )
// 111 {
// 112 for( xLoop = 0; xLoop < pollqVALUES_TO_PRODUCE; xLoop++ )
??vPolledQueueProducer_1:
MOV.W #0x0, R8
??vPolledQueueProducer_0:
CMP.W #0x3, R8
JGE ??vPolledQueueProducer_2
// 113 {
// 114 /* Send an incrementing number on the queue without blocking. */
// 115 if( xQueueSend( *( ( xQueueHandle * ) pvParameters ), ( void * ) &usValue, pollqNO_DELAY ) != pdPASS )
PUSH.W #0x0
CFI CFA SP+12
MOV.W SP, R14
ADD.W #0x2, R14
MOV.W @R10, R12
CALL #xQueueSend
ADD.W #0x2, SP
CFI CFA SP+10
CMP.W #0x1, R12
JEQ ??vPolledQueueProducer_3
// 116 {
// 117 /* We should never find the queue full so if we get here there
// 118 has been an error. */
// 119 xError = pdTRUE;
MOV.W #0x1, R11
JMP ??vPolledQueueProducer_4
// 120 }
// 121 else
// 122 {
// 123 if( xError == pdFALSE )
??vPolledQueueProducer_3:
CMP.W #0x0, R11
JNE ??vPolledQueueProducer_5
// 124 {
// 125 /* If an error has ever been recorded we stop incrementing the
// 126 check variable. */
// 127 portENTER_CRITICAL();
DINT
NOP
ADD.W #0x1, &usCriticalNesting
// 128 xPollingProducerCount++;
ADD.W #0x1, &xPollingProducerCount
// 129 portEXIT_CRITICAL();
CMP.W #0x0, &usCriticalNesting
JEQ ??vPolledQueueProducer_5
ADD.W #0xffff, &usCriticalNesting
CMP.W #0x0, &usCriticalNesting
JNE ??vPolledQueueProducer_5
EINT
// 130 }
// 131
// 132 /* Update the value we are going to post next time around. */
// 133 usValue++;
??vPolledQueueProducer_5:
ADD.W #0x1, 0x0(SP)
// 134 }
// 135 }
??vPolledQueueProducer_4:
ADD.W #0x1, R8
JMP ??vPolledQueueProducer_0
// 136
// 137 /* Wait before we start posting again to ensure the consumer runs and
// 138 empties the queue. */
// 139 vTaskDelay( pollqDELAY );
??vPolledQueueProducer_2:
MOV.W #0xc8, R12
CALL #vTaskDelay
JMP ??vPolledQueueProducer_1
CFI EndBlock cfiBlock1
// 140 }
// 141 } /*lint !e818 Function prototype must conform to API. */
// 142 /*-----------------------------------------------------------*/
// 143
RSEG CODE:CODE:REORDER:NOROOT(1)
// 144 static portTASK_FUNCTION( vPolledQueueConsumer, pvParameters )
vPolledQueueConsumer:
CFI Block cfiBlock2 Using cfiCommon0
CFI Function vPolledQueueConsumer
// 145 {
FUNCALL vPolledQueueConsumer, uxQueueMessagesWaiting
LOCFRAME CSTACK, 10, STACK
FUNCALL vPolledQueueConsumer, xQueueReceive
LOCFRAME CSTACK, 12, STACK
FUNCALL vPolledQueueConsumer, vTaskDelay
LOCFRAME CSTACK, 10, 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 #0x2, SP
CFI CFA SP+10
MOV.W R12, R10
// 146 unsigned portSHORT usData, usExpectedValue = ( unsigned portSHORT ) 0;
MOV.W #0x0, R11
// 147 signed portBASE_TYPE xError = pdFALSE;
MOV.W #0x0, R8
// 148
// 149 for( ;; )
// 150 {
// 151 /* Loop until the queue is empty. */
// 152 while( uxQueueMessagesWaiting( *( ( xQueueHandle * ) pvParameters ) ) )
??vPolledQueueConsumer_0:
MOV.W @R10, R12
CALL #uxQueueMessagesWaiting
CMP.W #0x0, R12
JEQ ??vPolledQueueConsumer_1
// 153 {
// 154 if( xQueueReceive( *( ( xQueueHandle * ) pvParameters ), &usData, pollqNO_DELAY ) == pdPASS )
PUSH.W #0x0
CFI CFA SP+12
MOV.W SP, R14
ADD.W #0x2, R14
MOV.W @R10, R12
CALL #xQueueReceive
ADD.W #0x2, SP
CFI CFA SP+10
CMP.W #0x1, R12
JNE ??vPolledQueueConsumer_0
// 155 {
// 156 if( usData != usExpectedValue )
CMP.W R11, 0x0(SP)
JEQ ??vPolledQueueConsumer_2
// 157 {
// 158 /* This is not what we expected to receive so an error has
// 159 occurred. */
// 160 xError = pdTRUE;
MOV.W #0x1, R8
// 161
// 162 /* Catch-up to the value we received so our next expected
// 163 value should again be correct. */
// 164 usExpectedValue = usData;
MOV.W 0x0(SP), R11
JMP ??vPolledQueueConsumer_3
// 165 }
// 166 else
// 167 {
// 168 if( xError == pdFALSE )
??vPolledQueueConsumer_2:
CMP.W #0x0, R8
JNE ??vPolledQueueConsumer_3
// 169 {
// 170 /* Only increment the check variable if no errors have
// 171 occurred. */
// 172 portENTER_CRITICAL();
DINT
NOP
ADD.W #0x1, &usCriticalNesting
// 173 xPollingConsumerCount++;
ADD.W #0x1, &xPollingConsumerCount
// 174 portEXIT_CRITICAL();
CMP.W #0x0, &usCriticalNesting
JEQ ??vPolledQueueConsumer_3
ADD.W #0xffff, &usCriticalNesting
CMP.W #0x0, &usCriticalNesting
JNE ??vPolledQueueConsumer_3
EINT
// 175 }
// 176 }
// 177
// 178 /* Next time round we would expect the number to be one higher. */
// 179 usExpectedValue++;
??vPolledQueueConsumer_3:
ADD.W #0x1, R11
JMP ??vPolledQueueConsumer_0
// 180 }
// 181 }
// 182
// 183 /* Now the queue is empty we block, allowing the producer to place more
// 184 items in the queue. */
// 185 vTaskDelay( pollqDELAY );
??vPolledQueueConsumer_1:
MOV.W #0xc8, R12
CALL #vTaskDelay
JMP ??vPolledQueueConsumer_0
CFI EndBlock cfiBlock2
// 186 }
// 187 } /*lint !e818 Function prototype must conform to API. */
// 188 /*-----------------------------------------------------------*/
// 189
// 190 /* This is called to check that all the created tasks are still running with no errors. */
RSEG CODE:CODE:REORDER:NOROOT(1)
// 191 portBASE_TYPE xArePollingQueuesStillRunning( void )
xArePollingQueuesStillRunning:
CFI Block cfiBlock3 Using cfiCommon0
CFI Function xArePollingQueuesStillRunning
// 192 {
// 193 portBASE_TYPE xReturn;
// 194
// 195 /* Check both the consumer and producer poll count to check they have both
// 196 been changed since out last trip round. We do not need a critical section
// 197 around the check variables as this is called from a higher priority than
// 198 the other tasks that access the same variables. */
// 199 if( ( xPollingConsumerCount == pollqINITIAL_VALUE ) ||
// 200 ( xPollingProducerCount == pollqINITIAL_VALUE )
// 201 )
CMP.W #0x0, &xPollingConsumerCount
JEQ ??xArePollingQueuesStillRunning_0
CMP.W #0x0, &xPollingProducerCount
JNE ??xArePollingQueuesStillRunning_1
// 202 {
// 203 xReturn = pdFALSE;
??xArePollingQueuesStillRunning_0:
MOV.W #0x0, R12
JMP ??xArePollingQueuesStillRunning_2
// 204 }
// 205 else
// 206 {
// 207 xReturn = pdTRUE;
??xArePollingQueuesStillRunning_1:
MOV.W #0x1, R12
// 208 }
// 209
// 210 /* Set the check variables back down so we know if they have been
// 211 incremented the next time around. */
// 212 xPollingConsumerCount = pollqINITIAL_VALUE;
??xArePollingQueuesStillRunning_2:
MOV.W #0x0, &xPollingConsumerCount
// 213 xPollingProducerCount = pollqINITIAL_VALUE;
MOV.W #0x0, &xPollingProducerCount
// 214
// 215 return xReturn;
RET
CFI EndBlock cfiBlock3
// 216 }
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
RSEG DATA16_C:CONST:SORT:NOROOT(0)
`?<Constant "QConsNB">`:
DC8 "QConsNB"
RSEG DATA16_C:CONST:SORT:NOROOT(0)
`?<Constant "QProdNB">`:
DC8 "QProdNB"
END
//
// 302 bytes in segment CODE
// 16 bytes in segment DATA16_C
// 6 bytes in segment DATA16_Z
//
// 302 bytes of CODE memory
// 16 bytes of CONST memory
// 6 bytes of DATA memory
//
//Errors: none
//Warnings: 2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -