Cómo asignar automáticamente una página de flash para el almacenamiento de aplicaciones en la aplicación

2

He estado usando la gama LPC8xx de Cortex-M0 + MCU con bastante éxito. Una dificultad: estos no tienen EEPROM incorporada (para preservar la configuración a través de los ciclos de alimentación, etc.). Sin embargo, hay una solución alternativa: utilizando el programador flash en la aplicación, se puede borrar y volver a escribir una página (64 bytes) de memoria flash.

Utilicé este ejemplo: enlace que funciona.

Mi pregunta: este ejemplo codifica la dirección de flash en la que se escribirá. Esto me parece muy peligroso. ¿Hay alguna forma de asignar un bloque alineado de 64 bytes de 64 bytes en el espacio de la memoria flash para que pueda estar seguro de que es seguro escribir en él?

(Estoy usando LPCXpresso / GCC)

    
pregunta jdesbonnet

2 respuestas

1

Simplemente excluya la página principal de flash de la memoria de programa disponible en su mapa de vinculador, y la construcción debe fallar con un error en la etapa de enlace si el código del programa se desborda. Puede si desea crear una sección de datos en la página reservada y usar un pragma para colocar una estructura de datos allí, si desea codificar la dirección solo en el mapa del vinculador y en ninguna otra parte.

Por supuesto, si contempla actualizar o degradar a una parte con un tamaño de flash diferente, tendrá que moverla.

Otra posibilidad podría ser usar la segunda página flash más baja: probablemente necesite el punto más bajo para un punto de entrada (y posiblemente la tabla de vectores, si eso es inflexible). página de datos, y luego otra sección de enlace para el código de programa ordinario que se extiende hasta el límite de lo que tiene el chip actual.

Tenga en cuenta que las cargas predeterminadas pueden borrar su almacenamiento al comenzar con un borrado de flash completo.

    
respondido por el Chris Stratton
1

Podría declarar una matriz de const, que el compilador debería asignar a Flash, y usar las restricciones del compilador para forzarla a un límite de 64 bytes. En GCC, esto sería:

const char flashpage[64] __attribute__ ((aligned (64)));

Tenga en cuenta que la sintaxis puede variar según el compilador.

El compilador reconocerá ese símbolo en cualquier otro lugar que normalmente lo haría, y puedes usar flashpage como puntero a la ubicación (porque, por supuesto, flashpage es solo un const char * ).

Tenga en cuenta que una cosa que no hace es garantizar que el objeto estará en la misma ubicación en varias compilaciones. Es probable que eso no importe, ya que generalmente se borra todo el Flash cada vez que reprogramas la MCU, pero dependiendo de los detalles de tu implementación, podría hacerlo.

    
respondido por el markt

Lea otras preguntas en las etiquetas