2010-09-16 9 views
7

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

5

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.

+4

RAM kann Werte für eine überraschend lange Zeit nach dem Ausschalten halten. – caf

+1

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. –

2

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.

10

Ü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.