Hi Community,
wo finde ich bei meiner AVR-MCU den Low-Level-Initialisierungscode, der
gleich nach dem Systemstart, also nach der ResetException, ausgeführt
wird? D.h. der Code, der beispielsweise .data mit den entsprechenden
Werten initialisiert und .bss mit 0, der die PLLs initialisiert und so
weiter. Bisher habe ich mir da noch keine großen Gedanken gemacht, da es
immer funktioniert hat. Aber jetzt verwende ich zusätzlich eine
ARM-basierte Plattform (ATSAM3S4) und da gibt es von Atmel extra eine
board_cstartup_gnu.c, in der die ResetException implementiert ist. Dort
wird dann zunächst eine LowLevelInit-Funktion aufgerufen, in der unter
anderem die PLLs initialisiert werden, dann werden .data und .bss
initialisiert und schließlich wird explizit die main-Funktion
aufgerufen. Ich nehme mal an der Ablauf beim AVR wird ähnlich sein. Aber
wo finde ich die entsprechende Implementierung? Vielen Dank schon mal.
<Vermutung: Du meinst ATMega oder ATtiny, wenn du "AVR-MCU" schreibst>
Falls du mit GCC und AVR-Studio arbeitest, sieh dir das .lss File an.
</Vermutung>
Obs schrieb:> unter anderem die PLLs
Ich habe noch keinen Hinweis darauf gefunden, daß ein AVR überhaupt eine
PLL hat- ich weiß nur von einem Taktteiler und von einem RC-Oszillator.
Jo, es ist ein ATmega1281. Auch wenn er keine PLL hat, wird ja
vermutlich auch der RC-Oszillator eine Art Initialisierung brauchen. In
dem erwähnten LowLevelInit-Code des ATSAM3S4 steht beispielsweise auch
so etwas:
"Switch to 3-20MHz Xtal oscillator".
Sowas muss doch bei meinem ATmega1281 auch passieren? Auf jeden Fall
müssen aber .data und .bss initialisiert werden, oder nicht?
ORB schrieb:> Was muß den bei den Megas und Tinys initialisiert werden?
Stackpointer, globale Variablen?
Vermutlich gibt es in der libc o.ä. irgendwo einen Startupcode, das mit
der .lss ist da schon eine gute Idee. Ansonsten in die Doku des
Compilers gucken...
Hi
>Jo, es ist ein ATmega1281. Auch wenn er keine PLL hat, wird ja>vermutlich auch der RC-Oszillator eine Art Initialisierung brauchen.
Nein, braucht er nicht.
MfG Spess
spess53 schrieb:>> Jo, es ist ein ATmega1281. Auch wenn er keine PLL hat, wird ja>> vermutlich auch der RC-Oszillator eine Art Initialisierung brauchen.>> Nein, braucht er nicht.
Wenn überhaupt, dann würde man höchstens den clock prescaler in
CLKPR passend einstellen, dafür gibt's aber in <avr/power.h> die
passenden Funktionen (die sich auch um die timing constraints
kümmern), und es reicht in aller Regel völlig aus, wenn man dies
einfach am Anfang von main() erledigt.
Der Startup-Code steht in der avr-libc in crt1/gcrt1.S. Diese
Datei wird für jeden unterstützten Controllertyp einmal assembliert
und dann als Bestandteil der binären Bibliotheks-Distribution mit
ausgeliefert.
Hi
>Wenn überhaupt, dann würde man höchstens den clock prescaler in>CLKPR passend einstellen,...
CLKPR gehört zum gesamten Clocksystem und nicht speziell zum
RC-Oszillator.
Wenn du an dem rumfummeln willst ist OSCCAL die richtige Adresse.
MfG Spess
So weit mir bekannt, fummelt der C-Compiler nicht am Prozessor rum.
Der C-Compiler hat zwar etwas versteckten Code, der beim Start
automatisch eingefügt und ausgeführt wird, aber da geht es um
Initialisierung der C-Umgebung und des Stacks. An den
Prozessoreinstellungen, einschließlich der Fuses, darfst nur Du
rumfummeln.
Nach einem Reset oder dem Einschalten hat jeder Prozessor defaults, mit
denen er laufen kann - ist ja auch logisch.
Sollten diese Dir nicht passen, so kannst Du sie ja ändern - ist ja
sogar üblich. Der Compiler darf das aber nicht.
Anders sieht es bei einer komplexen Laufzeitumgebung aus. Der Arduino
zum Bleistift, klaut Dir am Anfang glatt 'nen ganzen Timer für seine
Millisekundenmessung und was sonst noch so benötigt wird.
Obs schrieb:> wo finde ich bei meiner AVR-MCU den Low-Level-Initialisierungscode, der> gleich nach dem Systemstart, also nach der ResetException, ausgeführt> wird?
Die Datei heisst üblicherweise Cstartup.s oder Cstartup.asm -- je nach
Compiler.
soul eye schrieb:> Die Datei heisst üblicherweise Cstartup.s oder Cstartup.asm -- je nach> Compiler.
Nein, sie heißt hier eben gcrt1.S, und sie wird üblicherweise
erstmal nicht als Sourcecode mit ausgeliefert.
Obs schrieb:> Auch wenn er keine PLL hat, wird ja> vermutlich auch der RC-Oszillator eine Art Initialisierung brauchen.
Nein, beim AVR lassen sich die Taktquellen nicht zur Laufzeit auswählen.
Das geht nur beim Programmieren über die berüchtigten Fuse-Bits
(versehentliches Aussperren möglich!).
Peter Dannegger schrieb:> Nein, beim AVR lassen sich die Taktquellen nicht zur Laufzeit auswählen.
Beim Xmega schon (ist ja letztlich auch ein AVR).
Aber auch dort erledigt man das in aller Regel am Anfang von main().
Wer es ganz dringend schon vorher braucht, kann halt die .initN-Hooks
nehmen, auf die weiter oben bereits verwiesen worden ist.
Peter Dannegger schrieb:> Nein, beim AVR lassen sich die Taktquellen nicht zur Laufzeit auswählen.
dann muss mein Tiny kein AVR sein, denn dort schalte ich zu laufzeit von
den Quarz um.
Peter II schrieb:> dann muss mein Tiny kein AVR sein, denn dort schalte ich zu laufzeit von> den Quarz um.
Eine der ganz wenigen Ausnahmen. Fast alle können das nicht. Du
müsstest also schon genauer sagen, welcher das ist … habe ich bei
Nicht-Xmegas bislang nur bein den kleinen USB-Controllern gesehen
(ATmega16U2 etc.).
Jörg Wunsch schrieb:>> dann muss mein Tiny kein AVR sein, denn dort schalte ich zu laufzeit von>> den Quarz um.>> Eine der ganz wenigen Ausnahmen. Fast alle können das nicht. Du> müsstest also schon genauer sagen, welcher das ist … habe ich bei> Nicht-Xmegas bislang nur bein den kleinen USB-Controllern gesehen> (ATmega16U2 etc.).
müsste der sein ATtiny1634 - er schein wirklich ein exot zu sein weil er
du pull-ups auch anders einschaltet. Aber ich finde das PinOut sehr gut.
Erst mal danke für die vielen Antworten. Ich habe die Datei crt1/gcrt1.S
in der avr-libc gefunden, die genau solche Dinge wie die
Interrupt-Vektoren und die Initialisierung von .data und .bss enthält.
Nach einem Blick in mein map-File habe ich jetzt gesehen, dass für die
in gcrt1.S implementierten Funktionen gegen das Object-File
avr/lib/avr51/crtm1281.o gelinkt wird. Ich vermute mal dabei handelt es
sich dann um den konkrete Umsetzung für meinen ATmega1281, richtig?