ARM CortexM4, ASM, Reset_Handler

Gast #3102992
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
Angehängte Dateien:
Gast #3103391
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
#3103583
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.