Forum: Compiler & IDEs stm32 probleme mit Assembler für startup File


von ReinerS (Gast)


Angehängte Dateien:

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

von Werner B. (werner-b)


Lesenswert?

Nein. Cortex M3 können nur Thumb-2

The ARMv7-M is the microcontroller profile of the ARMV7 architecture and 
is different from earlier ARM architectures in that it supports Thumb-2 
instructions alone.

Ref: 2.2 in http://www.arm.com/files/pdf/IntroToCortex-M3.pdf

von ReinerS (Gast)


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

von ReinerS (Gast)


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

von Roland H. (batchman)


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:

von ReinerS (Gast)


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

von ReinerS (Gast)


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

von Roland H. (batchman)


Lesenswert?

Hattest doch Recht mit Deiner Vermutung.

Füge den ASFLAGS noch ein "-mthumb" hinzu.

von High Performer (Gast)


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?

von Roland H. (batchman)


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.

von ReinerS (Gast)


Lesenswert?

Danke Roland H., der Tip mit -mthumb war ein Volltreffer.

Gruß Reiner

von High Performer (Gast)


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.

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.