mikrocontroller.net

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


Autor: Thomas Decker (t0mmy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe eine AT32UC3B1256 auf einer eigenen Platine. Mit einem 
C-Projekt und folgendem Code funktioniert der UART-RX-Interrupt:

   INTC_init_interrupts();
   INTC_register_interrupt(&itfUSB_ISR, UART_USB_INT, AVR32_INTC_INT2);
   UART_USB->ier = AVR32_USART_IER_RXRDY_MASK;
   Enable_global_interrupt();
}

__attribute__((__interrupt__)) void itfUSB_ISR()
{

}


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

Autor: Thomas Decker (t0mmy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mir inzwischen mal den Pointer-Wert der ISR-Routine ausgeben 
lassen mit:
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

Autor: ... (Gast)
Datum:

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

Autor: Thomas Decker (t0mmy)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Thomas Decker (t0mmy)
Datum:

Bewertung
0 lesenswert
nicht 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:
-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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.