Forum: Mikrocontroller und Digitale Elektronik CooCox neue Entwicklungsumgebung


von Michael W. (Gast)


Lesenswert?

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

von easy flasher (Gast)


Lesenswert?

Wo ist das Problem?
Installiere die alte Version und leg los!

von Bernd K. (prof7bit)


Lesenswert?

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.

von W.S. (Gast)


Lesenswert?

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.

von Michael W. (Gast)


Angehängte Dateien:

Lesenswert?

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

von Jope (Gast)


Lesenswert?

Hast Du eine Startupdatei, von wo aus Deine main() aufgerufen wird? Ich 
glaube, die hast Du vergessen...

von Michael W. (Gast)


Lesenswert?

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?

von Jope (Gast)


Lesenswert?

>stimmt das?

Ja.

von Michael W. (Gast)


Lesenswert?

Danke !
Ich mache dann morgen weiter.

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.