7
votes

Comment détecter la botte à froid vs botte chaude sur un processeur de bras?

Je recherche un moyen de déterminer si un processeur de bras démarre à partir d'une botte à froid (c'est-à-dire la mise sous tension initiale) par rapport à une botte chaude (c'est-à-dire une assertion de réinitialisation sans perte de puissance réelle). Spécifiquement, j'utilise un noyau Arm968, fera la détermination à l'aide de C ou de l'assemblage, et j'utiliserai la détermination de sorte que certaines opérations ne fonctionnent que sur la mise sous tension initiale et non sur des réinitialisations ultérieures. Dans des projets précédents, j'ai tiré 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 du bras.


0 commentaires

3 Réponses :


5
votes

Vous pouvez initialiser une variable globale dans la RAM à une valeur improbable pendant la 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, ce qui indique la source de la réinitialisation. Je ne sais pas si cela existe pour ce grand noyau et que vous puissiez l'utiliser.


2 commentaires

La RAM peut contenir des valeurs pour une période étonnamment longue après la mise hors tension.


L'approche variable du RAM a fonctionné. J'ai sectionné une partie de 4 octets de SRAM pour une signature de démarrage et l'exclut de la taille SRAM dans les directives de la liaison pour que rien ne puisse l'initialiser ni l'écraser, à l'exception du code de rédaction / vérification de la signature.



2
votes

Il est susceptible d'être difficile, et peut-être que vous ne voulez pas vraiment dire que le noyau lui-même. Le noyau aurait dû recevoir une réinitialisation, mais la mémoire à l'extérieur (mais peut-être toujours dans la puce). Si la mémoire est drame basée, elle peut toujours être essuyée sur le démarrage. Je ne sais pas d'une taille générique unique pour toutes les réponses. Vous et Starblue l'avez tous deux, vous devez trouver un registre quelque part qui n'est pas effacé sur une réinitialisation, définissez cela à quelque chose qui est «probable» de ne pas se produire au hasard sur une puissance. Lisez-le puis définissez-le. pense que comme le FPGA ou PLD qui gèrent la logique de réinitialisation au niveau de la carte (le cas échéant) sont les meilleurs car à la réinitialisation de la réinitialisation, ils sont également réinitialisés, et sur une réinitialisation chaleureuse, elles sont celle qui l'a causée et gardent leur état .

creuser par le TRM pour votre noyau ou via la spécification de registre pour la puce, et voyez s'il y a des registres dont l'état de réinitialisation est indéfini, celui que vous n'utilisez normalement pas et ne blessiez pas la puce si vous le définissez à quelque chose, et voir ce qu'il pouvait pouvoir, c'est là que je commencerais à chercher.


0 commentaires

10
votes

Vérifiez que les docs pour votre puce spécifique ("Arm968" n'est pas suffisamment précis). Il devrait y avoir un registre décrivant la cause de la réinitialisation. Par exemple. Voici ce que lpc23xx a: xxx


0 commentaires