cortex m3: HardFaultException beim Aufruf einer Assemblerfunktion

Gast #1363304
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
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
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
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.
#1363546
.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.
Gast #1363811
@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
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
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
Gast #1365222
>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.
(Firma: student) #1511863
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

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.