Ich suche nach einer Möglichkeit zu bestimmen, ob ein ARM-Prozessor von einem Kaltstart (d. H. Anfängliches Einschalten) im Vergleich zu einem Warmstart (d. H. Zurücksetzen der Zusicherung ohne tatsächlichen Leistungsverlust) gestartet wird. Insbesondere verwende ich einen ARM968-Kern, mache die Bestimmung mit C oder Assembly, und ich werde die Bestimmung so verwenden, dass bestimmte Operationen nur beim ersten Einschalten und nicht beim nachfolgenden Zurücksetzen ausgeführt werden. In früheren Projekten habe ich externe Schaltungen (z. B. FPGA) genutzt, um die verschiedenen Boot-Szenarien zu erkennen, aber in diesem Fall bin ich auf den ARM-Kern beschränkt.Wie erkennen Sie Kaltstart im Vergleich zu Warmstart auf einem ARM-Prozessor?
Antwort
Sie können eine globale Variable im RAM auf einen Wert initialisieren, der beim Kaltstart unwahrscheinlich ist, und beim Booten darauf achten.
Bei Mikrocontrollern stellt normalerweise die Rücksetzlogik des spezifischen Chips ein Statusregister bereit, das die Quelle des Rücksetzens angibt. Ich weiß nicht, ob das für diesen größeren Kern existiert und ob Sie das verwenden könnten.
Es wird wahrscheinlich schwierig sein, und vielleicht meinen Sie nicht nur den Kern selbst. Der Kern sollte einen Reset bekommen haben, aber die Speicher außerhalb (aber vielleicht noch innerhalb des Chips) nicht. Wenn der Speicher drambasiert ist, kann er beim Booten trotzdem gelöscht werden. Ich kenne keine generische Einheitsgröße für alle Antworten. sowohl du als auch sternblue haben es zwar, du musst irgendwo ein register finden, das bei einem reset nicht gelöscht wird, setze das auf etwas, das "wahrscheinlich" nicht zufällig beim Einschalten passiert. lese es und setze es dann. denkt, dass die fpga oder pld, die die Reset-Logik auf der Board-Ebene verwalten (falls vorhanden), die besten sind, weil sie bei einem Power-On-Reset ebenfalls zurückgesetzt werden, und bei einem Warm-Reset sind sie derjenige, der sie verursacht und ihren Zustand behält .
graben Sie durch das TRM für Ihren Kern oder durch die Registerspezifikation für den Chip, und sehen Sie, ob es irgendwelche Register gibt, deren Reset-Status nicht definiert ist und den Chip nicht verletzt, wenn Sie etwas einstellen und sehen, was es antreibt, da würde ich anfangen zu suchen.
Überprüfen Sie die Dokumentation für Ihren spezifischen Chip ("ARM968" ist nicht spezifisch genug). Es sollte ein Register geben, das die Ursache des Zurücksetzens beschreibt. Z.B. hier ist was LPC23xx hat:
Reset Source Identification Register (RSIR - 0xE01FC180)
This register contains one bit for each source of Reset. Writing a 1 to any of these bits
clears the corresponding read-side bit to 0. The interactions among the four sources are
described below.
Bit Symbol Description
0 POR Assertion of the POR signal sets this bit, and clears all of the other bits in
this register. But if another Reset signal (e.g., External Reset) remains
asserted after the POR signal is negated, then its bit is set. This bit is not
affected by any of the other sources of Reset.
1 EXTR Assertion of the RESET signal sets this bit. This bit is cleared by POR,
but is not affected by WDT or BOD reset.
2 WDTR This bit is set when the Watchdog Timer times out and the WDTRESET
bit in the Watchdog Mode Register is 1. It is cleared by any of the other
sources of Reset.
3 BODR This bit is set when the 3.3 V power reaches a level below 2.6 V.
If the VDD(DCDC)(3V3) voltage dips from 3.3 V to 2.5 V and backs up, the
BODR bit will be set to 1.
If the VDD(DCDC)(3V3) voltage dips from 3.3 V to 2.5 V and continues to
decline to the level at which POR is asserted (nominally 1 V), the BODR
bit is cleared.
if the VDD(DCDC)(3V3) voltage rises continuously from below 1 V to a level
above 2.6 V, the BODR will be set to 1.
This bit is not affected by External Reset nor Watchdog Reset.
Note: Only in case when a reset occurs and the POR = 0, the BODR bit
indicates if the VDD(DCDC)(3V3) voltage was below 2.6 V or not.
- 1. Storm Topology: Mehrere im Vergleich zu einem
- 2. req.locals im Vergleich zu res.locals im Vergleich zu res.data im Vergleich zu req.data im Vergleich zu app.locals in Express-Middleware
- 3. Zeichenfolge Vergleich nicht erkennen
- 4. Warmstart des Caches
- 5. Binäre Serialisierung im Vergleich zu JSON im Vergleich zu xml
- 6. Schwierigkeit, die Höhe einer benutzerdefinierten Ansicht auf Kaltstart zu erhalten
- 7. Alle Paare kürzester Weg - Warmstart?
- 8. ILookup im Vergleich zu IGrouping
- 9. itertools.islice im Vergleich zu Listenscheibe
- 10. AesManaged im Vergleich zu RijndaelManaged
- 11. time.time im Vergleich zu timeit.timeit
- 12. Wie funktioniert Node.js im Vergleich zu Apache?
- 13. QDBusAbstractAdaptor im Vergleich zu QDBusAbstractInterface
- 14. Dateisperrung im Vergleich zu Semaphoren
- 15. Wie schnell ist Data.Sequence.Seq im Vergleich zu []?
- 16. Spring In-Memory-Kaltstart
- 17. Xcode-Arbeitsbereich im Vergleich zu verschachtelten Projekten
- 18. REST im Vergleich zu SOAP und im Vergleich zu einfacher Website, etc
- 19. FogBugz im Vergleich zu OnTime
- 20. LocalBroadcastManager im Vergleich zu Callbacks
- 21. DoubleBuffered im Vergleich zu SetStyle
- 22. Gruppierung in einem Namespace im Vergleich zu Präfixklassen
- 23. Lambda Kaltstart mögliche Lösung?
- 24. App.Config im Vergleich zu AppName.exe.Config
- 25. XDocument.Descendants() im Vergleich zu DescendantNodes()
- 26. Spray.Routing im Vergleich zu Play.api.mvc.Controller
- 27. Arrays im Vergleich zu JSON
- 28. Drupal7 im Vergleich zu Drupal6?
- 29. Gezacktes Array im Vergleich zu einem großen Array?
- 30. Cookies im Vergleich zu Sitzungen mit CookieStore
RAM kann Werte für eine überraschend lange Zeit nach dem Ausschalten halten. – caf
Der RAM-Variablen-Ansatz funktioniert. Ich habe einen 4-Byte-Teil von SRAM für eine Boot-Signatur ausgeschnitten und ihn von der SRAM-Größe in den Linker-Direktiven ausgeschlossen, so dass nichts initialisiert oder überschrieben wird, außer für den Signatur-Schreib-/Prüfcode. –