Hallo,
ich programmiere seit einem Jahr uC von Microchip und möchte nun in die
32bit Welt eintauchen. Dazu habe ich mir das neue Discoveryboard von STM
mit dem stm32F429 geholt. Als IDE habe ich mir die Keil uVision
V5.0.5.15 installiert. Nun habe ich mir mal ein Beispiel angeschaut und
frage mich wozu die unzähligen startup files gut sind ? Ich bin es von
Microchip gewohnt, einfach die Headerdatei für meinen uC einzubinden,
dann die Clock einzustellen und loszulegen. Ist das hier nicht mehr
möglich ? Außer den Startupfiles sind unter dem Reiter Device noch c
Filse für DMA,EXIT,FSMC,GPIO eingebunden. Gibt es irgendwo ein gutes
Tutorial für Einsteiger in die 32bit Welt mit uVision 5 ?
Michael
Die Frage ist doch, warum der Kern soviel Wasserkopf mitsich trägt!?
Ich finde da greifen einem dir IDEs noch nicht ausreichend unter die
Arme. Hab's damals aber auch so hinbekommen, aber bis der Kern erstmal
so funktioniert wie man will dauert es...
Ingo
Michael Hefner schrieb:> ich programmiere seit einem Jahr uC von Microchip und möchte nun in die> 32bit Welt eintauchen. Dazu habe ich mir das neue Discoveryboard von STM> mit dem stm32F429 geholt. Als IDE habe ich mir die Keil uVision> V5.0.5.15 installiert. Nun habe ich mir mal ein Beispiel angeschaut und> frage mich wozu die unzähligen startup files gut sind ? Ich bin es von> Microchip gewohnt, einfach die Headerdatei für meinen uC einzubinden,> dann die Clock einzustellen und loszulegen. Ist das hier nicht mehr> möglich ? Außer den Startupfiles sind unter dem Reiter Device noch c> Filse für DMA,EXIT,FSMC,GPIO eingebunden. Gibt es irgendwo ein gutes> Tutorial für Einsteiger in die 32bit Welt mit uVision 5 ?
Das ist bei deinem PIC und auch bei den AVRs genauso. Startup routinen
brauchts überall, wenn man C macht. Irgendwie müssen ja zB die Variablen
aus .data initialisiert werden. Oder .bss gecleared. Bei C++ wirds noch
komplizierter, da müssen auch noch statische Klassen initialisiert
werden und so späßchen. Bei den AVRs versteckt sich das eben in der AVR
Libc, bei PIC weiß ich nicht. Die anderen Files wie DMA, FSMC, GPIO sind
libs für eben diese gleichnamigen Hardware Module damit du als
Programmierer nicht jedes Register manuell beschreiben/lesen musst
insbesondere was DMA ist solltest du dir anschauen, ist verdammt
praktisch. Was EXIT ist weiß ich auf Anhieb nicht.
Der richtige Hobbybastler greift übrigens weder auf Keil noch auf die
ST-Periph Lib zurück, sondern baut sich einen gcc-arm-none-eabi, nutzt
für das grobe Zeug open source Libs (LibOpenCM3) und schreibt den rest
selbst, sonst lernt man ja nix dabei. Außerdem ist es oft einfacher
Teile einer Lib selber neu zu schreiben als zu verstehen was sich der
ursprüngliche Programmierer vielleicht dabei gedacht hat und was er
versemmelt hat.
Ingo schrieb:> Die Frage ist doch, warum der Kern soviel Wasserkopf mitsich trägt!?> Ich finde da greifen einem dir IDEs noch nicht ausreichend unter die> Arme. Hab's damals aber auch so hinbekommen, aber bis der Kern erstmal> so funktioniert wie man will dauert es...
Der Wasserkopf bei den Cortex M* hält sich stark in grenzen. Vergleich
mal die Startup Routinen mit denen eines ARM9 oder eines Cortex A8. Da
sind Welten dazwischen.
ok, wenn ich alles aus meinem Projekt rausschmeisse bis auf meine main.c
und dort dann meine Clock konfiguriere wird es mir nicht gelingen den uC
zum laufen zu bekommen ? In den startup files wird weitaus mehr als nur
die Clock konfiguriert ?
Michael Hefner schrieb:> In den startup files wird weitaus mehr als nur> die Clock konfiguriert ?
So arg viel macht der Startup-code nicht. Neben der Initialisierung der
Vektor-Tabelle (die hier nicht zu sehen ist) ist es hauptsächlich
folgendes:
Guest schrieb:> nutzt> für das grobe Zeug open source Libs (LibOpenCM3)
Weil die alle Nachteile der StdPeriphal Library übernommen hat,
unvollständig und kommerziell nicht nutzbar ist? Klingt... sinnvoll.
klausr schrieb:> __asm("ldr r0, =_sbss");> __asm("ldr r1, =_ebss");> __asm("mov r2, #0");
Und dann beten dass der Optimizer nicht auf die Idee kommt die
Anweisungen anders zu sortieren oder gar komplett rauszuwerfen weil sie
sinnlos sind für ihn? Entweder:
* Überall volatile dranschreiben
* Ein einzigen asm-Block machen, volatile dranschreiben (am
einfachsten)
* In/Out-Constraints angeben
Was auch viele nicht wissen: Neben echtem Code wie dem Startup Code
braucht es auch noch andere Sachen, wie zB ein linker script, das dem
linker sagt wo hin er was linken soll und von wo es dann ausgeführt
wird. Das hat seine ganz eigene Syntax und versteckt sich auch irgendwo
in der Lib. Genauso wie beim AVR natürlich. Verwunderlich dass so viele
meinen auf dem AVR läuft NUR der eigene Code, das ist nur bei assembler
so.
Guest schrieb:> Verwunderlich dass so viele> meinen auf dem AVR läuft NUR der eigene Code, das ist nur bei assembler> so.
Nö, auch da spielen Linkerscripte mit, aber die "laufen" natürlich nicht
auf der Zielplattform ;-)