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.
Was muß den bei den Megas und Tinys initialisiert werden? Alles was Du nicht im Programm festlegst (Clocksource, BOD, ...) steht in den Fuses.
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?
Obs schrieb: > Ich vermute mal dabei handelt es sich dann um den konkrete Umsetzung für > meinen ATmega1281, richtig? Genau so ist es.
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.