Las arquitecturas de procesador modernas permiten direccionar un espacio de memoria contiguo con el mismo bus de datos, incluso cuando se accede a varios tipos de memoria (por ejemplo, RAM, ROM y Flash). Resulta que esto es bastante práctico, ya que permite a tu programa leer/escribir RAM y leer de Flash sin hacer ningún truco especial para cambiar de tipo de memoria.
Este es el mismo principio que un bus de datos externo que puede acceder a un chip RAM discreto dentro de un cierto rango de direcciones y a un chip ROM discreto dentro de un rango de direcciones diferente, incluso cuando ambos chips están en el mismo bus y dentro del mismo espacio de direcciones.
En un microcontrolador moderno, estas secciones RAM/ROM/Flash se incluyen todas juntas en la misma pieza y se puede acceder a ellas por el mismo bus de datos dentro del procesador.
Los registros de función están en RAM, y pueden ser leídos/escritos tanto como quieras sin penalización. Su ejemplo de un registro ADC que se actualiza constantemente es un buen ejemplo; RAM se utiliza para almacenar los resultados ADC en ese registro y se puede acceder en el mismo bus de datos con la memoria flash.
El código de programa suele estar en el espacio flash, y éste es (normalmente) de sólo lectura. Sin embargo, algunos procesadores permiten borrar y reescribir secciones de la memoria flash interna. Esto no es tan fácil como escribir en RAM; normalmente hay algunas instrucciones especiales que le dicen al procesador qué página borrar, etc. La mayoría de los vendedores proporcionarán una biblioteca y/o código de ejemplo para hacer esto, como en el caso del área flash emulada EEPROM que mencionaste.
En la mayoría de los microcontroladores, la escritura en la memoria flash es la transición "fácil" (los 1 se convierten en 0) y puede hacerse byte a byte. El borrado (0s de nuevo a 1s) no es tan específico y normalmente se hace en bloques (página, sector, etc.) Dado que este borrado requiere un voltaje más alto, hay una bomba de carga en el chip para generar este voltaje de borrado de flash.
Este mayor voltaje de borrado tiene dos consecuencias: los ciclos de borrado suelen ser mucho más lentos que los de lectura (hay que acumular carga y verificar el borrado), y los pulsos de alto voltaje desgastan un poco la memoria flash con cada ciclo de borrado. Por lo tanto, el borrado de la memoria flash debe hacerse con moderación.
Tienes razón en que los proveedores incorporan un margen a estas estimaciones de vida útil, pero debes tener cuidado al diseñar una aplicación que borre/escriba en flash (autoprogramación) para no desgastar la memoria flash antes de que el producto haya superado su vida útil de diseño.
0 votos
Yo pensaría que los registros de la MCU estarían en la RAM, o en registros hardware dedicados. Podrías almacenar código de programa o datos en flash, pero no estarías accediendo a ellos constantemente (y sería muy lento). Los periféricos están incluidos en la memoria mapa pero en realidad no están en la memoria física.
0 votos
"sus direcciones de memoria se solapan con el espacio flash" - ¿qué solapamiento?
1 votos
La memoria flash trasera que se ve en el mapa de memoria es sólo lectura ¡! Para escribir/borrar flash, el programa debe realizar operaciones en los registros de control. Necesitas leer sobre como funciona la flash NOR. En pocas palabras, las operaciones de escritura sólo convierten bits de uno en bits de cero. Las operaciones de borrado convierten páginas enteras de bits en todos unos. En general, la restricción de ciclo está en ciclos de borrado en cada página pero puedes escribir en una página tantas veces como quieras (pero esto no puede devolver 0 bits a 1). Esto permite escribir en bytes/palabras sucesivas sin consumir ciclos.
0 votos
@BruceAbbott En la hoja de datos de la MCU. Se afirma que todos los MCUs de la serie cortex m vienen con la flash de tamaño fijo de 4GB (algunos bloques de la misma están reservados para uso futuro es decir, nuevos periféricos añadidos, mientras que los bloques necesarios para los periféricos implementados están dedicados.