www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik cortex m3: HardFaultException beim Aufruf einer Assemblerfunktion


Autor: simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mir kürzlich den neuen lpc1768-stick von hitex zugelegt und nun 
beschlossen mich mit Assembler zu beschäftigen. Mein Assemblerprogramm 
hat folgenden Aufbau:

In C wird die Funktion deadloop aufgerufen:
int main() {
    //... Übliche Initialisierung
    deadloop();
    while(1);

    return 0;
}

In der asm-Datei ist diese Endlosschleife wie folgend definiert:
.text
.code 16
.syntax unified

.global deadloop
deadloop:
  b deadloop
.end

Durch den Debugger musste ich jedoch festellen das beim Aufruf der 
deadloop-Funktion sofort eine HardFaultException ausgelöst wird. Ich bin 
im Moment ziemlich ratlos woran dies liegen kann. Muss ich irgendwelche 
speziellen Optionen an den Assembler übergeben? Im Moment lautet mein 
Assembleraufruf:
arm-none-eabi-as.exe -mcpu=cortex-m3 -mthumb deadloop.asm

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funktioniert ein "reines" C-Programm mit void deadcode(void) { 
while(1){;} }?
Stackpointer initialisiert? Bei CM3 ist Intialwert erstes Element 
(uint32_t) in der Exceptions-Tabelle? Inhalt Stackpointer unmittelbar 
vor dem Aufruf von "deadloop" bei Debuggen? Disassembly (objdump -S....) 
angesehen? Empfehlung am Rande: -as nicht direkt aufrufen, assemblieren 
kann man auch über das Frontend (-gcc) anstossen (ähnliches für den 
Linker, nicht direkt -ld, sonder ebenfalls über -gcc linken).

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.thumb_func

Autor: simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Reine C-Programme funktionieren ohne Probleme, auch scheint mir das 
erste Element in der Exception-Table mit
&_stacktop
 korrekt. Das Verwenden des gcc-Frontends anstelle des Assemblers und 
Linkers änderte nicht an meinem Problem. Allerdings ist mir aufgefallen, 
dass der Compiler den Aufruft der deadloop-Funktion als blx Befehl 
umgesetzt hat, während jedoch den Aufruf von C-Funktionen mit bl 
durchführt. Könnte hier das Problem liegen? Versucht der Compilier hier 
in den nicht mehr vorhandenen ARM-Modus zu wechseln?

Autor: simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh, hab die Mitteilung von A. K. ganz übersehen.
Vielen Dank, mit .thumb_func funktioniert es jetzt.
Allerdings frage ich mich wieso .code 16 nicht das selbe bewirkt. Muss 
ich wirklich vor jede Funktion .thumb_func schreiben, oder kann ich das 
auch irgendwie global setzten.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.code 16 erzeugt zwar Thumb Code, kennzeichnet aber die Symbole nicht 
automatisch als solche. Infolgedessen werden sie als ARM Funktionen 
aufgerufen (Bit 0 der Adresse).

Möglicherweise hat es damit zu tun, dass nicht zwangsläufig alle Symbole 
für Funktionen stehen.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn dich das nervt, mach ein Makro für den Anfang einer Funktion, mit 
.global und .thumb_func.

Autor: Layouter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@simon (Gast)
Gibt es einen speziellen Grund das du einen Cortex M3 in Assembler 
programmierst?

Ich weiss echte Männer müssen:

- Linux Kernel kompilieren
- einen Baum pflanzen
- unter 5 sec von 0 auf 100 km/h sein
- 5 Liter Bier vertragen
- ...

Aber bei uC in der M3 Klasse mit über 50Mhz braucht man kein Assembler 
mehr..

Autor: Marcus Harnisch (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Layouter schrieb:
> Aber bei uC in der M3 Klasse mit über 50Mhz braucht man kein Assembler
> mehr..

Stimmt zum größten Teil, was die Performance angeht. Manchmal ist es 
aber doch nötig. Bestimmte Instruktionen sind nicht von C erreichbar. 
Das wichtigste wird zugegebenermaßen schon durch CMSIS vor dem 
Programmierer verborgen.

Gruß
Marcus
http://www.doulos.com/arm/

Autor: simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank ersten einmal für die Hilfe.
@Layouter
Da mir freeRTOS nicht gefällt und ich mich sowieso mit hardwarenaher 
Programmierung beschäftigen will, habe ich beschlossen Multitasking für 
meinen Arm Cortex zu programmieren. Für die den Taskwechsel bzw. das 
Speichern der Register benötige ich zwangsläufig Assembler.

mfg simon

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei luminary ist freeRTOS schon direkt im ROM. Deren CPUs werden langsam 
zu Müllhalden ;-)

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Bei luminary ist freeRTOS schon direkt im ROM

Es ist SafeRTOS, also die IEC61508.zertifizierte Variante.
Und für lau ist das doch eine prima Sache.

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Und für lau ist das doch eine prima Sache.

LOL. Nichts ist für lau !

Die CPUs werden ihren entsprechenden Preis haben !

Autor: Qduda 12345 (Firma: student) (qduda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Layouter schrieb:
> @simon (Gast)
> Gibt es einen speziellen Grund das du einen Cortex M3 in Assembler
> programmierst?
>
> Ich weiss echte Männer müssen:
>
> - Linux Kernel kompilieren
> - einen Baum pflanzen
> - unter 5 sec von 0 auf 100 km/h sein
> - 5 Liter Bier vertragen
> - ...
>
> Aber bei uC in der M3 Klasse mit über 50Mhz braucht man kein Assembler
> mehr..

Aber zB einen Context-Switch bekommst du ohne Assembler auf dem M3 nicht 
hin. Das geht zwar auch in Inline Assembler, sind ja nur ein paar 
funktionen - aber völlig ohne geht nicht. Oder liege ich da falsch? :o)

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.