Forum: Mikrocontroller und Digitale Elektronik STM32F103 - Sourcery - Eclipse


von Daniel S. (acetonperoxid)


Lesenswert?

Hallo,

ich komm einfach nicht mehr weiter und hoffe hier Hilfe zu finden. Ich 
versuche mit oben genannten Tools eine funktionierende 
Entwicklungsumgebung auf die Beine zu stellen. Was aber irgendwie nicht 
klappen will. Ich bin jetzt so weit, dass das Programm anstandslos 
compiliert wird. Allerdings tut sich nix an der Hardware. Debuggen kann 
ich auch nicht wirklich.
Jetzt habe ich das Problem, dass ich garnicht weiß wo ich anfangen soll.
-Wie kann ich feststellen, ob das Linkerskript wirklich dafür sorgt, 
dass der Code an die richtige Stelle kommt?
-Wie kann ich feststelle, ob der Code überhaupt für einen Cortex-M3 
geeignet ist? In der *.lst steht an verschiedenen Stellen " <UNDEFINED> 
instruction". Etwa so:
1
 80002d4:  da0c0220   ble  0x8300b5c
2
 80002d8:  dd08320c   sfmle  f3, 4, [r8, #-48]  ; 0xffffffd0
3
 80002dc:  0c14f102   ldfeqd  f7, [r4], {2}
4
 80002e0:  020cf1c2   andeq  pc, ip, #-2147483600  ; 0x80000030
5
 80002e4:  f00cfa01       ; <UNDEFINED> instruction: 0xf00cfa01
6
 80002e8:  f102fa21       ; <UNDEFINED> instruction: 0xf102fa21
7
 80002ec:  f102e00c       ; <UNDEFINED> instruction: 0xf102e00c
8
 80002f0:  bfd80214   svclt  0x00d80214
9
 80002f4:  0c20f1c2   stfeqd  f7, [r0], #-776  ; 0xfffffcf8
Ist das normal?
-Wenn ich den Debugger anwerf, ist es so als ob das Programm immer in 
der Zeile 999 der Datei system_stm32f10x.c hängt (" StartUpCounter++; 
")
1
  /* Wait till HSE is ready and if Time out is reached exit */
2
  do
3
  {
4
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
5
    StartUpCounter++;  
6
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
das Programm erreicht nie die Zeilen 998 oder 1000. Außerdem bekomme ich 
bei jedem Klick auf "step into" o.ä. die Meldung:
1
warning: RMT ERROR : failed to get remote thread list.
Kann es sein, das an der entsprechenden Speicherstelle garnicht diese 
Zeile steht, sonder der Debugger das nur denkt? Kann ich das irgendwie 
überprüfen?

Gruß
Acetonperoxid

von This is a required field (Gast)


Lesenswert?

undefined instructions gibts, wenn der Disassembler
auf einen sogenannten 'Literal pool' trifft.
Das sind Daten, kein Code. Oder auch, wenn der Dissassembler nicht
auf Thumb-2 Code eingestellt ist.


Welchen Debugger benutzt Du?

Info, wo der Code hingelinkt wurde: > Map File

Für CM3 muss eine Compileroption, die die Codeerzeugung steuert, 
angegeben werden -> Codesourcery gcc.pdf.

Es empfiehlt sich ein Embedded-ARM Plugin zu benutzen, z.B. von Zylin
oder von Sourceforge.

von This is a required field (Gast)


Lesenswert?

>Welchen Debugger benutzt Du?

Konkret: Welchen JTAG Debugger (HW und Softw)?
Wie initialisierst Du den?
Wie lädst Du den Code auf Dein Board?

von Oliver J. (skriptkiddy)


Lesenswert?

Daniel Studer schrieb:
> Wie kann ich feststelle, ob der Code überhaupt für einen Cortex-M3
> geeignet ist?
Schau dir mal die Befehlsbreite an. Alles 32-Bit. Das spricht nicht 
dafür, dass Thumb2 Code generiert wurde. Das ist wahrscheinlich 32-Bit 
ARM-Code, welchen der CortexM3 nicht ausführen kann.

Zeig mal dein Makefile.


Gruß Oliver

von Oliver J. (skriptkiddy)


Lesenswert?

Daniel Studer schrieb:
> warning: RMT ERROR : failed to get remote thread list.

Das kommt bei mir auch und ich kann trotzdem debuggen. Also ignoriere 
das ruhig.

Gruß Oliver

von Daniel S. (acetonperoxid)


Lesenswert?

Danke erstmal.
Also:
im map-file sieht es so aus, dass ".text" auf 0x08000000 und ".data" auf 
0x20000000 gemappt wird. Sollte eigentlich richtig sein.

This is a required field schrieb:
> Für CM3 muss eine Compileroption, die die Codeerzeugung steuert,
> angegeben werden -> Codesourcery gcc.pdf.

ich compile im Moment mit:
1
O0 -std=gnu99 -Wa,-adhlns="$@.lst" -c -fmessage-length=0   -mcpu=cortex-m3 -mthumb -g -ggdb
ich hab auch mal versucht "-march=arm7" dazuzuschreiben. Das verträgt 
sich aber mit "-mcpu=cortex-m3 -mthumb" nicht. Ich werd mir dieses 
"Codesourcery gcc.pdf" mal anschauen.

This is a required field schrieb:
> Es empfiehlt sich ein Embedded-ARM Plugin zu benutzen, z.B. von Zylin
> oder von Sourceforge.
ich habe das Plugin "GNU ARM C/C++ Development Support" installiert.

This is a required field schrieb:
> Konkret: Welchen JTAG Debugger (HW und Softw)?
> Wie initialisierst Du den?
> Wie lädst Du den Code auf Dein Board?

ich flashe über die Kommandezeile mit:
1
openocd -f /usr/share/openocd/scripts/interface/jlink.cfg -f /usr/share/openocd/scripts/target/stm32f1x.cfg -c init -c "reset halt" -c "flash probe 0" -c "flash write_image erase /home/daniel/workspace/simple_Test/Debug/simple_Test.hex" -c "reset run" -c exit

zum Debuggen starte ich OpenOCD mit:
1
openocd -f /usr/share/openocd/scripts/interface/jlink.cfg -f /usr/share/openocd/scripts/target/stm32f1x.cfg

Initialisierung macht eclipse mit:
1
monitor soft_reset_halt
2
monitor wait_halt
3
monitor poll
4
monitor flash probe 0
5
monitor stm32f1x mass_erase 0
6
monitor flash write_bank 0 main.bin 0
7
monitor soft_reset_halt
8
thbreak main
9
continue

Oliver J. schrieb:
> Schau dir mal die Befehlsbreite an. Alles 32-Bit. Das spricht nicht
> dafür, dass Thumb2 Code generiert wurde. Das ist wahrscheinlich 32-Bit
> ARM-Code, welchen der CortexM3 nicht ausführen kann.
das mit der Befehlsbreite, könnte alle meine Probleme erklären. Das 
makefile wird von Eclipse generiert:
1
################################################################################
2
# Automatically-generated file. Do not edit!
3
################################################################################
4
5
-include ../makefile.init
6
7
RM := rm -rf
8
9
# All of the sources participating in the build are defined here
10
-include sources.mk
11
-include src/subdir.mk
12
-include STM32F10x_StdPeriph_Driver/src/subdir.mk
13
-include DeviceSupport/ST/STM32F10x/startup/gcc_ride7/subdir.mk
14
-include DeviceSupport/ST/STM32F10x/subdir.mk
15
-include CoreSupport/subdir.mk
16
-include subdir.mk
17
-include objects.mk
18
19
ifneq ($(MAKECMDGOALS),clean)
20
ifneq ($(strip $(C_DEPS)),)
21
-include $(C_DEPS)
22
endif
23
ifneq ($(strip $(ASM_DEPS)),)
24
-include $(ASM_DEPS)
25
endif
26
ifneq ($(strip $(S_UPPER_DEPS)),)
27
-include $(S_UPPER_DEPS)
28
endif
29
endif
30
31
-include ../makefile.defs
32
33
# Add inputs and outputs from these tool invocations to the build variables 
34
SECONDARY_FLASH += \
35
simple_Test.hex \
36
37
SECONDARY_LIST += \
38
simple_Test.lst \
39
40
SECONDARY_SIZE += \
41
simple_Test.siz \
42
43
44
# All Target
45
all: simple_Test.elf secondary-outputs
46
47
# Tool invocations
48
simple_Test.elf: $(OBJS) $(USER_OBJS)
49
  @echo 'Building target: $@'
50
  @echo 'Invoking: ARM Sourcery Linux GCC C Linker'
51
  arm-none-eabi-gcc -T"/home/daniel/workspace/simple_Test/stm32_flash.ld" -Xlinker --gc-sections -Wl,-Map,simple_Test.map -mcpu=cortex-m3 -mthumb -g -ggdb -o "simple_Test.elf" $(OBJS) $(USER_OBJS) $(LIBS)
52
  @echo 'Finished building target: $@'
53
  @echo ' '
54
55
simple_Test.hex: simple_Test.elf
56
  @echo 'Invoking: ARM Sourcery Linux GNU Create Flash Image'
57
  arm-none-eabi-objcopy -O ihex simple_Test.elf  "simple_Test.hex"
58
  @echo 'Finished building: $@'
59
  @echo ' '
60
61
simple_Test.lst: simple_Test.elf
62
  @echo 'Invoking: ARM Sourcery Linux GNU Create Listing'
63
  arm-none-eabi-objdump -h -S simple_Test.elf > "simple_Test.lst"
64
  @echo 'Finished building: $@'
65
  @echo ' '
66
67
simple_Test.siz: simple_Test.elf
68
  @echo 'Invoking: ARM Sourcery Linux GNU Print Size'
69
  arm-none-eabi-size  --format=berkeley simple_Test.elf
70
  @echo 'Finished building: $@'
71
  @echo ' '
72
73
# Other Targets
74
clean:
75
  -$(RM) $(SECONDARY_SIZE)$(OBJS)$(C_DEPS)$(ASM_DEPS)$(SECONDARY_FLASH)$(EXECUTABLES)$(SECONDARY_LIST)$(S_UPPER_DEPS) simple_Test.elf
76
  -@echo ' '
77
78
secondary-outputs: $(SECONDARY_FLASH) $(SECONDARY_LIST) $(SECONDARY_SIZE)
79
80
.PHONY: all clean dependents
81
.SECONDARY:
82
83
-include ../makefile.targets

Eigentlich dachte ich, dass die Compileroption "-mthumb" dafür sorgt, 
dass der richtige Befehlssatz verwendet wird. Wie kann es sein, dass da 
32-Bit-Code rauskommt?

von Daniel S. (acetonperoxid)


Lesenswert?

Mir ist noch etwas aufgefallen:
Das Disassembly, das in Eclipse angezeigt wird, geht bis 0x8006c8c. In 
der Ausgabe von "arm-none-eabi-objdump" geht er bis 8002ea4. Weiß jemand 
wo man in Eclipse einstellt wie das Disassembly erzeugt wird?

Außerdem habe ich jetzt mal "arm-none-eabi-objdump" mit der Option 
"-Mforce-thumb" benutzt. Dann sehe ich auch 16-Bit-Code. Offensichtlich 
kann man so ein elf-File auf verschiedene Arten interpretieren. Wie kann 
ich feststellen welcher Befehlssatz in dem *.elf-File wirklich drin ist 
bzw. welcher bei der Umwandlung von *.elf auf *.hex verwendet wird?

von Matthias K. (matthiask)


Lesenswert?

Warum nimmst Du zum Einstieg nicht gleich die "CooCox CoIDE", läuft in 5 
Minuten.

von Oliver J. (skriptkiddy)


Lesenswert?

Daniel Studer schrieb:
> Wie kann
> ich feststellen welcher Befehlssatz in dem *.elf-File wirklich drin ist
1
arm-none-eabi-readelf -A output.elf

Gruß Oliver

von Daniel S. (acetonperoxid)


Angehängte Dateien:

Lesenswert?

Oliver J. schrieb:
> Daniel Studer schrieb:
>> Wie kann
>> ich feststellen welcher Befehlssatz in dem *.elf-File wirklich drin ist
>
>
1
> arm-none-eabi-readelf -A output.elf
2
>
>
> Gruß Oliver

ok, das bringt die Ausgabe:
1
Attribute Section: aeabi
2
File Attributes
3
  Tag_CPU_name: "Cortex-M3"
4
  Tag_CPU_arch: v7
5
  Tag_CPU_arch_profile: Microcontroller
6
  Tag_THUMB_ISA_use: Thumb-2
7
  Tag_ABI_PCS_wchar_t: 4
8
  Tag_ABI_FP_denormal: Needed
9
  Tag_ABI_FP_exceptions: Needed
10
  Tag_ABI_FP_number_model: IEEE 754
11
  Tag_ABI_align_needed: 8-byte
12
  Tag_ABI_enum_size: small
13
  Tag_ABI_optimization_goals: Aggressive Debug
14
  Tag_CPU_unaligned_access: v6
sollte  also imho richtig sein.

Ich bin sowieso noch auf etwas anderes gestossen. Wenn ich das richtig 
sehe sollte doch an den Speicherstellen 0x8000004 bis 0x8000007 die 
Adresse von "Reset_Handler" stehen. dort steht allerdings die von 
"main". Das würde auch erklären warum er aus der oben genannten 
Warteschleife nicht rauskommt. Eigentlich dachte ich, dass das 
Linker-Skript in Ordnung sein sollte. Ich habe es mal angehängt. Wo 
könnte ich noch danach suchen?

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.