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


von simon (Gast)


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:
1
int main() {
2
    //... Übliche Initialisierung
3
    deadloop();
4
    while(1);
5
6
    return 0;
7
}

In der asm-Datei ist diese Endlosschleife wie folgend definiert:
1
.text
2
.code 16
3
.syntax unified
4
5
.global deadloop
6
deadloop:
7
  b deadloop
8
.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:
1
arm-none-eabi-as.exe -mcpu=cortex-m3 -mthumb deadloop.asm

von Martin T. (mthomas) (Moderator) Benutzerseite


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).

von (prx) A. K. (prx)


Lesenswert?

.thumb_func

von simon (Gast)


Lesenswert?

Reine C-Programme funktionieren ohne Probleme, auch scheint mir das 
erste Element in der Exception-Table mit
1
&_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?

von simon (Gast)


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.

von (prx) A. K. (prx)


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.

von (prx) A. K. (prx)


Lesenswert?

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

von Layouter (Gast)


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..

von Marcus H. (mharnisch) Benutzerseite


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/

von simon (Gast)


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

von Walter (Gast)


Lesenswert?

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

von Michael (Gast)


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.

von Walter (Gast)


Lesenswert?

> Und für lau ist das doch eine prima Sache.

LOL. Nichts ist für lau !

Die CPUs werden ihren entsprechenden Preis haben !

von Qduda 1. (Firma: student) (qduda)


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)

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.