medicina meaning ingles espaƱol deuda arm

meaning - arm processor



ROM y RAM en ARM (4)

Cómo se distribuye entre ROM y RAM depende de usted, necesita decirle al vinculador dónde colocar las cosas. Idealmente, querría que el código, que es de solo lectura, esté en rom, no use ariete de grabación para eso. Del mismo modo, solo los datos de lectura pueden ir en rom. read write y zero init necesitan ir en ram.

¿Qué toolchain (basado en gcc, IAR, Keil, ARM, etc.) estás usando?

Estoy trabajando en un procesador ARM, me preguntaba si el ROM y la RAM utilizados son bastante diferentes de lo que supongo. Por ejemplo, para un programa que tiene la siguiente tabla de memoria:

Program Size: Code=1264 RO-data=16 RW-data=0 ZI-data=1384

¿Cómo se distribuye esto entre ROM y RAM?


Usted dice "diferente de lo que pensamos", como si todos piensen de la misma manera :)

Supongo que proviene de microcontroladores de gama baja que a menudo tienen espacios de direcciones de datos y programas separados. En ARM, la situación es diferente: el código del programa, los datos y los registros periféricos residen todos en el mismo espacio de memoria plana de 32 bits. Se dice que usan una arquitectura llamada "Harvard modificada": los buses de datos e instrucción están separados * (Harvard), pero usan un único espacio de memoria (Von Neumann). Por lo tanto, puede leer datos de la ROM y ejecutar programas desde la RAM sin ninguna configuración especial.

Por ejemplo, aquí está el mapa de memoria de LPC1768, un microcontrolador común Cortex-M3 de NXP.

Tenga en cuenta que en ARM más grandes, el mapa puede ser mucho más complejo, por ejemplo, hay varias regiones CS (selección de chip) para flash externo / SRAM / SDRAM u otros periféricos, que pueden o no estar conectados para cada dispositivo específico que utiliza el procesador. Sin embargo, todos siguen siendo accesibles a través del mismo espacio de memoria plana de 32 bits.

Ahora sobre la línea que citas. En una conjetura, fue producido por Keil o ARM compilador RVCT. Las abreviaturas significan lo siguiente: RO = solo lectura, RW = lectura-escritura, ZI = inicialización cero.

Cuando compila un firmware independiente para un microcontrolador (a diferencia de un programa en modo usuario que se ejecutará en un sistema operativo), al final generalmente obtiene una única imagen monolítica que se actualizará en la ROM flash y se ejecutará en el lugar. Esto está bien para el código que normalmente no se modifica, o de solo lectura (const) de datos, pero no tan bueno para escribir datos. Ahí es donde entran las regiones RW y ZI. El compilador inserta un pequeño código de arranque que toma un fragmento con los valores iniciales de los datos inicializados de la imagen ROM y los copia en RAM (esta es la región RW). Luego pone a cero el resto de la RAM utilizada (región ZI). Luego, el control se transfiere al código real escrito por el programador.

Aquí traté de ilustrar cómo se ve un programa típico para el LPC1768 mencionado anteriormente:

+-----------+ 0x1000 8000 / | Unused | | +-----------+ | | ZI data | <--(clear) | RAM +-----------+ | | RW data | <--(copy)---|---+ +-----------+ 0x1000 0000 / | | | +-----------+ 0x0008 0000 / | | Unused | | | +-----------+ | | | RW init |-------------|---+ +-----------+ | | RO data | | ROM (Flash) +-----------+ | | User code | | +-----------+ | | Boot code | | +-----------+ | | Vectors | | +-----------+ 0x0000 0000 /

Por lo tanto, para calcular el espacio ROM (flash) utilizado, debe agregar el código, los datos RO y los datos RW. La RAM utilizada será la suma de los datos RW y los datos ZI. Entonces, para su caso, es 1264 + 16 + 0 = 1280 bytes de flash y 0 + 1384 = 1384 bytes de RAM.

*: no siempre es cierto: creo que los chips Cortex-M0 tienen un solo bus de datos / instrucciones.


Lo ideal sería que el código, que es de solo lectura, esté en rom

¡Además, desea que su almacenamiento de código no sea volátil !


Igor Skochinsky te dio una buena explicación (en mi mente). Te daré según lo que pude averiguar con las herramientas de compilación KEIL para un LPC23xx.

Si tiene la posibilidad de generar el archivo de mapa después de la compilación (en IDE keil esta es una opción de casilla de verificación simple en la configuración de compilación) abra el archivo y al final verá las siguientes líneas:

Total RO Size (Code+Ro data) 36732 (35.87kB) Total RW Size (RW Data + ZI Data) 27348 (26.71kB Total ROM Size (Code + RO Data + RW Data) 36812 (35.95kB

Creo que eso se explica por sí mismo, los datos de RO residen en ROM y RW en RAM.