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
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
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
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
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: |
@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
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
Hattest doch Recht mit Deiner Vermutung. Füge den ASFLAGS noch ein "-mthumb" hinzu.
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?
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.
Danke Roland H., der Tip mit -mthumb war ein Volltreffer. Gruß Reiner
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.