Ich habe mit meinem Discovery Board CooCox ein-einhalb Jahre pausiert und habe mir nun, da ich wieder was machen möchte, CooCox abermals heruntergeladen. Nun sehe ich zu meiner Verwunderung, dass sich da einiges geändert hat und ich bin nicht mal mehr in der Lage, ein simples Projekt mit meinen alten Header Files zu übersetzen. Wo sind die denn hin? Stattdessen nervt mich CooCox mit irgendwelchen Komponenten etc...Ist das ganze nun Modulbasiert geworden wie der Sch... bei DAVE? Falls ja, wie schreibe ich Programme im alten Stil? Ich hab eleider das ungute Gefühl, dass man CooCox oder die ganze Lib von STM nicht mehr verwenden kann, da die mittlerweile auf einer ganz anderen Schiene unterwegs sind. LG, Michael
Du hast nun schmerzhaft eine wichtige Lektion gelernt die da lautet:
* Das Projekt welches die Zeit überdauern soll und die IDE die
immer nur einer kurzen vergänglichen Tagesmode entspringt sollen
niemals auf Gedeih oder Verderb voneinander abhängig und auf
Ewig aneinander gekettet sein.
Nächste Schritte:
* Installiere eine nackte Toolchain (nimm das Orginal von
https://launchpad.net/gcc-arm-embedded/+download)
* Installiere Cygwin und dessen make-Paket um eine ordentliche
leistungsfähige Kommandozeilenumgebung zu haben.
* Schreibe ein Makefile (oder passe ein existierendes an) mit
dem Du das vorhandene Projekt auf der Kommandozeile bauen
kannst, ganz ohne IDE.
* Du wirst viel dabei lernen und Dinge verstehen von denen
Du vorher noch nichtmal geträumt hast, das ist Gold wert.
Wenn das geklappt hat dann:
* Installiere eine neutrale IDE (z.B. Eclipse CDT mit dem
GNU-ARM Plugin) und importiere das Prokekt als Makefile-Projekt,
also alle Compilereinstellungen, includes und defines und
der komplette Build bleiben weiterhin im Makefile, der Build
wird immer nur allein vom Makefile gesteuert, die IDE macht
nichts anderes als make all aufzurufen (und komfortabel den
Debugger bedienen natürlich).
* Jetzt kannst Du jederzeit die IDE wechseln wenn Dir Eclipse
nicht mehr gefällt oder auch einen neuen Teamkollegen mit ins
Boot holen der lieber Emacs oder Vim bevorzugt, du hast das
Projekt und dessen Build-Vorgang erfolgreich komplett von der
IDE entkoppelt und eine ganze Klasse von Kopfschmerzerregern
vollständig eliminiert, alles wird nun einfacher und weniger
widerspenstig sein.
Bernd K. schrieb: > * Installiere eine nackte Toolchain (nimm das Orginal von > https://launchpad.net/gcc-arm-embedded/+download) > > * Installiere Cygwin und dessen make-Paket um eine ordentliche > leistungsfähige Kommandozeilenumgebung zu haben. Es geht noch viel einfacher: - Man installiere wie gesagt eine Toolchain, ob das nun von launchpad ist oder z.B. yagarto oder Keil (ohne die IDE zu benutzen) oder ein IAR (ebenfalls ohne die IDE zu benutzen) IST WURSCHT. Hauptsache, man hat Compiler, Assembler, Linker, Bibliotheken und .elf-->.hex Tool lauffähig beisammen. - Man lerne, die Aufrufe von Compiler und Co selbst zu formulieren. Ersatzeshalber guckt man hier in der Lernbetty nach, wie man das tut. Da braucht man keinerlei Cygwin oder Make, die nackte Toolchain reicht völlig aus. Ich hatte genau diese Herangehensweise (Tools ohne IDE benutzen lernen) damals in der Beschreibung zur Lernbetty schon mal formuliert, habe dafür aber heftigstes Gekreische und Geflame geerntet. Tja, so gehts in der Welt.. W.S.
Hallo und danke für die Antworten ! Nachdem mir die Auseinandersetzung mit dem neuen CooCox zu blöd ist, habe ich vor - wie oben empfohlen - alles unter Eclipse und "from the scratch" zu machen. Ich habe dazu die "GNU Tools ARM Embedded" installiert und nach einer Reihe weiterer kleinen Hürden nun erstmals ein kleines Test-Programm übersetzt (ein Blinky, wobei es mir aber nicht um die Funktion geht, sondern um den reinen Übersetzungsvorgang). Das von mir erstellte make-File ist im root-Projekt-Ordner! Die Ausgabe im Eclipse (verbose mode im make aktiviert):
1 | 21:51:36 **** Build of configuration Default for project blinky_mk **** |
2 | make all |
3 | "----------------------------------------------------------------------" |
4 | "Compilation of src/blinky.c:" |
5 | "" |
6 | arm-none-eabi-gcc -c -mthumb -mcpu=cortex-m4 -g2 -Wall -O0 -DSTM32F401VC -I./src -ID:/stm32/gnu/include -ID:/stm32/discovery/STM32F4-Discovery_FW_V1.1.0/Libraries/CMSIS/Include -ID:/stm32/discovery/STM32F4-Discovery_FW_V1.1.0/Libraries/CMSIS/Include -ID:/stm32/discovery/STM32F4-Discovery_FW_V1.1.0/Libraries/CMSIS/ST/STM32F4xx/Include -ID:/stm32/discovery/STM32F4-Discovery_FW_V1.1.0/Libraries/STM32F4xx_StdPeriph_Driver/inc src/blinky.c -o src/blinky.o |
7 | "" |
8 | "----------------------------------------------------------------------" |
9 | "Linking:" |
10 | "" |
11 | arm-none-eabi-gcc -mthumb -mcpu=cortex-m4 -g2 -Wl,-Map=bin/main.map -O0 -Wl,--gc-sections -Wl,--verbose -L. -Wl,-T./ldf/discovery.ld -g -o ./bin/main.elf src/blinky.o |
12 | GNU ld (GNU Tools for ARM Embedded Processors) 2.24.0.20150604 |
13 | Supported emulations: |
14 | armelf |
15 | opened script file ./ldf/discovery.ld |
16 | using external linker script: |
17 | ================================================== |
18 | OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
19 | /* Internal Memory Map*/ |
20 | MEMORY |
21 | {
|
22 | rom (rx) : ORIGIN = 0x08000000, LENGTH = 0x00040000 |
23 | ram (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00010000 |
24 | } |
25 | |
26 | _eram = 0x20000000 + 0x00010000; |
27 | SECTIONS |
28 | {
|
29 | .text : |
30 | {
|
31 | KEEP(*(.isr_vector)) |
32 | *(.text*) |
33 | |
34 | KEEP(*(.init)) |
35 | KEEP(*(.fini)) |
36 | |
37 | /* .ctors */ |
38 | *crtbegin.o(.ctors) |
39 | *crtbegin?.o(.ctors) |
40 | *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) |
41 | *(SORT(.ctors.*)) |
42 | *(.ctors) |
43 | |
44 | /* .dtors */ |
45 | *crtbegin.o(.dtors) |
46 | *crtbegin?.o(.dtors) |
47 | *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) |
48 | *(SORT(.dtors.*)) |
49 | *(.dtors) |
50 | |
51 | *(.rodata*) |
52 | |
53 | KEEP(*(.eh_fram e*)) |
54 | } > rom |
55 | |
56 | .ARM.extab : |
57 | {
|
58 | *(.ARM.extab* .gnu.linkonce.armextab.*) |
59 | } > rom |
60 | |
61 | __exidx_start = .; |
62 | .ARM.exidx : |
63 | {
|
64 | *(.ARM.exidx* .gnu.linkonce.armexidx.*) |
65 | } > rom |
66 | __exidx_end = .; |
67 | __etext = .; |
68 | |
69 | /* _sidata is used in coide startup code */ |
70 | _sidata = __etext; |
71 | |
72 | .data : AT (__etext) |
73 | {
|
74 | __data_start__ = .; |
75 | |
76 | /* _sdata is used in coide startup code */ |
77 | _sdata = __data_start__; |
78 | |
79 | *(vtable) |
80 | *(.data*) |
81 | |
82 | . = ALIGN(4); |
83 | /* preinit data */ |
84 | PROVIDE_HIDDEN (__preinit_array_start = .); |
85 | KEEP(*(.preinit_array)) |
86 | PROVIDE_HIDDEN (__preinit_array_end = .); |
87 | |
88 | . = ALIGN(4); |
89 | /* init data */ |
90 | PROVIDE_HIDDEN (__init_array_start = .); |
91 | KEEP(*(SORT(.init_array.*))) |
92 | KEEP(*(.init_array)) |
93 | PROVIDE_HIDDEN (__init_array_end = .); |
94 | |
95 | . = ALIGN(4); |
96 | /* finit data */ |
97 | PROVIDE_HIDDEN (__fini_array_start = .); |
98 | KEEP(*(SORT(.fini_array.*))) |
99 | KEEP(*(.fini_array)) |
100 | PROVIDE_HIDDEN (__fini_array_end = .); |
101 | |
102 | KEEP(*(.jcr*)) |
103 | . = ALIGN(4); |
104 | /* All data end */ |
105 | __data_end__ = .; |
106 | |
107 | /* _edata is used in coide startup code */ |
108 | _edata = __data_end__; |
109 | } > ram |
110 | |
111 | .bss : |
112 | {
|
113 | . = ALIGN(4); |
114 | __bss_start__ = .; |
115 | _sbss = __bss_start__; |
116 | *(.bss*) |
117 | *(COMMON) |
118 | . = ALIGN(4); |
119 | __bss_end__ = .; |
120 | _ebss = __bss_end__; |
121 | } > ram |
122 | |
123 | .heap (COPY): |
124 | {
|
125 | __end__ = .; |
126 | _end = __end__; |
127 | end = __end__; |
128 | *(.heap*) |
129 | __HeapLimit = .; |
130 | } > ram |
131 | |
132 | /* .stack_dummy section doesn't contains any symbols. It is only |
133 | * used for linker to calculate size of stack sections, and assign |
134 | * values to stack symbols later */ |
135 | .co_stack (NOLOAD): |
136 | {
|
137 | . = ALIGN(8); |
138 | *(.co_stack .co_stack.*) |
139 | } > ram |
140 | |
141 | /* Set stack top to end of ram , and stack limit move down by |
142 | * size of stack_dummy section */ |
143 | __StackTop = ORIGIN(ram ) + LENGTH(ram ); |
144 | __StackLimit = __StackTop - SIZEOF(.co_stack); |
145 | PROVIDE(__stack = __StackTop); |
146 | |
147 | /* Check if data + heap + stack exceeds ram limit */ |
148 | ASSERT(__StackLimit >= __HeapLimit, "region ram overflowed with stack") |
149 | } |
150 | |
151 | ================================================== |
152 | attempt to open c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/crti.o succeeded |
153 | c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/crti.o |
154 | attempt to open c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/crtbegin.o succeeded |
155 | c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/crtbegin.o |
156 | attempt to open c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/crt0.o succeeded |
157 | c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/crt0.o |
158 | attempt to open src/blinky.o succeeded |
159 | src/blinky.o |
160 | attempt to open ./libgcc.so failed |
161 | attempt to open .\libgcc.a failed |
162 | attempt to open c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/libgcc.so failed |
163 | attempt to open c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m\libgcc.a succeeded |
164 | attempt to open ./libg.so failed |
165 | attempt to open .\libg.a failed |
166 | attempt to open c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/libg.so failed |
167 | attempt to open c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m\libg.a failed |
168 | attempt to open c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/libg.so failed |
169 | attempt to open c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m\libg.a succeeded |
170 | (c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m\libg.a)lib_a-exit.o |
171 | (c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m\libg.a)lib_a-impure.o |
172 | (c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m\libg.a)lib_a-init.o |
173 | (c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m\libg.a)lib_a-memset.o |
174 | (c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m\libg.a)lib_a-__call_atexit.o |
175 | (c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m\libg.a)lib_a-atexit.o |
176 | (c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m\libg.a)lib_a-fini.o |
177 | (c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m\libg.a)lib_a-__atexit.o |
178 | attempt to open ./libc.so failed |
179 | attempt to open .\libc.a failed |
180 | attempt to open c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/libc.so failed |
181 | attempt to open c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m\libc.a failed |
182 | attempt to open c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/libc.so failed |
183 | attempt to open c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m\libc.a succeeded |
184 | attempt to open c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/crtend.o succeeded |
185 | c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/crtend.o |
186 | attempt to open c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/crtn.o succeeded |
187 | c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/crtn.o |
188 | "" |
189 | "----------------------------------------------------------------------" |
190 | "Creation of Binary:" |
191 | "" |
192 | arm-none-eabi-objcopy -Obinary ./bin/main.elf ./bin/main.bin |
193 | "----------------------------------------------------------------------" |
194 | "Create Listing File:" |
195 | "" |
196 | arm-none-eabi-objdump -S ./bin/main.elf > ./bin/main.lst |
197 | "----------------------------------------------------------------------" |
198 | "Create Static Usage Analysis:" |
199 | "" |
200 | arm-none-eabi-size ./bin/main.elf |
201 | text data bss dec hex filename |
202 | 364 1080 32 1476 5c4 ./bin/main.elf |
203 | |
204 | 21:51:37 Build Finished (took 742ms) |
Wie man sieht ist das compilieren gut gegangen (Haupthürde war es, alle Include Pfade richtig bereitzustellen). Die Fragen: 1) Wie kann das Linken aber gut gegangen sein, wo doch Funktionen eigentlich unresolved sein sollten (z.B. RCC_AHB1PeriphClockCmd, oder die von mir provozierte my_foo() ??? Man beachte, dass ich nur das blinky.o linke, und weder andere Objects, noch Libraries angebe...RCC_AHB1PeriphClockCmd ist in einem File der CMSYS, das ich (hier einmal) gar nicht mit-übersetze! Ich stehe vor einen kleinen Rätsel...Ich habe derzeit kein Target-System parat, frage mich aber was passieren würde, wenn ich die Firmware tatsächlich ausführe... 2) Beim Blick in das log tauchen Zeilen auf wie: attempt to open c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/crti.o succeeded Warum versucht der Linker ein crti.o zu finden, und warum genau in diesem Verzeichnis?? Hat der Linker eine Liste von Default-Verzeichnissen, relativ zum Pfad des Programms arm-none-eabi.exe ? Obwohl ich mehr Fragen habe, sind es diese beiden, die mich momentan am meisten beschäftigen. Hat jemand Antworten? Vielen Dank, Michael
Hast Du eine Startupdatei, von wo aus Deine main() aufgerufen wird? Ich glaube, die hast Du vergessen...
aha...jetzt klingelt es bei mir ;-) Mein main wird ja nie aufgerufen und deshalb wird auch kein code generiert - stimmt das? Ich wollte mich um die Startup Datei später kümmern, aber das ist natürlich Unsinn... Sehe ich das so richtig?
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.