Hallo zusammen,
ich versuche ein kleines Programm für den mega8 mit simulavr und avr-gdb
zu debuggen.
Gemacht habe ich bisher folgendes:
Kompilieren main.elf,
Simulator starten mit
1 | simulavr -G -d atmega8 -F 8000000 -f main.elf
|
Debugger starten
1 | avr-gdb --tui --se main.elf
|
im gdb:
1 |
|
2 | target remote :1212
|
3 | load
|
4 | b main
|
5 | c
|
Funktion main() aus main.c sieht so aus ..
1 | int main( void )
|
2 | {
|
3 |
|
4 | OwContext o;
|
5 | uint8_t B = 0 ;
|
6 |
|
7 | /* for debugging use variables instead of in/out-registers
|
8 | */
|
9 | volatile uint8_t _ddrd , _portd, _pind ;
|
10 |
|
11 |
|
12 | uart_init();
|
13 | OwInit();
|
14 |
|
15 | DDRD = 0x00 ; // alles Eingänge
|
16 | PORTD = 0xFF; // Pullups AN
|
17 |
|
18 | while( 1 ) {
|
19 |
|
20 | uint8_t i, j;
|
21 |
|
22 | // if ( ~PIND & (1<<PD7) ) { // Taster gedrückt
|
23 | _pind = PIND; // für Debug PIND in Variable laden um im gdb ändern zu können
|
24 | if ( ~_pind & (1<<PD7) ) {
|
25 |
|
26 | if ( ~B & 0x80 ){ // Taster war zuvor noch nicht gedrückt
|
27 | B |= 0x80 ; // merken
|
28 | uart_putc('*');
|
29 | i = OwSearchRom( &o ) ;
|
30 |
|
31 | uart_putc(i);
|
32 |
|
33 | }
|
34 | } else {
|
35 | if ( B & 0x80 ){ // Taster war zuvor noch nicht gedrückt
|
36 | B &= ~0x80 ; // merken
|
37 | }
|
38 | }
|
39 |
|
40 | }
|
41 |
|
42 | return 0;
|
43 | }
|
Das alles erstmal nur zur Kenntnis. Nun das Problem:
Beim Steppen durch die Funktion main wird das Programm nicht
nacheinander abgearbeitet, so wie die Befehlszeilen nacheinander folgen.
zB wird die Anweisung "uint8_t B = 0 ; " vom Beginn erst nach "PORTD =
0xFF" angesprungen , um dann mit der Anweisung "B &= ~0x80 ; " etliche
Zeilen weiter unten fortzufahren und dann weiter mit "B |= 0x80 ;"
weiter oben weiter zu machen.
Ich kann dieser Logik nicht ganz folgen, weil ich davon ausgehe, dass
mit dem gdb-Kommando "s" eine tatsächlich schrittweise Abarbeitung
stattfindet.
Nun bin ich etwas ratlos - sollte das Programm tatsächlich in dieser Art
ausgeführt werden, weiß ich zum einen nicht warum und zum anderen
wundert es nicht, dass es sich nicht wie erwartet verhält.
<br>
Hat jemand ne Idee, wie dieses scheinbar wahllose Umherspringen zustande
kommt ? Muss das so?
Für Ideen dankbar
Mike