📄 uartmain.lst
字号:
uartmain.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 000009ca 00000000 00000000 00000094 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 00000096 00800060 000009ca 00000a5e 2**0
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000058 008000f6 008000f6 00000af4 2**0
ALLOC
3 .noinit 00000000 0080014e 0080014e 00000af4 2**0
CONTENTS
4 .eeprom 00000000 00810000 00810000 00000af4 2**0
CONTENTS
5 .stab 0000036c 00000000 00000000 00000af4 2**2
CONTENTS, READONLY, DEBUGGING
6 .stabstr 00000084 00000000 00000000 00000e60 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_aranges 00000028 00000000 00000000 00000ee4 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_pubnames 0000006a 00000000 00000000 00000f0c 2**0
CONTENTS, READONLY, DEBUGGING
9 .debug_info 0000039a 00000000 00000000 00000f76 2**0
CONTENTS, READONLY, DEBUGGING
10 .debug_abbrev 00000212 00000000 00000000 00001310 2**0
CONTENTS, READONLY, DEBUGGING
11 .debug_line 00000328 00000000 00000000 00001522 2**0
CONTENTS, READONLY, DEBUGGING
12 .debug_str 00000109 00000000 00000000 0000184a 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
00000000 <__vectors>:
0: 0c 94 2a 00 jmp 0x54 <__ctors_end>
4: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
8: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
c: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
10: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
14: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
18: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
1c: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
20: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
24: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
28: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
2c: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
30: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
34: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
38: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
3c: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
40: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
44: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
48: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
4c: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
50: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
00000054 <__ctors_end>:
54: 11 24 eor r1, r1
56: 1f be out 0x3f, r1 ; 63
58: cf e5 ldi r28, 0x5F ; 95
5a: d8 e0 ldi r29, 0x08 ; 8
5c: de bf out 0x3e, r29 ; 62
5e: cd bf out 0x3d, r28 ; 61
00000060 <__do_copy_data>:
60: 10 e0 ldi r17, 0x00 ; 0
62: a0 e6 ldi r26, 0x60 ; 96
64: b0 e0 ldi r27, 0x00 ; 0
66: ea ec ldi r30, 0xCA ; 202
68: f9 e0 ldi r31, 0x09 ; 9
6a: 02 c0 rjmp .+4 ; 0x70 <.do_copy_data_start>
0000006c <.do_copy_data_loop>:
6c: 05 90 lpm r0, Z+
6e: 0d 92 st X+, r0
00000070 <.do_copy_data_start>:
70: a6 3f cpi r26, 0xF6 ; 246
72: b1 07 cpc r27, r17
74: d9 f7 brne .-10 ; 0x6c <.do_copy_data_loop>
00000076 <__do_clear_bss>:
76: 11 e0 ldi r17, 0x01 ; 1
78: a6 ef ldi r26, 0xF6 ; 246
7a: b0 e0 ldi r27, 0x00 ; 0
7c: 01 c0 rjmp .+2 ; 0x80 <.do_clear_bss_start>
0000007e <.do_clear_bss_loop>:
7e: 1d 92 st X+, r1
00000080 <.do_clear_bss_start>:
80: ae 34 cpi r26, 0x4E ; 78
82: b1 07 cpc r27, r17
84: e1 f7 brne .-8 ; 0x7e <.do_clear_bss_loop>
86: 0c 94 47 00 jmp 0x8e <main>
0000008a <__bad_interrupt>:
8a: 0c 94 00 00 jmp 0x0 <__vectors>
0000008e <main>:
FILE uart_str = FDEV_SETUP_STREAM(uart_putchar, uart_getchar, _FDEV_SETUP_RW);
int main(void)
{
8e: cf e5 ldi r28, 0x5F ; 95
90: d8 e0 ldi r29, 0x08 ; 8
92: de bf out 0x3e, r29 ; 62
94: cd bf out 0x3d, r28 ; 61
uart_init();
96: 0e 94 60 00 call 0xc0 <uart_init>
stdout = stdin = &uart_str;
9a: 80 e6 ldi r24, 0x60 ; 96
9c: 90 e0 ldi r25, 0x00 ; 0
9e: 90 93 49 01 sts 0x0149, r25
a2: 80 93 48 01 sts 0x0148, r24
a6: 90 93 4b 01 sts 0x014B, r25
aa: 80 93 4a 01 sts 0x014A, r24
while (1)
{
printf("$GPGGA,151029,2335.4756,N,05810.1986,E,0,00,,,M,,M,,*54\r\n");
ae: 8e e6 ldi r24, 0x6E ; 110
b0: 90 e0 ldi r25, 0x00 ; 0
b2: 0e 94 84 01 call 0x308 <puts>
printf("$GPGSV,3,3,12,12,10,038,00,13,00,291,00,14,66,050,00,15,00,132,00*7F\r\n");
b6: 87 ea ldi r24, 0xA7 ; 167
b8: 90 e0 ldi r25, 0x00 ; 0
ba: 0e 94 84 01 call 0x308 <puts>
be: f7 cf rjmp .-18 ; 0xae <main+0x20>
000000c0 <uart_init>:
#if F_CPU < 2000000UL && defined(U2X)
UCSRA = _BV(U2X); /* improve baud rate error by using 2x clk */
UBRRL = (F_CPU / (8UL * UART_BAUD)) - 1;
#else
UBRRL = (F_CPU / (16UL * UART_BAUD)) - 1;
c0: 81 e8 ldi r24, 0x81 ; 129
c2: 89 b9 out 0x09, r24 ; 9
#endif
UCSRB = _BV(TXEN) | _BV(RXEN); /* tx/rx enable */
c4: 88 e1 ldi r24, 0x18 ; 24
c6: 8a b9 out 0x0a, r24 ; 10
c8: 08 95 ret
000000ca <uart_putchar>:
}
/*
* Send character c down the UART Tx, wait until tx holding register
* is empty.
*/
int
uart_putchar(char c, FILE *stream)
{
ca: cf 93 push r28
cc: c8 2f mov r28, r24
if (c == '\a')
ce: 87 30 cpi r24, 0x07 ; 7
d0: 49 f4 brne .+18 ; 0xe4 <uart_putchar+0x1a>
{
fputs("*ring*\n", stderr);
d2: 60 91 4c 01 lds r22, 0x014C
d6: 70 91 4d 01 lds r23, 0x014D
da: 8d ee ldi r24, 0xED ; 237
dc: 90 e0 ldi r25, 0x00 ; 0
de: 0e 94 5c 01 call 0x2b8 <fputs>
return 0;
e2: 08 c0 rjmp .+16 ; 0xf4 <uart_putchar+0x2a>
}
if (c == '\n')
e4: 8a 30 cpi r24, 0x0A ; 10
e6: 19 f4 brne .+6 ; 0xee <uart_putchar+0x24>
uart_putchar('\r', stream);
e8: 8d e0 ldi r24, 0x0D ; 13
ea: 0e 94 65 00 call 0xca <uart_putchar>
loop_until_bit_is_set(UCSRA, UDRE);
ee: 5d 9b sbis 0x0b, 5 ; 11
f0: fe cf rjmp .-4 ; 0xee <uart_putchar+0x24>
UDR = c;
f2: cc b9 out 0x0c, r28 ; 12
return 0;
}
f4: 80 e0 ldi r24, 0x00 ; 0
f6: 90 e0 ldi r25, 0x00 ; 0
f8: cf 91 pop r28
fa: 08 95 ret
000000fc <uart_getchar>:
/*
* Receive a character from the UART Rx.
*
* This features a simple line-editor that allows to delete and
* re-edit the characters entered, until either CR or NL is entered.
* Printable characters entered will be echoed using uart_putchar().
*
* Editing characters:
*
* . \b (BS) or \177 (DEL) delete the previous character
* . ^u kills the entire input buffer
* . ^w deletes the previous word
* . ^r sends a CR, and then reprints the buffer
* . \t will be replaced by a single space
*
* All other control characters will be ignored.
*
* The internal line buffer is RX_BUFSIZE (80) characters long, which
* includes the terminating \n (but no terminating \0). If the buffer
* is full (i. e., at RX_BUFSIZE-1 characters in order to keep space for
* the trailing \n), any further input attempts will send a \a to
* uart_putchar() (BEL character), although line editing is still
* allowed.
*
* Input errors while talking to the UART will cause an immediate
* return of -1 (error indication). Notably, this will be caused by a
* framing error (e. g. serial line "break" condition), by an input
* overrun, and by a parity error (if parity was enabled and automatic
* parity recognition is supported by hardware).
*
* Successive calls to uart_getchar() will be satisfied from the
* internal buffer until that buffer is emptied again.
*/
int
uart_getchar(FILE *stream)
{
fc: cf 92 push r12
fe: df 92 push r13
100: ef 92 push r14
102: ff 92 push r15
104: 0f 93 push r16
106: 1f 93 push r17
108: cf 93 push r28
10a: df 93 push r29
10c: 7c 01 movw r14, r24
uint8_t c;
char *cp, *cp2;
static char b[RX_BUFSIZE];
static char *rxp;
if (rxp == 0)
10e: 80 91 46 01 lds r24, 0x0146
112: 90 91 47 01 lds r25, 0x0147
116: 89 2b or r24, r25
118: 09 f0 breq .+2 ; 0x11c <uart_getchar+0x20>
11a: b5 c0 rjmp .+362 ; 0x286 <uart_getchar+0x18a>
for (cp = b;;)
11c: 06 ef ldi r16, 0xF6 ; 246
11e: 10 e0 ldi r17, 0x00 ; 0
120: 68 01 movw r12, r16
{
loop_until_bit_is_set(UCSRA, RXC);
122: 5f 9b sbis 0x0b, 7 ; 11
124: fe cf rjmp .-4 ; 0x122 <uart_getchar+0x26>
if (UCSRA & _BV(FE))
126: 5c 9b sbis 0x0b, 4 ; 11
128: 03 c0 rjmp .+6 ; 0x130 <uart_getchar+0x34>
return _FDEV_EOF;
12a: 8e ef ldi r24, 0xFE ; 254
12c: 9f ef ldi r25, 0xFF ; 255
12e: bb c0 rjmp .+374 ; 0x2a6 <uart_getchar+0x1aa>
if (UCSRA & _BV(DOR))
130: 5b 99 sbic 0x0b, 3 ; 11
132: 48 c0 rjmp .+144 ; 0x1c4 <uart_getchar+0xc8>
return _FDEV_ERR;
c = UDR;
134: 9c b1 in r25, 0x0c ; 12
/* behaviour similar to Unix stty ICRNL */
if (c == '\r')
136: 9d 30 cpi r25, 0x0D ; 13
138: 11 f4 brne .+4 ; 0x13e <uart_getchar+0x42>
c = '\n';
13a: 9a e0 ldi r25, 0x0A ; 10
13c: 02 c0 rjmp .+4 ; 0x142 <uart_getchar+0x46>
if (c == '\n')
13e: 9a 30 cpi r25, 0x0A ; 10
140: 69 f4 brne .+26 ; 0x15c <uart_getchar+0x60>
{
*cp = c;
142: f8 01 movw r30, r16
144: 90 83 st Z, r25
uart_putchar(c, stream);
146: b7 01 movw r22, r14
148: 89 2f mov r24, r25
14a: 0e 94 65 00 call 0xca <uart_putchar>
rxp = b;
14e: 86 ef ldi r24, 0xF6 ; 246
150: 90 e0 ldi r25, 0x00 ; 0
152: 90 93 47 01 sts 0x0147, r25
156: 80 93 46 01 sts 0x0146, r24
break;
15a: 95 c0 rjmp .+298 ; 0x286 <uart_getchar+0x18a>
}
else if (c == '\t')
15c: 99 30 cpi r25, 0x09 ; 9
15e: 09 f4 brne .+2 ; 0x162 <uart_getchar+0x66>
c = ' ';
160: 90 e2 ldi r25, 0x20 ; 32
if ((c >= (uint8_t)' ' && c <= (uint8_t)'\x7e') ||
162: 89 2f mov r24, r25
164: 80 52 subi r24, 0x20 ; 32
166: 8f 35 cpi r24, 0x5F ; 95
168: 10 f0 brcs .+4 ; 0x16e <uart_getchar+0x72>
16a: 90 3a cpi r25, 0xA0 ; 160
16c: 78 f0 brcs .+30 ; 0x18c <uart_getchar+0x90>
c >= (uint8_t)'\xa0')
{
if (cp == b + RX_BUFSIZE - 1)
16e: f1 e0 ldi r31, 0x01 ; 1
170: 05 34 cpi r16, 0x45 ; 69
172: 1f 07 cpc r17, r31
174: 19 f4 brne .+6 ; 0x17c <uart_getchar+0x80>
uart_putchar('\a', stream);
176: b7 01 movw r22, r14
178: 87 e0 ldi r24, 0x07 ; 7
17a: 05 c0 rjmp .+10 ; 0x186 <uart_getchar+0x8a>
else
{
*cp++ = c;
17c: f8 01 movw r30, r16
17e: 91 93 st Z+, r25
180: 8f 01 movw r16, r30
uart_putchar(c, stream);
182: b7 01 movw r22, r14
184: 89 2f mov r24, r25
186: 0e 94 65 00 call 0xca <uart_putchar>
}
continue;
18a: cb cf rjmp .-106 ; 0x122 <uart_getchar+0x26>
}
switch (c)
18c: 89 2f mov r24, r25
18e: 99 27 eor r25, r25
190: 82 31 cpi r24, 0x12 ; 18
192: 91 05 cpc r25, r1
194: 79 f1 breq .+94 ; 0x1f4 <uart_getchar+0xf8>
196: 83 31 cpi r24, 0x13 ; 19
198: 91 05 cpc r25, r1
19a: 34 f4 brge .+12 ; 0x1a8 <uart_getchar+0xac>
19c: 83 30 cpi r24, 0x03 ; 3
19e: 91 05 cpc r25, r1
1a0: 89 f0 breq .+34 ; 0x1c4 <uart_getchar+0xc8>
1a2: 08 97 sbiw r24, 0x08 ; 8
1a4: 91 f0 breq .+36 ; 0x1ca <uart_getchar+0xce>
1a6: bd cf rjmp .-134 ; 0x122 <uart_getchar+0x26>
1a8: 87 31 cpi r24, 0x17 ; 23
1aa: 91 05 cpc r25, r1
1ac: 09 f4 brne .+2 ; 0x1b0 <uart_getchar+0xb4>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -