2010-09-16 27 views
7

Je cherche un moyen de déterminer si un processeur ARM démarre à partir d'un démarrage à froid (c'est-à-dire la mise sous tension initiale) par rapport à un démarrage à chaud (c'est-à-dire une réinitialisation sans perte de puissance réelle). Spécifiquement j'utilise un noyau ARM968, je ferai la détermination en utilisant C ou l'assemblage, et j'utiliserai la détermination de sorte que certaines opérations ne fonctionnent que lors de la mise sous tension initiale et non lors des réinitialisations suivantes. Dans les projets précédents, j'ai exploité des circuits externes (par exemple, FPGA) pour détecter les différents scénarios de démarrage, mais dans ce cas, je suis limité au noyau ARM.Comment détecter un démarrage à froid par rapport à un démarrage à chaud sur un processeur ARM?

Répondre

5

Vous pouvez initialiser une variable globale dans la RAM à une valeur qui est peu probable pendant le démarrage à froid, et vérifiez cela pendant le démarrage.

Pour les microcontrôleurs normalement, la logique de réinitialisation de la puce spécifique fournit un registre d'état qui indique la source de la réinitialisation. Je ne sais pas si cela existe pour ce noyau plus important, et si vous pourriez l'utiliser.

+4

La RAM peut contenir des valeurs pendant une durée étonnamment longue après la mise hors tension. – caf

+1

L'approche de la variable RAM a fonctionné. J'ai sectionné une portion de SRAM de 4 octets pour une signature de démarrage et l'ai exclue de la taille SRAM dans les directives du linker afin que rien ne l'initialise ou ne l'écrase à l'exception du code d'écriture/vérification de signature. –

2

Il est susceptible d'être difficile, et peut-être que vous ne voulez pas vraiment dire seulement le noyau lui-même. Le noyau aurait dû être réinitialisé, mais pas la mémoire à l'extérieur (mais peut-être encore dans la puce). si la mémoire est basée sur dram, elle peut être effacée au démarrage. Je ne connais pas de réponse unique générique. vous et Starblue l'avez cependant, vous devez trouver un registre quelque part qui n'est pas effacé lors d'une réinitialisation, réglez-le sur quelque chose qui est "susceptible" de ne pas se produire au hasard lors d'une mise sous tension. lisez-le, puis réglez-le. pense que le fpga ou pld qui gère la logique de réinitialisation au niveau de la carte (le cas échéant) sont les meilleurs parce que sur une réinitialisation de mise sous tension, ils sont réinitialisés, et sur une réinitialisation à chaud, ils sont la cause et conservent leur état . Fouiller dans le TRM pour votre cœur ou par les spécifications du registre pour la puce, et voir s'il y a des registres dont l'état de réinitialisation est indéfini, celui que vous n'utilisez pas normalement et ne blessera pas la puce si vous l'avez mis à quelque chose , et voir ce que ça alimente, c'est là que je commencerais à regarder.

10

Vérifiez les documents pour votre puce spécifique ("ARM968" n'est pas assez spécifique). Il devrait y avoir un registre qui décrit la cause de la réinitialisation. Par exemple. Voici ce que LPC23xx a:

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.