Forum: Compiler & IDEs Winavr + Bootloader + Interrupt


von Andreas (Gast)


Lesenswert?

Hallo,

ich habe ein Problem wenn ich einen Bootloader und den Interrupts. 
Starte ich das Programm ausserhalb des Bootloaders funktioniert es 
einwandfrei.
Sobald ich das aber in den Bootloader verschiebe werden die Interrupts 
nicht mehr ausgeführt. Zum Testen habe ich
mir ein kleines PRogramm geschrieben, dass bei Einsprung in die 
Interruptroutine die Leds einschaltet.

Das Programm beinhaltet die Verschiebung in den Bootloaderbereich mit
1
GICR = (1<<IVCE)
2
GICR = (1<<IVSEL)

Den Interrupt habe ich folgendermaßen aktiviert:
1
SIGNAL(SIG_INTERRUPT0)     
2
/* signal handler for external interrupt int0 */
3
{
4
    led++;
5
    PORTB = 0xAA;
6
}
7
8
9
DDRD  = 0x00;                
10
PORTD = 0xFF;            
11
12
GICR |= (1<<INT0)

Ausserdem wird es compiliert mit der Option 
"-Wl,--section-start=.text=3800".

Ebenfalls habe ich das Programm dann noch so compiliert:
"-Wl,--section-start=.text=3800 -nostartfiles -nodefaultlibs"

Dabei habe ich dann folgende Routine aus Peter Fleurys Bootloader 
verwendet:
1
/*
2
 * since this bootloader is not linked against the avr-gcc crt1 functions,
3
 * to reduce the code size, we need to provide our own initialization
4
 */
5
void __jumpMain     (void) __attribute__ ((naked)) __attribute__ ((section (".init9")));
6
7
void __jumpMain(void)
8
{    
9
    asm volatile ( ".set __stack, %0" :: "i" (RAMEND) );
10
    asm volatile ( "clr __zero_reg__" );                       // GCC depends on register r1 set to 0
11
    asm volatile ( "out %0, __zero_reg__" :: "I" (_SFR_IO_ADDR(SREG)) );  // set SREG to 0
12
    asm volatile ( "rjmp main");                               // jump to main()
13
}

Alles erfolglos.

Ich glaube aber, daß ich irgendwelche Parameter bei WinAvr noch setzen 
muss.
Aber welche?

Der Controller ist ein Atmega16.

Danke im Voraus für jeden Hinweis.


Andreas

von Andreas (Gast)


Lesenswert?

Hat sich erledigt. Den entscheidenden Hinweis habe ich im avrfreaksforum 
erhalten. Dort hatte jemand dasselbe Problem.

Es lag an der Optimierung. Ich hatte eingestellt "-O0". Damit ging es 
nicht. Habe es jetzt mit "-O1" und "-Os" getestet. Damit läuft es jetzt.

Wäre nett wenn mir jemand mal den Unterschied erklären könnte.

Danke

Andreas

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Andreas wrote:

> Wäre nett wenn mir jemand mal den Unterschied erklären könnte.

Naja, ohne Optimierung ist der Code halt sauumständlich.  Wenn du
jetzt irgendwelche Timing-Sachen da drin hast (zweimal hintereinander
auf ein Register schreiben zum Beispiel), dann hat der nicht
optimierte Code noch einen Haufen anderer Befehle dazwischen.  Guck's
dir doch einfach an.

von Andreas (Gast)


Lesenswert?

Danke.

Ich ahne schon das es hieran liegen wird.
1
GICR = (1<<IVCE)
2
GICR = (1<<IVSEL)

Da wird wohl irgendwas passiert sein. Werde es mir bei gelegenheit mal 
ansehen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.