Interruptproblem mit AVR32 und C++

OP #1142384
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
OP #1143465
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
OP #1146870
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.