📄 serial.lst
字号:
\ 00000018 0422 MOV R2,#+0x4
\ 0000001A 0A43 ORR R2,R1
\ 0000001C 0280 STRH R2,[R0, #+0]
180
181 return pdPASS;
\ 0000001E 0120 MOV R0,#+0x1
\ ??xSerialPutChar_1:
\ 00000020 01B0 ADD SP,#+0x4
\ 00000022 02BC POP {R1}
\ 00000024 0847 BX R1 ;; return
182 }
183 /*-----------------------------------------------------------*/
184
\ In segment CODE, align 4, keep-with-next
185 void vSerialClose( xComPortHandle xPort )
186 {
187 /* Not supported as not required by the demo application. */
188 }
\ vSerialClose:
\ 00000000 7047 BX LR ;; return
189 /*-----------------------------------------------------------*/
190
191 /* Serial port ISR. This can cause a context switch so is not defined as a
192 standard ISR using the __irq keyword. Instead a wrapper function is defined
193 within serialISR.s79 which in turn calls this function. See the port
194 documentation on the FreeRTOS.org website for more information. */
\ In segment CODE, align 4, keep-with-next
195 __arm void vSerialISR( void )
196 {
\ vSerialISR:
\ 00000000 10402DE9 STMDB SP!,{R4,LR} ;; Push
\ 00000004 08D04DE2 SUB SP,SP,#+0x8
197 unsigned portSHORT usStatus;
198 signed portCHAR cChar;
199 portBASE_TYPE xTaskWokenByTx = pdFALSE, xTaskWokenByPost = pdFALSE;
\ 00000008 0010A0E3 MOV R1,#+0
\ 0000000C 04108DE5 STR R1,[SP, #+0x4]
200
201 /* What caused the interrupt? */
202 usStatus = UART_FlagStatus( UART0 );
\ 00000010 C004A0E3 MOV R0,#-1073741824
\ 00000014 400C80E3 ORR R0,R0,#+0x4000
\ 00000018 ........ _BLF UART_FlagStatus,UART_FlagStatus??rA
\ 0000001C 0040A0E1 MOV R4,R0
203
204 if( usStatus & UART_TxHalfEmpty )
\ 00000020 040010E3 TST R0,#+0x4
\ 00000024 1100000A BEQ ??vSerialISR_0
205 {
206 /* The interrupt was caused by the THR becoming empty. Are there any
207 more characters to transmit? */
208 if( xQueueReceiveFromISR( xCharsForTx, &cChar, &xTaskWokenByTx ) == pdTRUE )
\ 00000028 04208DE2 ADD R2,SP,#+0x4
\ 0000002C 0D10A0E1 MOV R1,SP
\ 00000030 ........ LDR R0,??DataTable7 ;; ??xCharsForTx
\ 00000034 000090E5 LDR R0,[R0, #+0]
\ 00000038 ........ _BLF xQueueReceiveFromISR,xQueueReceiveFromISR??rA
\ 0000003C 010050E3 CMP R0,#+0x1
\ 00000040 0300001A BNE ??vSerialISR_1
209 {
210 /* A character was retrieved from the queue so can be sent to the
211 THR now. */
212 UART0->TxBUFR = cChar;
\ 00000044 4C02A0E3 MOV R0,#-1073741820
\ 00000048 400C80E3 ORR R0,R0,#+0x4000
\ 0000004C D010DDE1 LDRSB R1,[SP, #+0]
\ 00000050 050000EA B ??vSerialISR_2
213 }
214 else
215 {
216 /* Queue empty, nothing to send so turn off the Tx interrupt. */
217 serINTERRUPT_OFF();
\ ??vSerialISR_1:
\ 00000054 4301A0E3 MOV R0,#-1073741808
\ 00000058 400C80E3 ORR R0,R0,#+0x4000
\ 0000005C B010D0E1 LDRH R1,[R0, #+0]
\ 00000060 FB20A0E3 MOV R2,#+0xFB
\ 00000064 FF2C82E3 ORR R2,R2,#+0xFF00
\ 00000068 011002E0 AND R1,R2,R1
\ ??vSerialISR_2:
\ 0000006C B010C0E1 STRH R1,[R0, #+0]
218 }
219 }
220
221 if( usStatus & UART_RxBufFull )
\ ??vSerialISR_0:
\ 00000070 010014E3 TST R4,#+0x1
\ 00000074 0A00000A BEQ ??vSerialISR_3
222 {
223 /* The interrupt was caused by a character being received. Grab the
224 character from the RHR and place it in the queue of received
225 characters. */
226 cChar = UART0->RxBUFR;
\ 00000078 8C12A0E3 MOV R1,#-1073741816
\ 0000007C 401C81E3 ORR R1,R1,#+0x4000
\ 00000080 B010D1E1 LDRH R1,[R1, #+0]
\ 00000084 0010CDE5 STRB R1,[SP, #+0]
227 xTaskWokenByPost = xQueueSendFromISR( xRxedChars, &cChar, xTaskWokenByPost );
228 }
229
230 /* If a task was woken by either a character being received or a character
231 being transmitted then we may need to switch to another task. */
232 portEND_SWITCHING_ISR( ( xTaskWokenByPost || xTaskWokenByTx ) );
\ 00000088 0020A0E3 MOV R2,#+0
\ 0000008C 0D10A0E1 MOV R1,SP
\ 00000090 ........ LDR R0,??DataTable8 ;; ??xRxedChars
\ 00000094 000090E5 LDR R0,[R0, #+0]
\ 00000098 ........ _BLF xQueueSendFromISR,xQueueSendFromISR??rA
\ 0000009C 000050E3 CMP R0,#+0
\ 000000A0 0200001A BNE ??vSerialISR_4
\ ??vSerialISR_3:
\ 000000A4 04009DE5 LDR R0,[SP, #+0x4]
\ 000000A8 000050E3 CMP R0,#+0
\ 000000AC 0000000A BEQ ??vSerialISR_5
\ ??vSerialISR_4:
\ 000000B0 ........ _BLF vTaskSwitchContext,vTaskSwitchContext??rA
233
234 /* End the interrupt in the EIC. */
235 portCLEAR_EIC();
\ ??vSerialISR_5:
\ 000000B4 BF00E0E3 MVN R0,#+0xBF
\ 000000B8 700EC0E3 BIC R0,R0,#+0x700
\ 000000BC 0110A0E3 MOV R1,#+0x1
\ 000000C0 3C2040E2 SUB R2,R0,#+0x3C
\ 000000C4 002092E5 LDR R2,[R2, #+0]
\ 000000C8 1112A0E1 MOV R1,R1, LSL R2
\ 000000CC 001080E5 STR R1,[R0, #+0]
236 }
\ 000000D0 08D08DE2 ADD SP,SP,#+0x8 ;; stack cleaning
\ 000000D4 1040BDE8 LDMIA SP!,{R4,LR} ;; Pop
\ 000000D8 1EFF2FE1 BX LR ;; return
\ In segment CODE, align 4, keep-with-next
\ ??DataTable6:
\ 00000000 104000C0 DC32 0xc0004010
\ In segment CODE, align 4, keep-with-next
\ ??DataTable7:
\ 00000000 ........ DC32 ??xCharsForTx
\ In segment CODE, align 4, keep-with-next
\ ??DataTable8:
\ 00000000 ........ DC32 ??xRxedChars
237
238
239
240
241
242
Maximum stack usage in bytes:
Function CSTACK
-------- ------
UART_FlagStatus 0
vSerialClose 0
vSerialISR 16
vSerialPutString 12
xSerialGetChar 4
xSerialPortInitMinimal 28
xSerialPutChar 8
Segment part sizes:
Function/Label Bytes
-------------- -----
UART_FlagStatus 4
xRxedChars 4
xCharsForTx 4
xSerialPortInitMinimal 220
xSerialGetChar 22
vSerialPutString 54
xSerialPutChar 38
vSerialClose 2
vSerialISR 220
??DataTable6 4
??DataTable7 4
??DataTable8 4
Others 216
776 bytes in segment CODE
8 bytes in segment DATA_Z
12 bytes in segment INITTAB
568 bytes of CODE memory (+ 220 bytes shared)
8 bytes of DATA memory
Errors: none
Warnings: none
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -