8 votos

Ejecutar el código una vez en la vida de un programa C embebido

¿Cómo puedo hacer que un fragmento de código que se ejecute sólo una vez en la vida de un programa? Puede ser apagado y encendido varias veces. La única opción para ejecutar el fragmento de código de nuevo debe ser intermitente de la junta de nuevo.

El código es una Sección de Calibración de la que no quiero volver a correr. Si yo uso EEPROM o Flash vamos a poner un Flag a true o False. Así que Cuando nos lea primero la ubicación de la memoria de lo que sería el valor aleatorio en el que el área de memoria?

¿Cuál es el mejor método para implementar esto en C embebido?

18voto

berendi Puntos 316

Su microcontrolador podría tener algunos EEPROM, la FISCALÍA de la memoria, el usuario fuse bits, donde usted puede establecer un indicador.

No existe "el mejor método en C embebido", la escritura de la memoria no volátil es diferente en cada microcontrolador.

editar:

FLASH

Flash el contenido de la memoria se borran, mientras que la programación del dispositivo. Después de la programación, todos los bytes que no fueron escritas contienen 0xFF. Consulte la hoja de datos para encontrar un área que puede ser programado de forma segura desde dentro el funcionamiento de firmware.

EEPROM

Aunque no se garantiza en las hojas de datos, todas las memorias eeprom que he visto hasta ahora contenida 0xFF:s cuando se envían de la fábrica (excepto aquellos preprogramado con una dirección MAC única, sino que explícitamente documentados). Algunos de los aparatos de programación/software son capaces de borrar o programa EEPROM contenido demasiado. Algunos pueden ser protegida contra escritura, de forma permanente o reversible.

La FISCALÍA

Un Tiempo de memoria Programable que contiene siempre bien definidos los valores iniciales, documentado en la hoja de datos.

Siempre es una buena idea incluir una buena como la suma de comprobación CRC32 con los datos escritos, para proteger en contra de la corrupción de los datos causada por los componentes defectuosos, errores de transmisión, los rayos cósmicos, lo que sea.

13voto

Steve G Puntos 717

Usted dijo:

La única opción para ejecutar ese código debe parpadear en el tablero de nuevo.

Otros han dicho que el uso de la memoria EEPROM para almacenar una bandera para indicar cuando el run_once() la función se ha ejecutado. Sin embargo, esto tiene un problema que es que si reinicio el microcontrolador el ran_it_once bandera en la EEPROM ya ha sido establecida y la run_once() la función no se ejecutará. Si el microcontrolador ha incorporado la EEPROM a continuación, es posible borrar la ran_it_once bandera al flashear la microcontroler, si el programador soporta esto.

Una mejor manera es tener la versión de los números en la memoria EEPROM y el código. Cuando se ejecuta el código de power-up se debe leer el número de versión de la EEPROM y compararlo con el número de versión almacenada en el código. Si no coinciden, entonces el run_once() se llama a la función, y el acta final de la run_once() el código es escribir el número de versión de firmware en la memoria EEPROM. Cada vez que modifique el código fuente del firmware debe incrementar el número de versión incrustado en él.

8voto

Rob Lachlan Puntos 7880

Elegir un microcontrolador que puede escribir/borrar su propia memoria de programa. Después de ejecutar el código en cuestión, tienen la última parte de reemplazar dicho código la primera instrucción con un salto que lo. Opcionalmente, también puede borrar el resto (tal vez reemplazar con nop), por lo que hay absolutamente cero posibilidades de que alguna vez ejecutar otra vez.

Este mensaje se autodestruyen en 5..4...

5voto

Alan Puntos 4249

Como se utiliza en este código para la calibración, mi sugerencia sería la de crear una explosión de proceso que se ejecuta el código de calibración como una primera etapa y no tienen ni siquiera en el acabado de la producción de la versión de la junta. Esto es similar a la respuesta por apalopohapa, excepto diferentes en el sentido de que se habría separado en dos programa de carga: tener una explosión proceso que parpadea en el primer programa que se carga en el que todas las calibraciones y escupe los datos de que. Luego de tomar los datos y los incorpore a los datos de la segunda carga del programa.

Una ventaja de este enfoque es que usted absolutamente minimizar la cantidad de espacio de almacenamiento que usted necesita - usted no necesita almacenar su vez sólo el código, sólo los datos que genera. Por tener una explosión proceso que carga dos programas separados, también aislarse un poco de errores en el código de inicialización que podrían persistir todo lo contrario. Usted también tiene cierta flexibilidad adicional si desea volver a ejecutar el código de calibración: en lugar de tener que escribir código adicional para borrar cualquier bit indica que el código se ha ejecutado (que podría llegar accidentalmente borrado ya) simplemente vuelva a ejecutar el proceso de chorro.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X