2010-09-16 12 views
7

Sto cercando un modo per determinare se un processore ARM si sta avviando da un avvio a freddo (vale a dire accensione iniziale) rispetto a un avvio a caldo (vale a dire reset asserzione senza perdita di potenza effettiva). Specificamente sto usando un core ARM968, farò la determinazione usando C o assembly, e userò la determinazione in modo che certe operazioni vengano eseguite solo sull'accensione iniziale e non sui successivi reset. Nei progetti precedenti ho sfruttato il circuito esterno (ad esempio FPGA) per rilevare i diversi scenari di avvio, ma in questo caso sono limitato al core ARM.Come rilevare avvio a freddo o avvio a caldo su un processore ARM?

risposta

5

È possibile inizializzare una variabile globale nella RAM su un valore che è improbabile durante l'avvio a freddo e verificarlo durante l'avvio.

Per i microcontrollori normalmente la logica di reset del chip specifico fornisce un registro di stato, che indica la sorgente del reset. Non so se questo esiste per questo nucleo più grande e se puoi usarlo.

+4

RAM può contenere i valori per un tempo sorprendentemente lungo dopo lo spegnimento. – caf

+1

L'approccio variabile della RAM ha funzionato. Ho scomposto una porzione di SRAM di 4 byte per una firma di avvio e l'ho esclusa dalla dimensione SRAM nelle direttive del linker, quindi nulla sarebbe stato inizializzato o sovrascritto tranne per il codice di scrittura/controllo della firma. –

2

È probabile che sia difficile, e forse non intendi proprio il nucleo stesso. Il core avrebbe dovuto essere ripristinato, ma la memoria esterna (ma forse ancora all'interno del chip) no. se la memoria è basata su dram, potrebbe comunque essere cancellata all'avvio. Non so di una generica taglia unica adatta a tutte le risposte. sia tu che Starblue ce l'hai, devi trovare qualche registro da qualche parte che non viene cancellato in caso di reset, impostalo su qualcosa che è "probabile" che non si verifichi casualmente al momento dell'accensione. leggerlo e impostarlo. pensa che fpga o pld che gestiscono la logica di reset a livello di scheda (se ce ne sono) sono i migliori perché su un reset di accensione vengono resettati, e su un reset a caldo sono quelli che lo hanno causato e mantengono il loro stato .

scavare attraverso il TRM per il core o attraverso le specifiche di registro per il chip e vedere se ci sono registri il cui stato di reset non è definito, uno che normalmente non si usa e non danneggerà il chip se lo si imposta su qualcosa e vedere come si alimenta, è dove inizierei a cercare.

10

Controllare i documenti per il chip specifico ("ARM968" non è abbastanza specifico). Ci dovrebbe essere un registro che descriva la causa del reset. Per esempio. Ecco cosa LPC23xx ha:

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. 
Problemi correlati