Winavr + Bootloader + Interrupt

Gast #653650
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
Gast #654351
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
Moderator Persönliche Seite #654372
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.