📄 uart.lst
字号:
309 0104 8233 cpi r24,lo8(50)
310 0106 21F4 brne .L14
97:uart.c **** {
98:uart.c **** AvrXWaitSemaphore(&tx_rdy);
312 .LM35:
313 0108 80E0 ldi r24,lo8(tx_rdy)
314 010a 90E0 ldi r25,hi8(tx_rdy)
315 010c 0E94 0000 call AvrXWaitSemaphore
316 .L14:
99:uart.c **** }
100:uart.c **** BeginCritical();
318 .LM36:
319 /* #APP */
320 0110 F894 cli
321
101:uart.c **** if (tx_count || bit_is_clear(UCSRA, UDRE))
323 .LM37:
324 /* #NOAPP */
325 0112 8091 0000 lds r24,tx_count
326 0116 8823 tst r24
327 0118 11F4 brne .L16
328 011a 5D99 sbic 43-0x20,5
329 011c 1CC0 rjmp .L15
330 .L16:
102:uart.c **** {
103:uart.c **** tx_buffer[tx_wr] = c;
332 .LM38:
333 011e 8091 0000 lds r24,tx_wr
334 0122 E82F mov r30,r24
335 0124 FF27 clr r31
336 0126 E050 subi r30,lo8(-(tx_buffer))
337 0128 F040 sbci r31,hi8(-(tx_buffer))
338 012a C083 st Z,r28
104:uart.c **** if (++tx_wr == TX_BUFFER_SIZE)
340 .LM39:
341 012c 8F5F subi r24,lo8(-(1))
342 012e 8093 0000 sts tx_wr,r24
343 0132 8233 cpi r24,lo8(50)
344 0134 11F4 brne .L17
105:uart.c **** {
106:uart.c **** tx_wr = 0;
346 .LM40:
347 0136 1092 0000 sts tx_wr,__zero_reg__
348 .L17:
107:uart.c **** }
108:uart.c **** if (++tx_count == TX_BUFFER_SIZE)
350 .LM41:
351 013a 8091 0000 lds r24,tx_count
352 013e 8F5F subi r24,lo8(-(1))
353 0140 8093 0000 sts tx_count,r24
354 0144 8091 0000 lds r24,tx_count
355 0148 8233 cpi r24,lo8(50)
356 014a 31F4 brne .L19
109:uart.c **** {
110:uart.c **** AvrXResetSemaphore(&tx_rdy);
358 .LM42:
359 014c 80E0 ldi r24,lo8(tx_rdy)
360 014e 90E0 ldi r25,hi8(tx_rdy)
361 0150 0E94 0000 call AvrXResetSemaphore
362 0154 01C0 rjmp .L19
363 .L15:
111:uart.c **** }
112:uart.c **** }
113:uart.c **** else
114:uart.c **** {
115:uart.c **** UDR = c;
365 .LM43:
366 0156 CCB9 out 44-0x20,r28
367 .L19:
116:uart.c **** }
117:uart.c **** EndCritical();
369 .LM44:
370 /* #APP */
371 0158 7894 sei
372
118:uart.c ****
119:uart.c **** return 0;
120:uart.c **** }
374 .LM45:
375 /* #NOAPP */
376 015a 80E0 ldi r24,lo8(0)
377 015c 90E0 ldi r25,hi8(0)
378 /* epilogue: frame size=0 */
379 015e CF91 pop r28
380 0160 0895 ret
381 /* epilogue end (size=2) */
382 /* function UartPutc size 57 (54) */
384 .Lscope3:
388 .global UartIOCtl
390 UartIOCtl:
121:uart.c ****
122:uart.c **** void
123:uart.c **** UartInit(void)
124:uart.c **** {
125:uart.c **** uint32_t uart_param;
126:uart.c ****
127:uart.c **** AvrXResetSemaphore(&rx_rdy);
128:uart.c **** AvrXResetSemaphore(&tx_rdy);
129:uart.c ****
130:uart.c **** uart_param = UART_DEFAULT_DATABITS;
131:uart.c **** UartIOCtl(UART_SETDATABITS, &uart_param);
132:uart.c **** uart_param = UART_DEFAULT_PARITY;
133:uart.c **** UartIOCtl(UART_SETPARITY, &uart_param);
134:uart.c **** uart_param = UART__DEFAULT_STOPBITS;
135:uart.c **** UartIOCtl(UART_SETSTOPBITS, &uart_param);
136:uart.c **** uart_param = UART_DEFAULT_BAUD;
137:uart.c **** UartIOCtl(UART_SETSPEED, &uart_param);
138:uart.c ****
139:uart.c **** UCSRB = BV(RXCIE) | BV(TXCIE) | BV(RXEN) | BV(TXEN);
140:uart.c ****
141:uart.c **** fdevopen(UartPutc, UartGetc, 0);
142:uart.c **** }
143:uart.c ****
144:uart.c **** void
145:uart.c **** UartIOCtl(uint16_t req, void *conf)
146:uart.c **** {
392 .LM46:
393 /* prologue: frame size=0 */
394 0162 CF93 push r28
395 0164 DF93 push r29
396 /* prologue end (size=2) */
397 0166 EB01 movw r28,r22
147:uart.c **** uint32_t *lvp = (uint32_t *)conf;
148:uart.c **** uint32_t lv = *lvp;
399 .LM47:
400 0168 2881 ld r18,Y
401 016a 3981 ldd r19,Y+1
402 016c 4A81 ldd r20,Y+2
403 016e 5B81 ldd r21,Y+3
149:uart.c **** uint8_t bv = (uint8_t)lv;
405 .LM48:
406 0170 622F mov r22,r18
150:uart.c **** uint16_t sv;
151:uart.c ****
152:uart.c **** switch (req)
408 .LM49:
409 0172 71E0 ldi r23,hi8(260)
410 0174 8430 cpi r24,lo8(260)
411 0176 9707 cpc r25,r23
412 0178 09F4 brne .+2
413 017a 6BC0 rjmp .L28
415 .LM50:
416 017c 71E0 ldi r23,hi8(261)
417 017e 8530 cpi r24,lo8(261)
418 0180 9707 cpc r25,r23
419 0182 68F4 brsh .L37
420 0184 71E0 ldi r23,hi8(258)
421 0186 8230 cpi r24,lo8(258)
422 0188 9707 cpc r25,r23
423 018a D1F1 breq .L23
424 018c 71E0 ldi r23,hi8(259)
425 018e 8330 cpi r24,lo8(259)
426 0190 9707 cpc r25,r23
427 0192 08F0 brlo .+2
428 0194 53C0 rjmp .L26
429 0196 8150 subi r24,lo8(257)
430 0198 9140 sbci r25,hi8(257)
431 019a A9F0 breq .L22
432 019c 8DC0 rjmp .L20
433 .L37:
434 019e 71E0 ldi r23,hi8(262)
435 01a0 8630 cpi r24,lo8(262)
436 01a2 9707 cpc r25,r23
437 01a4 09F4 brne .+2
438 01a6 68C0 rjmp .L32
439 01a8 21E0 ldi r18,hi8(262)
440 01aa 8630 cpi r24,lo8(262)
441 01ac 9207 cpc r25,r18
442 01ae 08F4 brsh .+2
443 01b0 58C0 rjmp .L29
444 01b2 71E0 ldi r23,hi8(263)
445 01b4 8730 cpi r24,lo8(263)
446 01b6 9707 cpc r25,r23
447 01b8 09F4 brne .+2
448 01ba 60C0 rjmp .L34
449 01bc 8850 subi r24,lo8(264)
450 01be 9140 sbci r25,hi8(264)
451 01c0 09F4 brne .+2
452 01c2 68C0 rjmp .L36
453 01c4 79C0 rjmp .L20
454 .L22:
153:uart.c **** {
154:uart.c **** case UART_SETSPEED:
155:uart.c **** {
156:uart.c **** sv = (uint16_t) ((((2UL * CPUCLK) / (lv * 16UL)) + 1UL) / 2UL) - 1;
456 .LM51:
457 01c6 F4E0 ldi r31,4
458 01c8 220F 1: lsl r18
459 01ca 331F rol r19
460 01cc 441F rol r20
461 01ce 551F rol r21
462 01d0 FA95 dec r31
463 01d2 D1F7 brne 1b
464 01d4 60E0 ldi r22,lo8(14745600)
465 01d6 70E0 ldi r23,hi8(14745600)
466 01d8 81EE ldi r24,hlo8(14745600)
467 01da 90E0 ldi r25,hhi8(14745600)
468 01dc 0E94 0000 call __udivmodsi4
469 01e0 DA01 movw r26,r20
470 01e2 C901 movw r24,r18
471 01e4 0196 adiw r24,1
472 01e6 A11D adc r26,__zero_reg__
473 01e8 B11D adc r27,__zero_reg__
474 01ea B695 lsr r27
475 01ec A795 ror r26
476 01ee 9795 ror r25
477 01f0 8795 ror r24
478 01f2 9C01 movw r18,r24
479 01f4 2150 subi r18,lo8(-(-1))
480 01f6 3040 sbci r19,hi8(-(-1))
157:uart.c **** UBRRL = (uint8_t) sv;
482 .LM52:
483 01f8 29B9 out 41-0x20,r18
158:uart.c **** UBRRH = (uint8_t) (sv >> 8);
485 .LM53:
486 01fa 832F mov r24,r19
487 01fc 9927 clr r25
488 01fe 48C0 rjmp .L38
489 .L23:
159:uart.c **** }
160:uart.c **** break;
161:uart.c ****
162:uart.c **** case UART_GETSPEED:
163:uart.c **** {
164:uart.c **** sv = ((uint16_t)UBRRH << 8) || UBRRL;
491 .LM54:
492 0200 20E0 ldi r18,lo8(0)
493 0202 30E0 ldi r19,hi8(0)
494 0204 80B5 in r24,64-0x20
495 0206 8823 tst r24
496 0208 19F4 brne .L25
497 020a 89B1 in r24,41-0x20
498 020c 8823 tst r24
499 020e 11F0 breq .L24
500 .L25:
501 0210 21E0 ldi r18,lo8(1)
502 0212 30E0 ldi r19,hi8(1)
503 .L24:
165:uart.c **** *lvp = CPUCLK / (16UL * (uint32_t)(sv + 1));
505 .LM55:
506 0214 2F5F subi r18,lo8(-(1))
507 0216 3F4F sbci r19,hi8(-(1))
508 0218 4427 clr r20
509 021a 5527 clr r21
510 021c 64E0 ldi r22,4
511 021e 220F 1: lsl r18
512 0220 331F rol r19
513 0222 441F rol r20
514 0224 551F rol r21
515 0226 6A95 dec r22
516 0228 D1F7 brne 1b
517 022a 60E0 ldi r22,lo8(7372800)
518 022c 70E8 ldi r23,hi8(7372800)
519 022e 80E7 ldi r24,hlo8(7372800)
520 0230 90E0 ldi r25,hhi8(7372800)
521 0232 0E94 0000 call __udivmodsi4
522 0236 DA01 movw r26,r20
523 0238 C901 movw r24,r18
524 023a 3AC0 rjmp .L40
525 .L26:
166:uart.c **** }
167:uart.c **** break;
168:uart.c ****
169:uart.c **** case UART_SETDATABITS:
170:uart.c **** {
171:uart.c **** if (bv >= 5 && bv <= 8)
527 .LM56:
528 023c 922F mov r25,r18
529 023e 9550 subi r25,lo8(-(-5))
530 0240 9430 cpi r25,lo8(4)
531 0242 D0F5 brsh .L20
172:uart.c **** {
173:uart.c **** bv = (bv - 5) << 1;
533 .LM57:
534 0244 990F lsl r25
174:uart.c **** UCSRC = (UCSRC & 0xF9) | bv;
536 .LM58:
537 0246 80B5 in r24,64-0x20
538 0248 897F andi r24,lo8(-7)
539 024a 892B or r24,r25
540 024c 80BD out 64-0x20,r24
175:uart.c **** UCSRB &= 0xFB;
542 .LM59:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -