Forum: Mikrocontroller und Digitale Elektronik Assembler aufrufen aus C (ARM STM32)


von Michael W. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo !

Ich habe gerade ein (=mein erstes) Assembler File erstellt (genauer: aus 
einer Internetquelle kopiert). Darin ist eine Funktion foo definiert, 
die ich von C aus aufrufen möchte.

Dazu habe ich in (eine  bereits vorhandene) main.c den Prototypen für 
foo eingehängt. Beim Aufruf fooU() kommt es zu einem "HardFault" (siehe 
Bild). Was mache ich da falsch?

PS: foo() ist jetzt nach SystemInit() - geht aber trotzdem nicht!

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Warum jetz 2 Threads für den selben Kram?

Und aus diesem widerlich zugespammten Eclipse soll man jetz was 
erkennen?

von Michael W. (Gast)


Lesenswert?

Zugespammt...das ist halt ein Testprojekt, das ich für alle mögliche 
Tests verwende. Nur weil's nicht schön ist, heißt es ja nicht, dass es 
nicht funktionieren kann.

Und für jemanden der's kann ist das Kram. Da geb ich dir recht. Dsas 
hilft mir aber nicht weiter... Und wie soll ich es hineinstellen, damit 
es ansehenswürdig ist?

von Michael W. (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe nun ein minimales CooCox Projekt erstellt (siehe Anhang), 
welches den Fehler reproduziert.

Sorry, dass ich dieses große Ding dranhänge, aber sonst heißt es wieder, 
man könne nichts erkennen...

Wieso wird bei foo() CLX aufgerufen, und nicht CL?

Muss das LSB nicht !=Null sein bei CLX ? Dort passiert jedenfalls der 
Fehler...

Danke und LG

von Fritz (Gast)


Lesenswert?

In meinen Assembler-sourcen für den STM32F4.. habe ich am Anfang noch 
stehen:
        .code   16
        .syntax unified

sowie vor jeder Function
        .thumb_func
foo:
.
.
.
das setzt in der adresse foo das bit 0, was für den thumb2-call 
notwendig ist.

von PittyJ (Gast)


Lesenswert?

So etwas ähnliches hatte ich letztens auch.
Mein Problem war, dass ein ARM-Prozessor zwei verschiedene Befehlssätze 
kennt (ARM und Thumb). Mein C-Programm war in dem einen, das 
Assembler-Programm in dem anderen Befehlssatz. Und das hat dann nicht 
gepasst.

Ich musste entweder im Assembler auf den anderen Befehlssatz schalten, 
z.B. mit der .thumb oder .arm Direktive.
Oder im GCC mit -mthumb auf den entsprechende Modus umschalten.
Dann hat es geklappt.

von Sascha (Gast)


Lesenswert?

Hallo, wenn im Assembler File .Thumb oder .ARM steht wird doch das 
automatisch so assembliert. Der Linker muss dann den Befehl BLX Rx 
automatisch erkennen und richtig setzen. Also so gehts bei mir 
jedenfalls.
Die Variable oder Adresse muss natürlich aus dem Assembler File mit 
public nach Außen sichtbar gemacht werden.
Gruß Sascha

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.