www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zu Atmelcode


Autor: Marcel K. (viewer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
ich habe eine Frage bezüglich eines Beispielprogramms. Es handelt sich 
um ein Beispiel für das AT90USBKEY. Das Beispielprogramm wurde von Atmel 
geschrieben. Ich versuche jetzt einiges zu verstehen aber das ist gar 
nicht so leicht. Das fängt leider schon in der main.c an. Bei mir sieht 
die main.c meistens so irgendwie aus:


int main(void)
{
Initialisierung von Variablen, uart, lcd, …

while (1)
  {
    ev. aufruf von Funktionen…
  }
}

Bei dem Atmelbeispiel sieht das allerdings so aus:

int main(void)
{
  wdtdrv_disable();
  Clear_prescaler();
  scheduler();
  return 0;
}

//! \name Procedure to speed up the startup code
//! This one increment the CPU clock before RAM initialisation
//! @{
#ifdef  _GNUC_
// Locate low level init function before RAM init (init3 section)
// and remove std prologue/epilogue
char __low_level_init(void) _attribute_ ((section (".init3"),naked));
#endif


char __low_level_init()
{
  Clear_prescaler();
  return 1;
}

Jetzt habe ich da ein paar Fragen.
Wann wird denn die Funktion „__low_level_init(void)“ aufgerufen? Wird 
main nur einmal aufgerufen? Wo ist denn da die „Endlosschleife“? Was 
mich eigentlich am meisten interesiert ist, was macht die Funktion 
„__low_level_init(void)“ eigentlich? Was ist damit gemeint, dass diese 
Prozedur den startup code beschleunigt? Was wird da gemacht bevor der 
RAM initialisiert wird und was passiert beim initialisieren des RAM’s?

Dann gibt er da den „Scheduler“. Was macht denn ein Scheduler? Beim 
überfliegen des Codes fällt mir auf, dass im Scheduler eigentlich nur 
der Ablauf des Programms gemanagt wird. Aber ein Code im Controller 
läuft doch eh sequenziell ab, also läuft doch alles nacheinander ab. 
Oder wird so etwas verwendet um z.B. etwa in einem „Durchlauf“ zweimal, 
statt nur einmal in einem Durchlauf aufzurufen?

Bin über jede Antwort sehr dankbar.
Gruß Marcel

Autor: Benni L. (sutter_cain)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zum Sheduler findet man sehr viel im Internet denke ich:
http://de.wikipedia.org/wiki/Prozess-Scheduler

dieser plant die zeitliche ausführung der Tasks hintereinander. Somit 
vermute ich auch eine Endlosschleife in der Funktion scheduler().

main() wird immer nur ein einziges mal aufgerufen, so viel ist sicher.


Marcel K. schrieb:
> Bei dem Atmelbeispiel

Kannst du das ein wenig genauer spezifizieren, damit man evtl. selbst 
man in den Code schauen kann? Am besten mit Link.

Was low_level_init() macht kann ich dir nun auch nicht auf die schnelle 
sagen. In eigentlich jeder Entwicklungsumgebung kannst du über alle 
Dateien suchen, such doch einfach mal nach dieser Funktion, dann wirst 
du bestimmt finden wo sie aufgerufen wird.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.