Forum: Compiler & IDEs Interruptproblem mit AVR32 und C++


von Thomas D. (t0mmy)


Lesenswert?

Hallo,

ich habe eine AT32UC3B1256 auf einer eigenen Platine. Mit einem 
C-Projekt und folgendem Code funktioniert der UART-RX-Interrupt:
1
   INTC_init_interrupts();
2
   INTC_register_interrupt(&itfUSB_ISR, UART_USB_INT, AVR32_INTC_INT2);
3
   UART_USB->ier = AVR32_USART_IER_RXRDY_MASK;
4
   Enable_global_interrupt();
5
}
6
7
__attribute__((__interrupt__)) void itfUSB_ISR()
8
{
9
10
}

Da das Projekt etwas größer wird und Klassen enthalten soll hab ich 
jetzt im AVR32 Studio ein C++ Projekt angelegt, meine Files da 
reinkopiert. Die benötigten Framework-Treiber werden über extern "C" { 
#include "bla" } eingebunden, das funktioniert soweit.

Wenn jetzt im AT32 der RX-Interrupt ausgelöst wird, friert alles ein und 
nach einem Reset wird der USB-Bootloader geladen (normalerweise startet 
bei einem Reset die Firmware und nur nach einem Power-Off der 
Bootloader).
Das Programm flashe und starte ich über BatchISP, start sieht so aus: 
"batchisp.exe" -device AT32UC3B1256 -hardware USB -operation START reset 
80002000"

Ich gehe mal davon aus, dass der Zeiger zur ISR irgendwie nicht ganz 
stimmt. Hat da jemand einen Tipp für mich?

Vielen Dank!
Thomas Decker

von Thomas D. (t0mmy)


Lesenswert?

Ich habe mir inzwischen mal den Pointer-Wert der ISR-Routine ausgeben 
lassen mit:
1
unsigned long data = (unsigned long) &itfUSB_ISR;
Das Ergebnis ist 2147499800. Für 32k Flash der bei der Adresse 80000 
beginnt scheint mir das etwas groß. Eine zweite ISR-Routine von einem 
Timer liegt jedoch nur um ~500Bytes neben der UART-ISR.
Bei dem Timer-INT das gleiche Problem... lasse ich den Timer laufen und 
damit einen INT auslösen, friert der AVR32 ein.

Was könnte es denn da für Unterschiede zwischen C und C++ (bzw. deren 
Compilern) geben, die dafür verantwortlich sein könnten?

Grüße
Thomas

von ... (Gast)


Lesenswert?

Hat der AVR32 keine MMU? Kann man bei Prozessoren mit MMU überhaupt
sinnvolle Zeiger-Adressen auslesen?

von Thomas D. (t0mmy)


Lesenswert?

Der kleine AVR32 (also der UC3) hat keine MMU. Aber ob es trotzdem 
sinnvoll ist weiß ich nicht, hab das bis jetzt auch noch nie probiert.
Und mein JTAGICE mkII clone hängt noch irgendwo beim Zoll fest...

von Thomas D. (t0mmy)


Lesenswert?

Heute habe ich das Problem gelöst. Selbst mein neues JTAGICE mkII hat 
mir dabei nicht wesentlich geholfen (es hat den halben Debugger mit in 
den reset genommen).

Beim herumspielen des INTC-Beispiels und dem umsetzen in ein C++ ist mir 
dann was aufgefallen. Bei den Linkerparametern muss folgendes 
dabeistehen:
1
-march=ucr1 -Wl,--gc-sections
Ob das bei C-Projekten automatisch dabei steht, hab ich nicht 
ausprobiert. Bei dem INTC-Beispiel ist es jedenfalls drin, und bei neu 
angelegten C++ Projekten nicht. Achja ich hab wie im Beispiel auch, die 
NewLib integriert, ob ich sie wirklich brauche, kann ich atm aber nicht 
sagen.

Danke für eure aufmerksamkeit ;)
Thomas

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.