cortex m3: HardFaultException beim Aufruf einer Assemblerfunktion

Gast #1363304
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
Moderator Persönliche Seite #1363479
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).
Gast #1363511
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?
Gast #1363516
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.
Gast #1363811
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..
Persönliche Seite #1364170
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/
Gast #1364344
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
(Firma: student) #1511863
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren