📄 uart.lst
字号:
1 .file "uart.c"
2 .arch atmega16
3 __SREG__ = 0x3f
4 __SP_H__ = 0x3e
5 __SP_L__ = 0x3d
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
11 .text
12 .Ltext0:
81 .global __vector_11
83 __vector_11:
1:uart.c ****
2:uart.c **** #include <stdio.h>
3:uart.c ****
4:uart.c **** #include <avr/io.h>
5:uart.c **** #include <avr/interrupt.h>
6:uart.c **** #include <avr/signal.h>
7:uart.c **** #include <avrx/avrx.h>
8:uart.c ****
9:uart.c **** #include "hardware.h"
10:uart.c **** #include "uart.h"
11:uart.c ****
12:uart.c **** // USART Receiver buffer
13:uart.c **** uint8_t rx_buffer[RX_BUFFER_SIZE];
14:uart.c **** uint8_t volatile rx_wr, rx_count;
15:uart.c **** uint8_t rx_rd;
16:uart.c **** Mutex rx_rdy;
17:uart.c **** // This flag is set on USART Receiver buffer overflow
18:uart.c **** uint8_t rx_buffer_overflow;
19:uart.c ****
20:uart.c **** // USART Transmitter buffer
21:uart.c **** uint8_t tx_buffer[TX_BUFFER_SIZE];
22:uart.c **** uint8_t tx_wr;
23:uart.c **** uint8_t volatile tx_rd, tx_count;
24:uart.c **** Mutex tx_rdy;
25:uart.c ****
26:uart.c **** // USART Receiver interrupt service routine
27:uart.c **** AVRX_SIGINT(SIG_UART_RECV)
28:uart.c **** {
85 .LM1:
86 /* prologue: frame size=0 */
87 /* prologue: naked */
88 /* prologue end (size=0) */
29:uart.c **** uint8_t status, data;
30:uart.c ****
31:uart.c **** IntProlog();
90 .LM2:
91 0000 0E94 0000 call IntProlog
32:uart.c **** status = UCSRA;
93 .LM3:
94 0004 8BB1 in r24,43-0x20
33:uart.c **** data = UDR;
96 .LM4:
97 0006 2CB1 in r18,44-0x20
34:uart.c **** if ((status & (_BV(FE) | _BV(PE) | _BV(DOR))) == 0)
99 .LM5:
100 0008 9927 clr r25
101 000a 8C71 andi r24,lo8(28)
102 000c 9070 andi r25,hi8(28)
103 000e 892B or r24,r25
104 0010 29F5 brne .L2
35:uart.c **** {
36:uart.c **** rx_buffer[rx_wr] = data;
106 .LM6:
107 0012 8091 0000 lds r24,rx_wr
108 0016 E82F mov r30,r24
109 0018 FF27 clr r31
110 001a E050 subi r30,lo8(-(rx_buffer))
111 001c F040 sbci r31,hi8(-(rx_buffer))
112 001e 2083 st Z,r18
37:uart.c ****
38:uart.c **** if (++rx_wr == RX_BUFFER_SIZE)
114 .LM7:
115 0020 8091 0000 lds r24,rx_wr
116 0024 8F5F subi r24,lo8(-(1))
117 0026 8093 0000 sts rx_wr,r24
118 002a 8091 0000 lds r24,rx_wr
119 002e 8233 cpi r24,lo8(50)
120 0030 11F4 brne .L3
39:uart.c **** {
40:uart.c **** rx_wr = 0;
122 .LM8:
123 0032 1092 0000 sts rx_wr,__zero_reg__
124 .L3:
41:uart.c **** }
42:uart.c **** if (++rx_count == RX_BUFFER_SIZE)
126 .LM9:
127 0036 8091 0000 lds r24,rx_count
128 003a 8F5F subi r24,lo8(-(1))
129 003c 8093 0000 sts rx_count,r24
130 0040 8091 0000 lds r24,rx_count
131 0044 8233 cpi r24,lo8(50)
132 0046 31F4 brne .L4
43:uart.c **** {
44:uart.c **** rx_count = 0;
134 .LM10:
135 0048 1092 0000 sts rx_count,__zero_reg__
45:uart.c **** rx_buffer_overflow = 1;
137 .LM11:
138 004c 81E0 ldi r24,lo8(1)
139 004e 8093 0000 sts rx_buffer_overflow,r24
140 0052 04C0 rjmp .L2
141 .L4:
46:uart.c **** }
47:uart.c **** else
48:uart.c **** {
49:uart.c **** AvrXIntSetSemaphore(&rx_rdy);
143 .LM12:
144 0054 80E0 ldi r24,lo8(rx_rdy)
145 0056 90E0 ldi r25,hi8(rx_rdy)
146 0058 0E94 0000 call AvrXIntSetSemaphore
147 .L2:
50:uart.c **** }
51:uart.c **** }
52:uart.c **** Epilog();
149 .LM13:
150 005c 0E94 0000 call Epilog
151 /* epilogue: frame size=0 */
152 /* epilogue: naked */
153 /* epilogue end (size=0) */
154 /* function __vector_11 size 48 (48) */
160 .Lscope0:
162 .global __vector_13
164 __vector_13:
53:uart.c **** }
54:uart.c ****
55:uart.c **** // USART Transmitter interrupt service routine
56:uart.c **** AVRX_SIGINT(SIG_UART_TRANS)
57:uart.c **** {
166 .LM14:
167 /* prologue: frame size=0 */
168 /* prologue: naked */
169 /* prologue end (size=0) */
58:uart.c **** IntProlog();
171 .LM15:
172 0060 0E94 0000 call IntProlog
59:uart.c **** if (tx_count)
174 .LM16:
175 0064 8091 0000 lds r24,tx_count
176 0068 8823 tst r24
177 006a E1F0 breq .L7
60:uart.c **** {
61:uart.c **** UDR = tx_buffer[tx_rd];
179 .LM17:
180 006c 8091 0000 lds r24,tx_rd
181 0070 E82F mov r30,r24
182 0072 FF27 clr r31
183 0074 E050 subi r30,lo8(-(tx_buffer))
184 0076 F040 sbci r31,hi8(-(tx_buffer))
185 0078 8081 ld r24,Z
186 007a 8CB9 out 44-0x20,r24
62:uart.c **** if (++tx_rd == TX_BUFFER_SIZE) tx_rd = 0;
188 .LM18:
189 007c 8091 0000 lds r24,tx_rd
190 0080 8F5F subi r24,lo8(-(1))
191 0082 8093 0000 sts tx_rd,r24
192 0086 8091 0000 lds r24,tx_rd
193 008a 8233 cpi r24,lo8(50)
194 008c 11F4 brne .L8
195 008e 1092 0000 sts tx_rd,__zero_reg__
196 .L8:
63:uart.c **** --tx_count;
198 .LM19:
199 0092 8091 0000 lds r24,tx_count
200 0096 8150 subi r24,lo8(-(-1))
201 0098 8093 0000 sts tx_count,r24
64:uart.c **** AvrXIntSetSemaphore(&tx_rdy);
203 .LM20:
204 009c 80E0 ldi r24,lo8(tx_rdy)
205 009e 90E0 ldi r25,hi8(tx_rdy)
206 00a0 0E94 0000 call AvrXIntSetSemaphore
207 .L7:
65:uart.c **** }
66:uart.c **** Epilog();
209 .LM21:
210 00a4 0E94 0000 call Epilog
211 /* epilogue: frame size=0 */
212 /* epilogue: naked */
213 /* epilogue end (size=0) */
214 /* function __vector_13 size 36 (36) */
216 .Lscope1:
218 .global UartGetc
220 UartGetc:
67:uart.c **** }
68:uart.c ****
69:uart.c **** int
70:uart.c **** UartGetc(void)
71:uart.c **** {
222 .LM22:
223 /* prologue: frame size=0 */
224 00a8 CF93 push r28
225 /* prologue end (size=1) */
72:uart.c **** uint8_t data;
73:uart.c ****
74:uart.c **** if (0 == rx_count)
227 .LM23:
228 00aa 8091 0000 lds r24,rx_count
229 00ae 8823 tst r24
230 00b0 21F4 brne .L10
75:uart.c **** {
76:uart.c **** AvrXWaitSemaphore(&rx_rdy);
232 .LM24:
233 00b2 80E0 ldi r24,lo8(rx_rdy)
234 00b4 90E0 ldi r25,hi8(rx_rdy)
235 00b6 0E94 0000 call AvrXWaitSemaphore
236 .L10:
77:uart.c **** }
78:uart.c **** data = rx_buffer[rx_rd];
238 .LM25:
239 00ba 8091 0000 lds r24,rx_rd
240 00be E82F mov r30,r24
241 00c0 FF27 clr r31
242 00c2 E050 subi r30,lo8(-(rx_buffer))
243 00c4 F040 sbci r31,hi8(-(rx_buffer))
244 00c6 C081 ld r28,Z
79:uart.c **** if (++rx_rd == RX_BUFFER_SIZE)
246 .LM26:
247 00c8 8F5F subi r24,lo8(-(1))
248 00ca 8093 0000 sts rx_rd,r24
249 00ce 8233 cpi r24,lo8(50)
250 00d0 11F4 brne .L11
80:uart.c **** {
81:uart.c **** rx_rd = 0;
252 .LM27:
253 00d2 1092 0000 sts rx_rd,__zero_reg__
254 .L11:
82:uart.c **** }
83:uart.c **** BeginCritical();
256 .LM28:
257 /* #APP */
258 00d6 F894 cli
259
84:uart.c **** if (0 == --rx_count)
261 .LM29:
262 /* #NOAPP */
263 00d8 8091 0000 lds r24,rx_count
264 00dc 8150 subi r24,lo8(-(-1))
265 00de 8093 0000 sts rx_count,r24
266 00e2 8091 0000 lds r24,rx_count
267 00e6 8823 tst r24
268 00e8 21F4 brne .L12
85:uart.c **** {
86:uart.c **** AvrXResetSemaphore(&rx_rdy);
270 .LM30:
271 00ea 80E0 ldi r24,lo8(rx_rdy)
272 00ec 90E0 ldi r25,hi8(rx_rdy)
273 00ee 0E94 0000 call AvrXResetSemaphore
274 .L12:
87:uart.c **** }
88:uart.c **** EndCritical();
276 .LM31:
277 /* #APP */
278 00f2 7894 sei
279
89:uart.c ****
90:uart.c **** return data;
91:uart.c **** }
281 .LM32:
282 /* #NOAPP */
283 00f4 8C2F mov r24,r28
284 00f6 9927 clr r25
285 /* epilogue: frame size=0 */
286 00f8 CF91 pop r28
287 00fa 0895 ret
288 /* epilogue end (size=2) */
289 /* function UartGetc size 48 (45) */
294 .Lscope2:
297 .global UartPutc
299 UartPutc:
92:uart.c ****
93:uart.c **** int
94:uart.c **** UartPutc(char c)
95:uart.c **** {
301 .LM33:
302 /* prologue: frame size=0 */
303 00fc CF93 push r28
304 /* prologue end (size=1) */
305 00fe C82F mov r28,r24
96:uart.c **** if (tx_count == TX_BUFFER_SIZE)
307 .LM34:
308 0100 8091 0000 lds r24,tx_count
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -