.texto
El segmento .text contiene el código real y está programado en la memoria Flash para microcontroladores. Puede haber más de un segmento de texto cuando hay múltiples bloques no contiguos de memoria Flash; por ejemplo, un vector de inicio y vectores de interrupción ubicados en la parte superior de la memoria, y un código que comienza en 0; o secciones separadas para un programa de arranque y principal.
.bss y .data
Hay tres tipos de datos que pueden asignarse de forma externa a una función o procedimiento; el primero es información no inicializada (históricamente llamada .bss, que también incluye los datos inicializados 0), y el segundo es inicializado (no bss), o .data. El nombre "bss" históricamente proviene de "Block Started by Symbol", utilizado en un ensamblador hace unos 60 años. Ambas áreas están ubicadas en RAM.
A medida que se compila un programa, las variables se asignarán a una de estas dos áreas generales. Durante la etapa de vinculación, todos los elementos de datos se recopilarán juntos. Todas las variables que deben inicializarse tendrán una parte de la memoria del programa reservada para mantener los valores iniciales, y justo antes de que se llame a main (), las variables se inicializarán, generalmente por un módulo llamado crt0. La sección bss se inicializa en todos los ceros por el mismo código de inicio.
Con unos pocos microcontroladores, hay instrucciones más cortas que permiten el acceso a la primera página (primeras 256 ubicaciones, a veces llamada página 0) de RAM. El compilador para estos procesadores puede reservar una palabra clave como near
para designar variables que se colocarán allí. Del mismo modo, también hay microcontroladores que solo pueden hacer referencia a ciertas áreas a través de un registro de puntero (que requiere instrucciones adicionales), y tales variables se designan far
. Finalmente, algunos procesadores pueden abordar una sección de memoria bit a bit y el compilador tendrá una forma de especificar eso (como la palabra clave bit
).
Por lo tanto, puede haber segmentos adicionales como .nearbss y .neardata, etc., donde se recopilan estas variables.
.rodata
El tercer tipo de datos externos a una función o procedimiento es como las variables inicializadas, excepto que es de solo lectura y el programa no puede modificarlo. En el lenguaje C, estas variables se denotan usando la const
palabra clave. Generalmente se almacenan como parte de la memoria flash del programa. A veces se identifican como parte de un segmento .rodata (datos de solo lectura). En los microcontroladores que usan la arquitectura Harvard , el compilador debe usar instrucciones especiales para acceder a estas variables.
apilar y apilar
La pila y el montón se colocan en RAM. Dependiendo de la arquitectura del procesador, la pila puede crecer o disminuir. Si crece, se colocará en la parte inferior de la RAM. Si crece hacia abajo, se colocará al final de la RAM. El montón usará la RAM restante no asignada a las variables, y crecerá en la dirección opuesta de la pila. El tamaño máximo de la pila y el montón generalmente se puede especificar como parámetros de enlace.
Las variables colocadas en la pila son cualquier variable definida dentro de una función o procedimiento sin la palabra clave static
. Alguna vez se llamaron variables automáticas ( auto
palabra clave), pero esa palabra clave no es necesaria. Históricamente, auto
existe porque era parte del lenguaje B que precedió a C, y allí era necesario. Los parámetros de función también se colocan en la pila.
Aquí hay un diseño típico para RAM (suponiendo que no haya una sección especial de la página 0):
EEPROM, ROM y NVRAM
Antes de que apareciera la memoria Flash, EEPROM (memoria de solo lectura programable y borrable eléctricamente) se usaba para almacenar el programa y los datos constantes (segmentos .text y .rodata). Ahora solo hay una pequeña cantidad (por ejemplo, 2KB a 8KB bytes) de EEPROM disponible, si es que hay alguna, y generalmente se usa para almacenar datos de configuración u otras pequeñas cantidades de datos que deben retenerse durante un apagado. ciclo. No se declaran como variables en el programa, sino que se escriben utilizando registros especiales en el microcontrolador. La EEPROM también puede implementarse en un chip separado y acceder a través de un bus SPI o I²C.
La ROM es esencialmente lo mismo que Flash, excepto que se programa en la fábrica (no programable por el usuario). Se usa solo para dispositivos de muy alto volumen.
NVRAM (RAM no volátil) es una alternativa a EEPROM, y generalmente se implementa como un IC externo. La RAM normal puede considerarse no volátil si está respaldada por batería; en ese caso no se necesitan métodos de acceso especiales.
Aunque los datos se pueden guardar en Flash, la memoria Flash tiene un número limitado de ciclos de borrado / programa (1000 a 10,000), por lo que no está realmente diseñada para eso. También requiere que los bloques de memoria se borren de una vez, por lo que es inconveniente actualizar solo unos pocos bytes. Está destinado a código y variables de solo lectura.
EEPROM tiene límites mucho más altos en ciclos de borrado / programa (100,000 a 1,000,000) por lo que es mucho mejor para este propósito. Si hay EEPROM disponible en el microcontrolador y es lo suficientemente grande, es donde desea guardar los datos no volátiles. Sin embargo, también tendrá que borrar primero los bloques (normalmente 4KB) antes de escribir.
Si no hay EEPROM o es demasiado pequeño, se necesita un chip externo. Una EEPROM de 32 KB tiene solo 66 ¢ y puede borrarse / escribirse hasta 1,000,000 de veces. Una NVRAM con la misma cantidad de operaciones de borrado / programa es mucho más costosa (x10) Las NVRAM son típicamente más rápidas para leer que las EEPROM, pero más lentas para escribir. Se pueden escribir en un byte a la vez, o en bloques.
Una mejor alternativa a ambos es FRAM (RAM ferroeléctrica), que tiene ciclos de escritura esencialmente infinitos (100 billones) y sin retrasos de escritura. Tiene el mismo precio que NVRAM, alrededor de $ 5 por 32 KB.