Forum: Mikrocontroller und Digitale Elektronik ARM CortexM4, ASM, Reset_Handler


von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich frage mich gerade warum dieser Assemblercode:
1
.section .text.Reset_Handler
2
Reset_Handler:

Zwar funktioniert wenn man ihn debuggt, wenn das Board aber einen 
'kaltstart' (also Spannnung weg, Spannung hin) macht, bleibt der Chip am 
ersten Befehl des Reset-Handler stehen und das ST-LINK sagt 'Core 
halted'.

Ändere ich den Code wie folgt, um dem Assembler mitzuteilen dass 
'Reset_Handler' vom Typ Function ist, läuft der Core auch bei einem 
Kaltstart normal an und führt den Code aus.
1
.section .text.Reset_Handler
2
.type Reset_Handler, %function  
3
Reset_Handler:

Ich könnte mir denken dass es was damit zu tun hat dass ab Cortex-M3 das 
LeastSignificantBit in Addressen '1' sein soll, damit der Core weiß dass 
das Ziel als Thumbcode interpretiert wird.
Wobei in meinem Buch auch steht dass es eigentlich einen Fault geben 
müsste wenn man falsche Opcodes hat.

Bin ich auf dem Holzweg?
Hat jemand ne Erklärung für dieses Verhalten ?

Es handelt sich um ein STM32F4Discovery und den Rest der main.s habe ich 
mal angehängt. Ich hatte einfach nur versucht dass geringst mögliche 
Assembler-Construct zu bauen.

Mfg,

Thomas

von Jim M. (turboj)


Lesenswert?

Thomas schrieb:
> Wobei in meinem Buch auch steht dass es eigentlich einen Fault geben
> müsste wenn man falsche Opcodes hat.

Wenn Du im Hardfault Handler denselben Fehler gemacht hast - oder ein 
anderes Fault auftritt - eskaliert er zum Lockup. Dann hält der Core 
einfach an.

von Thomas (Gast)


Lesenswert?

@Jim:

Gute Idee. Das wird es wohl sein.
Kannst du mir jetzt noch erklären warum der Assembler diese 
Typdefinition haben will ?

Prinzipiell dachte ich in der Vektortable steht die 4Byte-Addresse des 
Reset-Handlers, diese Addresse wird in den PC geladen und schon wird das 
ausgeführt.

Was ist also der Unterschied ob eine Funktion mit oder ohne diese 
Typdefinition assembliert wird?

Thomas

von Andy K. (notandy)


Lesenswert?

ARM ist eine 32 bit Architektur, soweit alles klar. Das bedeutet erstmal 
das Instruktionen typischerweise bei ARM: 4, bei Thumb: 2 byte aligned 
werden damit sie problemlos gefetched werden können. Das least 
significant Bit von Funktionspointern ist also 0.

Nun haben wir aber einen Cortex-M, der kann nur Thumb Mode agieren.
Wie wird aber in einem ARM zwischen Thumb und ARM Mode unterschieden?

Antwort: Wenn das least significant Bit der Sprungadresse == 1 ist, wird 
im Thumb Mode gearbeitet, sonst ARM.

Wenn du also einfach nur ein Label verwendest und dieses über .word 
(oder LDR =label...) verwendest, benutzt der Assembler implizit eine 
ARM-Modus Addresse. Bischen blöd bei nem Thumb-Only prozessor, oder?

Mit .type %function sagst du dem Assembler das es sich um eine Funktion 
handelt zu dessen Addresse du springen möchtest und nicht irgendein 
Label im Speicher. Dann setzt der Assembler richtigerweise das Thumb 
Bit.

Bei normalen (nicht-thumb) ARM startup-code sind Label- und 
Funktionsaddressen identisch, deshalb kann man dort auf die 
typ-deklarierung verzichten.

Grüße,

Andy

von Thomas (Gast)


Lesenswert?

@Andy: Was für eine super Erklärung, vielen Dank !

Thomas

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.