Was passiert vor dem ersten Befehl auf einem µC? [geschlossen]

Ich habe kürzlich ein Buch von Elecia White (O'reilly) gelesen und bin auf eine Frage gestoßen:

  • Was passiert vor main()?

Sobald der Programmzähler bei der ersten Anweisung steht, bin ich wohl mit dem Vorgang vertraut. Aber was passiert, wenn die Spannung zum ersten Mal auf den Prozessor trifft?

Soweit ich weiß, hat jeder Prozessor eine RESET-Leitung, die aktiviert wird, bis sich alle CLK und PLL stabilisieren, aber. Mein Ablauf sieht ungefähr so ​​aus:

1) Kondensatoren sammeln alle Energie, die sie bekommen können

2) Die XTALs beginnen zu arbeiten, sobald ihre Versorgungsspannung ausreichend ist

3) Danach beginnt sich die PLL zu stabilisieren

4) ?

5) Irgendwas erkennt irgendwo, dass die Schaltungen bereit sind und löst den RESET aus

6) Gewinn!!

Welche Prozesse habe ich übersehen? Woher weiß das Etwas irgendwo, wann es den RESET auslösen soll? Und wie lange dauern diese Prozesse in der Regel?

Lesen Sie mehr über die Startsequenz des jeweiligen Mikros und über den Startcode des jeweiligen Compilers. Jetzt haben Sie genug Schlüsselwörter.
Das setzt voraus, dass die MCU eine PLL hat, nicht alle. Im Allgemeinen gibt es so oder so eine Art Zähler, der mit dem Zählen eines Stimulus beginnt (die Leistung erreicht einen bestimmten Schwellenwert, das PLL-Sperrsignal wird aktiviert, der Reset-Pin wird deaktiviert, was auch immer es sein mag).
Viele Prozessoren und Mikrocontroller haben eine interne POR-Schaltung (Power On Reset). Ein weiteres Stichwort zum Suchen.
Titel und Text stellen zwei völlig unterschiedliche Fragen. Zwischen der ersten Anweisung und main() passiert viel. Durchsuchen Sie Ihre libc nach startup.S und crt0.c (typische Namen für die Startcodedateien).

Antworten (1)

Gestern habe ich zufällig den Startprozess für den ATtiny10 gelesen , den ich in meinem nächsten Projekt verwenden werde. Es hat einen ganzen Abschnitt darüber, was es im Besonderen tut. Ich bin mir sicher, dass komplexere Prozessoren alle möglichen eingebauten Testfunktionen und andere vorbereitende Arbeiten haben, bevor es zum Bootcode springt:

8.5. Beginnend

8.5.1. Beginnend mit Reset
Das interne Reset wird sofort geltend gemacht, wenn eine Reset-Quelle aktiv wird. Der interne Reset wird aktiviert gehalten, bis die Reset-Quelle freigegeben und die Startsequenz abgeschlossen ist. Die Startsequenz umfasst die folgenden drei Schritte.

  1. Der erste Schritt, nachdem die Reset-Quelle freigegeben wurde, besteht darin, dass das Gerät die Reset-Startzeit zählt. Der Zweck dieser Reset-Anlaufzeit besteht darin, sicherzustellen, dass die Versorgungsspannung ausreichende Pegel erreicht hat. Die Reset-Anlaufzeit wird mit dem internen 128-kHz-Oszillator gezählt.

Hinweis: Die tatsächliche Versorgungsspannung wird nicht von der Anlauflogik überwacht. Das Gerät zählt bis zum Ablauf der zurückgesetzten Anlaufzeit, auch wenn das Gerät zuvor ausreichend Versorgungsspannung erreicht hat.

  1. Der zweite Schritt besteht darin, die Anlaufzeit des Oszillators zu zählen, was sicherstellt, dass der kalibrierte interne Oszillator einen stabilen Zustand erreicht hat, bevor er von den anderen Teilen des Systems verwendet wird. Der kalibrierte interne Oszillator muss für eine minimale Anzahl von Zyklen oszillieren, bevor er als stabil betrachtet werden kann.

  2. Der letzte Schritt vor dem Auslösen des internen Resets besteht darin, die Kalibrierung und die Konfigurationswerte aus dem nichtflüchtigen Speicher zu laden, um das Gerät richtig zu konfigurieren. Die Konfigurationszeit ist in der nächsten Tabelle aufgeführt.

Table 8-2:  Start-up Times when Using the Internal Calibrated
            Oscillator with Normal start-up time

| Reset | Oscillator | Configuration | Total start-up time         |  
| ----- | ---------- | ------------- | -------------------         |  
| 64 ms | 6 cycles   | 21 cycles     | 64 ms + 6 oscillator cycles |  
|       |            |               | + 21 system clock cycles    |

Anschließend wird der Reset-Vorgang beschrieben:

  1. Systemsteuerung und Reset

10.1. AVR zurücksetzen

Während des Zurücksetzens werden alle E/A-Register auf ihre Anfangswerte gesetzt, und das Programm beginnt mit der Ausführung vom Rücksetzvektor. Der am Rücksetzvektor platzierte Befehl muss ein relativer Sprungbefehl (RJMP) zur Rücksetzbehandlungsroutine sein.