stm32 probleme mit Assembler für startup File

Gast #2518398
Lesenswert?

Ich versuche das Demoprojekt für den STM32F-VL-Discovery mit Yagarto und 
Eclipse zu übersetzen, aber beim assemblieren tritt folgender Fehler 
auf:
cmsis/CM3/DeviceSupport/ST/STM32F10x/startup/startup_stm32f10x_md_vl.s:1 
:0:  error: target CPU does not support ARM mode
make: *** 
[cmsis/CM3/DeviceSupport/ST/STM32F10x/startup/startup_stm32f10x_md_vl.o] 
Error 1
In den Optionen und in der Quelldatei ist die Cortex-M3 CPU vorgeben und 
die sollte doch den ARM Mode beherschen. Der Quellcode ist von ST.

Viele Grüsse

Reiner
Angehängte Dateien:
Gast #2518528
Lesenswert?

Danke für den Hinweis.
Aber im Sourcefile sind folgende Anweisungen enthalten:

  .syntax unified
  .cpu cortex-m3
  .fpu softvfp
  .thumb

Damit sollte GAS doch Thumb verwenden. Und verwendet der Assembler 
eigendlich Thumb-2?

Gruss Reiner
Gast #2518646
Lesenswert?

Ich habe jetzt den Quellcode direkt mit arm-none-eabi.as fehlerfrei 
übersetzt. Bei folgendem Aufruf aus dem Makefile

arm-none-eabi-gcc -x assembler-with-cpp -c -mcpu=cortex-m3 -g -gdwarf-2 
-Wa,-amhls=cmsis/CM3/DeviceSupport/ST/STM32F10x/startup/startup_stm32f10 
x_md_vl.lst 
cmsis/CM3/DeviceSupport/ST/STM32F10x/startup/startup_stm32f10x_md_vl.s 
-o 
cmsis/CM3/DeviceSupport/ST/STM32F10x/startup/startup_stm32f10x_md_vl.o

tritt der Fehler immer noch auf. Der Fehler ist offensichtlich im 
Makefile, aber ich kann ihn nicht finden.

Gruß Reiner
#2518676
Lesenswert?

ReinerS schrieb:
> Ich habe jetzt den Quellcode direkt mit arm-none-eabi.as fehlerfrei
> übersetzt. Bei folgendem Aufruf aus dem Makefile

Welchen Quelltext?

> arm-none-eabi-gcc -x assembler-with-cpp -c -mcpu=cortex-m3 -g -gdwarf-2
> -Wa,-amhls=cmsis/CM3/DeviceSupport/ST/STM32F10x/startup/startup_stm32f10 
x_md_vl.lst
> cmsis/CM3/DeviceSupport/ST/STM32F10x/startup/startup_stm32f10x_md_vl.s
> -o
> cmsis/CM3/DeviceSupport/ST/STM32F10x/startup/startup_stm32f10x_md_vl.o
>
> tritt der Fehler immer noch auf.

Was denn nun?
Welcher Fehler genau?

> Der Fehler ist offensichtlich im
> Makefile, aber ich kann ihn nicht finden.

Makefile? Eher nicht.

Ersetze mal im startup:
1
  .section .text.Reset_Handler
2
  .weak  Reset_Handler
3
  .type  Reset_Handler, %function
4
Reset_Handler:

durch
1
  .section  .text.Reset_Handler
2
  .thumb_func
3
  .weak  Reset_Handler
4
  .type  Reset_Handler, %function
5
Reset_Handler:
Gast #2518732
Lesenswert?

@Roland H. Fehler und Quelltext im ersten Eintrag.
Habe das Makefile geändert, sodas AS aufgerufen wird. Leider tritt noch 
ein Fehler beim linken auf.
Ich werde Deinen Vorschlag noch testen.

Gruß Reiner
Gast #2518776
Lesenswert?

Habe den Vorschlag von Roland umgesetzt aber ohne Erfolg. Der Fehler 
"CPU does not support ARM mode" ist immer noch da. Als Fehlerort wird 
die erste Zeile in der Quelle angeben, dort steht aber nur ein 
Kommentar. Egal was ich mache, der Fehlerort ist immer die erste Zeile.

Gruß Reiner
Gast #2519277
Lesenswert?

Hallo Leute,

ich hätte eine leichte OT-Frage:

Standardmäßig, wenn man die CMSIS-Startupfiles von ST verwendet, ist ja 
das Bit 0 des Reset-Eintrags in der Handlertabelle 0. Laut Datenblatt 
muss jedoch Bit 0 in einem Handlereintrag immer 1 sein, damit es keinen 
Fault gibt. Für alle Handler außer Reset_Handler wird das auch durch 
".thumb_set" im Startup-Assemblerfile erreicht. Warum nicht für den 
Eintrag des Reset_Handlers? Konnte die beiden Varianten leider noch 
nicht im Real Life testen, deshalb die Frage.

Was ist nun korrekt?
#2519328
Lesenswert?

High Performer schrieb:
> ich hätte eine leichte OT-Frage:

Denke nicht. Das wäre der nächste Stolperstein gewesen.

> Standardmäßig, wenn man die CMSIS-Startupfiles von ST verwendet, ist ja
> das Bit 0 des Reset-Eintrags in der Handlertabelle 0. Laut Datenblatt
> muss jedoch Bit 0 in einem Handlereintrag immer 1 sein, damit es keinen
> Fault gibt.

M. W. machen das andere Compiler automatisch (die Adresse des 
Reset_Handlers in der Vektortabelle anzupassen oder einen eigenen 
Reset_Handler zusätzlich). Der GCC macht das nicht.

Deshalb wird das .thumb_func (wie oben beschrieben) für den 
Reset_Handler beim GCC benötigt.

Das .thumb_set macht etwas ähnliches, vorrangig aber definiert es einen 
Alias; in der speziellen ARM-Variante .thumb_set dann mit 
Berücksichtigung der "thumb"-Thematik.

Bin jetzt aber nicht der ARM Assembler Experte.

Kurioserweise waren früher die Startups bei STM32 in C geschrieben 
(ungefähr bis 3.0). Irgendwann sind sie auf Assembler umgestiegen, der 
Grund ist mir nicht bekannt - weiß jemand warum?.

Der Witz ist, dass in C alle Funktionen automatisch auf "thumb" getrimmt 
sind, und dass es dann im C-Startup ganz "normal" funktioniert.
Gast #2520481
Lesenswert?

Im STM32-Startupfile steht allerdings folgendes:

.section  .text.Reset_Handler
.weak  Reset_Handler
.type  Reset_Handler, %function

wodurch gcc dann halt das LSB nicht setzt.

Deshalb habe ich in der Handlertabelle das .thumb_set eingefügt (das ja 
nur beim Reset_Handler fehlte), was das gewünschte Verhalten (LSB 
gesetzt) bewirkt. Da das Startupfile von ST allerdings selbst in 
mehreren Versionen nicht dahingehend geändert wurde, kommt mir der 
Verdacht, dass ganz speziell im Eintrag für den Reset_Handler das LSB 
nicht gesetzt sein muss. Irgend wo in der STM32-Doku steht auch, dass 
das "thumb Bit" (weiß jetzt gerade das Register nicht) immer gesetzt 
ist. Dadurch wäre eigentlich für keinen einzigen Vektor das LSB 
notwendig, vor allem, da es für den Cortex-M3 definitiv keinen ARM-Modus 
gibt. Aber alle anderen Handlereinträge außer dem Reset_Handler werden 
mit .thumb_set entsprechend angepasst. Warum der Reset_Handler nicht? 
Irgend wie ist das alles nicht so ganz stimmig...

Bei Interesse suche ich nochmal die entsprechende Stelle in der Doku 
raus.

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