📄 uart.lst
字号:
170 0138 000053E3 ldrne r3, .L14+20
145:uart.c **** {
146:uart.c **** // add to queue
147:uart.c **** uart0_tx_buffer[uart0_tx_insert_idx] = (uint8_t)ch;
148:uart.c **** uart0_tx_insert_idx = temp;
149:uart.c **** }
150:uart.c **** else
151:uart.c **** {
152:uart.c **** // set running flag and write to output register
153:uart.c **** uart0_tx_running = 1;
154:uart.c **** U0THR = (uint8_t)ch;
171 neh r2, [r6, #0]
172 013c FF2004E2 .loc 1 153 0
173 moveq r3, #1
174 0140 4C309F15 .loc 1 147 0
175 0144 B020D611 strneb r4, [r2, r3]
176 .loc 1 153 0
177 0148 0130A003 streq r3, [r1, #0]
178 .loc 1 154 0
179 014c 0340C217 streqb r2, [r7, #0]
180 .loc 1 148 0
181 0150 00308105 strneh r5, [r6, #0] @ movhi
182 .loc 1 157 0
183 0154 0020C705 bl disableIRQ
184 .loc 1 158 0
185 0158 B050C611 ldr r2, .L14+12
155:uart.c **** }
156:uart.c ****
157:uart.c **** cpsr = disableIRQ(); // disable global interrupts
186 #4] @ zero_extendqisi2
187 015c FEFFFFEB orr r3, r3, #2
158:uart.c **** U0IER |= UIER_ETBEI; // enable TX interrupts
188 trb r3, [r2, #4]
189 0160 24209FE5 .loc 1 159 0
190 0164 0430D2E5 bl restoreIRQ
191 0168 023083E3 .loc 1 166 0
192 016c 0430C2E5 and r3, r4, #255
159:uart.c **** restoreIRQ(cpsr); // restore global interrupts
193 :
194 0170 FEFFFFEB .L9:
160:uart.c **** #else
161:uart.c **** while (!(U0LSR & ULSR_THRE)) // wait for TX buffer to empty
162:uart.c **** continue; // also either WDOG() or swap()
163:uart.c ****
164:uart.c **** U0THR = (uint8_t)ch;
165:uart.c **** #endif
166:uart.c **** return (uint8_t)ch;
195 loc 1 167 0
196 0174 FF3004E2 mov r0, r3
197 ldmfd sp!, {r4, r5, r6, r7, pc}
198 .L15:
167:uart.c **** }
199 ign 2
200 0178 0300A0E1 .L14:
201 017c F080BDE8 .word uart0_tx_insert_idx
202 .word -2147483521
203 .word uart0_tx_extract_idx
204 .word -536821760
205 0180 00000000 .word uart0_tx_running
206 0184 7F000080 .word uart0_tx_buffer
207 0188 00000000 .LFE3:
209 0190 00000000 .align 2
210 0194 00000000 .global uart0Space
212 uart0Space:
213 .LFB4:
214 .loc 1 184 0
215 @ args = 0, pretend = 0, frame = 0
216 @ frame_needed = 0, uses_anonymous_args = 0
217 @ link register save eliminated.
168:uart.c ****
169:uart.c **** /******************************************************************************
170:uart.c **** *
171:uart.c **** * Function Name: uart0Space()
172:uart.c **** *
173:uart.c **** * Description:
174:uart.c **** * This function gets the available space in the transmit queue
175:uart.c **** *
176:uart.c **** * Calling Sequence:
177:uart.c **** * void
178:uart.c **** *
179:uart.c **** * Returns:
180:uart.c **** * available space in the transmit queue
181:uart.c **** *
182:uart.c **** *****************************************************************************/
183:uart.c **** uint16_t uart0Space(void)
184:uart.c **** {
218 0
219 ldr r3, .L20
220 ldrh r2, [r3, #0]
221 ldr r3, .L20+4
222 ldrh r3, [r3, #0]
185:uart.c **** #ifdef UART0_TX_INT_MODE
186:uart.c **** int space;
187:uart.c ****
188:uart.c **** if ((space = (uart0_tx_extract_idx - uart0_tx_insert_idx)) <= 0)
223 r0, r3, r2
224 0198 24309FE5 .LVL11:
225 019c B020D3E1 cmp r0, #0
226 01a0 20309FE5 .loc 1 189 0
227 01a4 B030D3E1 addle r0, r0, #128
228 01a8 020063E0 sub r0, r0, #1
229 .LVL12:
230 01ac 000050E3 mov r0, r0, asl #16
189:uart.c **** space += UART0_TX_BUFFER_SIZE;
231 195 0
232 01b0 800080D2 mov r0, r0, lsr #16
233 01b4 010040E2 .loc 1 184 0
234 @ lr needed for prologue
235 01b8 0008A0E1 .loc 1 195 0
190:uart.c ****
191:uart.c **** return (uint16_t)(space - 1);
192:uart.c **** #else
193:uart.c **** return USHRT_MAX;
194:uart.c **** #endif
195:uart.c **** }
236 r
237 01bc 2008A0E1 .L21:
238 .align 2
239 .L20:
240 .word uart0_tx_extract_idx
241 01c0 1EFF2FE1 .word uart0_tx_insert_idx
242 .LFE4:
244 .align 2
245 01c4 00000000 .global uart0Puts
247 uart0Puts:
248 .LFB5:
249 .loc 1 214 0
250 @ args = 0, pretend = 0, frame = 0
251 @ frame_needed = 0, uses_anonymous_args = 0
252 .LVL13:
253 stmfd sp!, {r4, lr}
196:uart.c ****
197:uart.c **** /******************************************************************************
198:uart.c **** *
199:uart.c **** * Function Name: uart0Puts()
200:uart.c **** *
201:uart.c **** * Description:
202:uart.c **** * This function writes a NULL terminated 'string' to the UART output
203:uart.c **** * queue, returning a pointer to the next character to be written.
204:uart.c **** *
205:uart.c **** * Calling Sequence:
206:uart.c **** * address of the string
207:uart.c **** *
208:uart.c **** * Returns:
209:uart.c **** * a pointer to the next character to be written
210:uart.c **** * (\0 if full string is written)
211:uart.c **** *
212:uart.c **** *****************************************************************************/
213:uart.c **** const char *uart0Puts(const char *string)
214:uart.c **** {
254 4 0
255 mov r4, r0
256 b .L23
257 .LVL14:
258 01cc 10402DE9 .L24:
259 .loc 1 218 0
260 add r4, r4, #1
261 01d0 0040A0E1 .LVL15:
262 01d4 000000EA .L23:
263 .loc 1 217 0
264 ldrb r3, [r4, #0] @ zero_extendqisi2
215:uart.c **** register char ch;
216:uart.c ****
217:uart.c **** while ((ch = *string) && (uart0Putch(ch) >= 0))
218:uart.c **** string++;
265 bs r0, r3, #0
266 01d8 014084E2 beq .L25
267 .LVL17:
268 bl uart0Putch
269 .LVL18:
270 01dc 0030D4E5 cmp r0, #0
271 bge .L24
272 01e0 000053E2 .LVL19:
273 01e4 0200000A .L25:
274 .loc 1 221 0
275 01e8 FEFFFFEB mov r0, r4
276 .LVL20:
277 01ec 000050E3 ldmfd sp!, {r4, pc}
278 01f0 F8FFFFAA .LFE5:
280 .align 2
219:uart.c ****
220:uart.c **** return string;
221:uart.c **** }
281 ite
283 uart0Write:
284 01f8 1080BDE8 .LFB6:
285 .loc 1 240 0
286 @ args = 0, pretend = 0, frame = 0
287 @ frame_needed = 0, uses_anonymous_args = 0
288 .LVL21:
289 stmfd sp!, {r4, r5, r6, lr}
290 .LCFI3:
291 .loc 1 240 0
222:uart.c ****
223:uart.c **** /******************************************************************************
224:uart.c **** *
225:uart.c **** * Function Name: uart0Write()
226:uart.c **** *
227:uart.c **** * Description:
228:uart.c **** * This function writes 'count' characters from 'buffer' to the UART
229:uart.c **** * output queue.
230:uart.c **** *
231:uart.c **** * Calling Sequence:
232:uart.c **** *
233:uart.c **** *
234:uart.c **** * Returns:
235:uart.c **** * 0 on success, -1 if insufficient room, -2 on error
236:uart.c **** * NOTE: if insufficient room, no characters are written.
237:uart.c **** *
238:uart.c **** *****************************************************************************/
239:uart.c **** int uart0Write(const char *buffer, uint16_t count)
240:uart.c **** {
292 , asl #16
293 .LVL22:
294 mov r6, r1, lsr #16
295 .LVL23:
296 01fc 70402DE9 mov r5, r0
297 .loc 1 242 0
298 bl uart0Space
299 0200 0118A0E1 .LVL24:
300 cmp r6, r0
301 0204 2168A0E1 mvnhi r0, #0
302 ldmhifd sp!, {r4, r5, r6, pc}
303 0208 0050A0E1 b .L29
241:uart.c **** #ifdef UART0_TX_INT_MODE
242:uart.c **** if (count > uart0Space())
304 :
305 020c FEFFFFEB .loc 1 245 0
306 mov r0, #0
307 0210 000056E1 ldmfd sp!, {r4, r5, r6, pc}
308 0214 0000E083 .LVL26:
309 0218 7080BD88 .L29:
310 021c 010000EA .loc 1 242 0
311 mov r4, r6
312 .LVL27:
243:uart.c **** return -1;
244:uart.c **** #endif
245:uart.c **** while (count && (uart0Putch(*buffer++) >= 0))
313 L33:
314 0220 0000A0E3 .loc 1 246 0
315 0224 7080BDE8 sub r3, r4, #1
316 mov r3, r3, asl #16
317 mov r4, r3, lsr #16
318 .L32:
319 0228 0640A0E1 .loc 1 245 0
320 cmp r4, #0
321 022c 020000EA beq .L38
322 ldrb r0, [r5], #1 @ zero_extendqisi2
246:uart.c **** count--;
323 utch
324 0230 013044E2 cmp r0, #0
325 0234 0338A0E1 bge .L33
326 0238 2348A0E1 mvn r0, #1
327 .loc 1 249 0
328 ldmfd sp!, {r4, r5, r6, pc}
329 023c 000054E3 .LFE6:
331 0244 0100D5E4 .align 2
332 0248 FEFFFFEB .global uart0TxEmpty
334 0250 F6FFFFAA uart0TxEmpty:
335 0254 0100E0E3 .LFB7:
247:uart.c ****
248:uart.c **** return (count ? -2 : 0);
249:uart.c **** }
336
337 0258 7080BDE8 @ args = 0, pretend = 0, frame = 0
338 @ frame_needed = 0, uses_anonymous_args = 0
339 @ link register save eliminated.
340 .LVL28:
341 .loc 1 269 0
342 ldr r3, .L41
343 ldrb r0, [r3, #20] @ zero_extendqisi2
344 and r0, r0, #96
250:uart.c ****
251:uart.c **** /******************************************************************************
252:uart.c **** *
253:uart.c **** * Function Name: uart0TxEmpty()
254:uart.c **** *
255:uart.c **** * Description:
256:uart.c **** * This function returns the status of the UART transmit data
257:uart.c **** * registers.
258:uart.c **** *
259:uart.c **** * Calling Sequence:
260:uart.c **** * void
261:uart.c **** *
262:uart.c **** * Returns:
263:uart.c **** * FALSE - either the tx holding or shift register is not empty
264:uart.c **** * !FALSE - if both the tx holding & shift registers are empty
265:uart.c **** *
266:uart.c **** *****************************************************************************/
267:uart.c **** int uart0TxEmpty(void)
268:uart.c **** {
345 270 0
346 cmp r0, #96
347 movne r0, #0
348 moveq r0, #1
349 .loc 1 268 0
269:uart.c **** return (U0LSR & (ULSR_THRE | ULSR_TEMT)) == (ULSR_THRE | ULSR_TEMT);
350 needed for prologue
351 025c 14309FE5 .loc 1 270 0
352 0260 1400D3E5 bx lr
353 0264 600000E2 .L42:
270:uart.c **** }
354 ign 2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -