oberallgeier
11.06.2016, 17:58
Hallo Forum,
eine Differenz zwischen Datenblatt und Compilat, sprich *lls, ist mir aufgefallen, ich verstehe die nicht.
Controller: mega328
IDE AVRStudio4.18-Build 700
Die originale Vektortabelle aus dem neuesten (11. Juli 2016) Datenblatt, Atmel-8271J-AVR- ATmega-Datasheet_11/2015, Seite 65:
1 0x0000(1) RESET External Pin, Power-on Reset, Brown-out Reset and Watchdog System Reset
2 0x0002 INT0 External Interrupt Request 0
3 0x0004 INT1 External Interrupt Request 1
4 0x0006 PCINT0 Pin Change Interrupt Request 0
5 0x0008 PCINT1 Pin Change Interrupt Request 1
6 0x000A PCINT2 Pin Change Interrupt Request 2
7 0x000C WDT Watchdog Time-out Interrupt
8 0x000E TIMER2 COMPA Timer/Counter2 Compare Match A
9 0x0010 TIMER2 COMPB Timer/Counter2 Compare Match B
10 0x0012 TIMER2 OVF Timer/Counter2 Overflow
Die ISR für Timer2 Compare Match A:
// ================================================== =========================== =
// === Nicht unterbrechbare ISR für timer2 ==================================== =
// Routine zählt hoch im Takt 20 kHz = 50 µs. Verwendung: Heartbeat (LED)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ISR(TIMER2_COMPA_vect) // Vektor 8, Adresse 0x000E
{ //
Izeit_A --; // ###>>> Izeit_1 ist aktuell int16_t ==>> Izeit_1 bleibt
// bis 32000 in der int16-Grenze
if ( ! Izeit_A ) // Interrupt-Timer = 1 ... 20 000 ... (1 sec blink)
// WENN Izeit_1 =|= Null => wahr => Anweisung ausgeführen
{ // Eine Sekunde ist voll =>
Izeit_A = Izthrznt; // => Rückstellen auf Zeithorizont
ToggleBit (PBLED, LBr); // rtLED toggeln HEARTBEAT (on board + Pin)
Isecundn ++; // Sekundenzähler hochtackern, max 9 Std
} // Ende if ( ! Izeit_A )
//
return;
} // Ende ISR(TIMER2_COMPA_vect)
// ================================================== =========================== =
Daraus entsteht jetzt in der *.lls dieses Codestück dessen Adressen ich nicht verstehe.
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 79 00 jmp 0xf2 ; 0xf2 <__vector_7>
20: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
24: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>Frage: Wieso heißt dieser Abschnitt ".text"? Wieso haben die andern Abschnitte ihre Namen? Ich finde leider dazu mit der Standardsuche (Tante Goock) keine Antwort.
Hier der Ausschnitt von eben mit dem "vorderen" Teil der *.lls.
XXXXX_01_01.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .data 00000004 00800100 000001e0 00000274 2**0
CONTENTS, ALLOC, LOAD, DATA
1 .text 000001e0 00000000 00000000 00000094 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
2 .bss 00000004 00800104 00800104 00000278 2**0
ALLOC
3 .debug_aranges 00000020 00000000 00000000 00000278 2**0
CONTENTS, READONLY, DEBUGGING
4 .debug_pubnames 000000a4 00000000 00000000 00000298 2**0
CONTENTS, READONLY, DEBUGGING
5 .debug_info 00000258 00000000 00000000 0000033c 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_abbrev 00000180 00000000 00000000 00000594 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_line 00000249 00000000 00000000 00000714 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_frame 00000090 00000000 00000000 00000960 2**2
CONTENTS, READONLY, DEBUGGING
9 .debug_str 000000ef 00000000 00000000 000009f0 2**0
CONTENTS, READONLY, DEBUGGING
10 .debug_loc 0000006b 00000000 00000000 00000adf 2**0
CONTENTS, READONLY, DEBUGGING
11 .debug_ranges 00000030 00000000 00000000 00000b4a 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 79 00 jmp 0xf2 ; 0xf2 <__vector_7>
20: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
24: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
Für ne Antwort/Erklärung danke ich schon jetzt.
Die Fragen zusammen:
1) Wieso heißt ein Programmabschnitt der *.lss ".text"? Wieso haben die andern Abschnitte ihre Namen? Ich finde leider dazu mit der Suche bei Google keine Antwort.
2) Wieso sind die Interruptvektoren im Datenblatt mit 2 inkrementierte, in der *.lss mit 4? Ok, das ist wohl der Adressraum des mega328 ! ? ! ?
3) Steht irgendwo ne (gute *gg*) Erklärung für Aufbau, Code-Abschnittnamen etc. der *.lls-Datei? Wo bitte?
eine Differenz zwischen Datenblatt und Compilat, sprich *lls, ist mir aufgefallen, ich verstehe die nicht.
Controller: mega328
IDE AVRStudio4.18-Build 700
Die originale Vektortabelle aus dem neuesten (11. Juli 2016) Datenblatt, Atmel-8271J-AVR- ATmega-Datasheet_11/2015, Seite 65:
1 0x0000(1) RESET External Pin, Power-on Reset, Brown-out Reset and Watchdog System Reset
2 0x0002 INT0 External Interrupt Request 0
3 0x0004 INT1 External Interrupt Request 1
4 0x0006 PCINT0 Pin Change Interrupt Request 0
5 0x0008 PCINT1 Pin Change Interrupt Request 1
6 0x000A PCINT2 Pin Change Interrupt Request 2
7 0x000C WDT Watchdog Time-out Interrupt
8 0x000E TIMER2 COMPA Timer/Counter2 Compare Match A
9 0x0010 TIMER2 COMPB Timer/Counter2 Compare Match B
10 0x0012 TIMER2 OVF Timer/Counter2 Overflow
Die ISR für Timer2 Compare Match A:
// ================================================== =========================== =
// === Nicht unterbrechbare ISR für timer2 ==================================== =
// Routine zählt hoch im Takt 20 kHz = 50 µs. Verwendung: Heartbeat (LED)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ISR(TIMER2_COMPA_vect) // Vektor 8, Adresse 0x000E
{ //
Izeit_A --; // ###>>> Izeit_1 ist aktuell int16_t ==>> Izeit_1 bleibt
// bis 32000 in der int16-Grenze
if ( ! Izeit_A ) // Interrupt-Timer = 1 ... 20 000 ... (1 sec blink)
// WENN Izeit_1 =|= Null => wahr => Anweisung ausgeführen
{ // Eine Sekunde ist voll =>
Izeit_A = Izthrznt; // => Rückstellen auf Zeithorizont
ToggleBit (PBLED, LBr); // rtLED toggeln HEARTBEAT (on board + Pin)
Isecundn ++; // Sekundenzähler hochtackern, max 9 Std
} // Ende if ( ! Izeit_A )
//
return;
} // Ende ISR(TIMER2_COMPA_vect)
// ================================================== =========================== =
Daraus entsteht jetzt in der *.lls dieses Codestück dessen Adressen ich nicht verstehe.
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 79 00 jmp 0xf2 ; 0xf2 <__vector_7>
20: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
24: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>Frage: Wieso heißt dieser Abschnitt ".text"? Wieso haben die andern Abschnitte ihre Namen? Ich finde leider dazu mit der Standardsuche (Tante Goock) keine Antwort.
Hier der Ausschnitt von eben mit dem "vorderen" Teil der *.lls.
XXXXX_01_01.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .data 00000004 00800100 000001e0 00000274 2**0
CONTENTS, ALLOC, LOAD, DATA
1 .text 000001e0 00000000 00000000 00000094 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
2 .bss 00000004 00800104 00800104 00000278 2**0
ALLOC
3 .debug_aranges 00000020 00000000 00000000 00000278 2**0
CONTENTS, READONLY, DEBUGGING
4 .debug_pubnames 000000a4 00000000 00000000 00000298 2**0
CONTENTS, READONLY, DEBUGGING
5 .debug_info 00000258 00000000 00000000 0000033c 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_abbrev 00000180 00000000 00000000 00000594 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_line 00000249 00000000 00000000 00000714 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_frame 00000090 00000000 00000000 00000960 2**2
CONTENTS, READONLY, DEBUGGING
9 .debug_str 000000ef 00000000 00000000 000009f0 2**0
CONTENTS, READONLY, DEBUGGING
10 .debug_loc 0000006b 00000000 00000000 00000adf 2**0
CONTENTS, READONLY, DEBUGGING
11 .debug_ranges 00000030 00000000 00000000 00000b4a 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 79 00 jmp 0xf2 ; 0xf2 <__vector_7>
20: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
24: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
Für ne Antwort/Erklärung danke ich schon jetzt.
Die Fragen zusammen:
1) Wieso heißt ein Programmabschnitt der *.lss ".text"? Wieso haben die andern Abschnitte ihre Namen? Ich finde leider dazu mit der Suche bei Google keine Antwort.
2) Wieso sind die Interruptvektoren im Datenblatt mit 2 inkrementierte, in der *.lss mit 4? Ok, das ist wohl der Adressraum des mega328 ! ? ! ?
3) Steht irgendwo ne (gute *gg*) Erklärung für Aufbau, Code-Abschnittnamen etc. der *.lls-Datei? Wo bitte?