Code:
arno_01.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .data 00000366 00800100 000019cc 00001a80 2**0
CONTENTS, ALLOC, LOAD, DATA
1 .text 000019cc 00000000 00000000 000000b4 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
2 .bss 00000165 00800466 00800466 00001de6 2**0
ALLOC
3 .eeprom 00000001 00810000 00810000 00001de6 2**0
CONTENTS, ALLOC, LOAD, DATA
4 .debug_aranges 00000020 00000000 00000000 00001de7 2**0
CONTENTS, READONLY, DEBUGGING
5 .debug_pubnames 000006d9 00000000 00000000 00001e07 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_info 000019a4 00000000 00000000 000024e0 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_abbrev 00000311 00000000 00000000 00003e84 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_line 0000141d 00000000 00000000 00004195 2**0
CONTENTS, READONLY, DEBUGGING
9 .debug_frame 000002e0 00000000 00000000 000055b4 2**2
CONTENTS, READONLY, DEBUGGING
10 .debug_str 00000649 00000000 00000000 00005894 2**0
CONTENTS, READONLY, DEBUGGING
11 .debug_loc 00000619 00000000 00000000 00005edd 2**0
CONTENTS, READONLY, DEBUGGING
12 .debug_ranges 000000c0 00000000 00000000 000064f6 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
00000000 <__vectors>:
0: 0c 94 34 00 jmp 0x68 ; 0x68 <__ctors_end>
4: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
8: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
c: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
10: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
14: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
18: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
1c: 0c 94 6e 02 jmp 0x4dc ; 0x4dc <__vector_7>
20: 0c 94 a0 02 jmp 0x540 ; 0x540 <__vector_8>
24: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
28: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
2c: 0c 94 f4 01 jmp 0x3e8 ; 0x3e8 <__vector_11>
30: 0c 94 2c 02 jmp 0x458 ; 0x458 <__vector_12>
34: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
38: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
3c: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
40: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
44: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
48: 0c 94 90 00 jmp 0x120 ; 0x120 <__vector_18>
4c: 0c 94 bc 00 jmp 0x178 ; 0x178 <__vector_19>
50: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
54: 0c 94 5b 06 jmp 0xcb6 ; 0xcb6 <__vector_21>
58: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
5c: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
60: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
64: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
..
00000120 <__vector_18>:
// ============================================================================== =
// ============================================================================== =
ISR( USART0_RX_vect )
{
120: 1f 92 push r1
122: 0f 92 push r0
124: 0f b6 in r0, 0x3f ; 63
126: 0f 92 push r0
128: 11 24 eor r1, r1
12a: 8f 93 push r24
12c: 9f 93 push r25
12e: ef 93 push r30
130: ff 93 push r31
u8 i = rx_in;
132: 90 91 af 04 lds r25, 0x04AF
ROLLOVER( i, RX0_SIZE );
136: 9f 5f subi r25, 0xFF ; 255
138: 90 34 cpi r25, 0x40 ; 64
13a: 08 f0 brcs .+2 ; 0x13e <__vector_18+0x1e>
13c: 90 e0 ldi r25, 0x00 ; 0
if( i == rx_out ){ // buffer overflow
13e: 80 91 b0 04 lds r24, 0x04B0
142: 98 17 cp r25, r24
144: 31 f4 brne .+12 ; 0x152 <__vector_18+0x32>
URX0_IEN = 0; // disable RX interrupt
146: 80 91 c1 00 lds r24, 0x00C1
14a: 8f 77 andi r24, 0x7F ; 127
14c: 80 93 c1 00 sts 0x00C1, r24
150: 0a c0 rjmp .+20 ; 0x166 <__vector_18+0x46>
return;
}
rx_buff[rx_in] = UDR0;
152: e0 91 af 04 lds r30, 0x04AF
156: f0 e0 ldi r31, 0x00 ; 0
158: 80 91 c6 00 lds r24, 0x00C6
15c: e1 59 subi r30, 0x91 ; 145
15e: fb 4f sbci r31, 0xFB ; 251
160: 80 83 st Z, r24
rx_in = i;
162: 90 93 af 04 sts 0x04AF, r25
}
166: ff 91 pop r31
168: ef 91 pop r30
16a: 9f 91 pop r25
16c: 8f 91 pop r24
16e: 0f 90 pop r0
170: 0f be out 0x3f, r0 ; 63
172: 0f 90 pop r0
174: 1f 90 pop r1
176: 18 95 reti
00000178 <__vector_19>:
// ============================================================================= =
..
..
// ============================================================================= =
..
000019c8 <_exit>:
19c8: f8 94 cli
000019ca <__stop_program>:
19ca: ff cf rjmp .-2 ; 0x19ca <__stop_program>
Anfangs allerlei Organisation. Beachte die beispielhafte ISR( USART0_RX_vect ), besonders die pushs am Beginn und die pops am Ende der ISR. Die sind blanker Overhead, weil die ISR erstmal alle von ihr benutzten (manchmal nicht benutzte) Register am Stack sichern - pushen - muss. Weil sie ja zu einem beliebigen Zeitpunkt/Codeabschnitt bedient wird, an dem "niemand" weiß, was gerade in den zentralen Registern der ALU steckt. Am Ende des eigentlich "sinnvollen" Codes der ISR werden die entsprechend der ISR-Startsituation gesicherten Register wieder zurückgeladen - gepopt. Zweimal je sieben pushs bzw. pops sind schon mal achtundzwanzig Maschinenzyklen - die aufgewendet werden müssen, damit alles seine Richtigkeit hat (im beispielhaften Controller pro push oder pull jeweils 2 Zyklen).
Lesezeichen