Así que, echando un vistazo a la hoja de datos de un controlador ARM específico, encontramos que el espacio de direcciones se asigna de la siguiente manera:
Hay varias maneras de lograrlo, una de ellas es mediante un archivo autogenerado que tiene el siguiente contenido (condensado):
; Option byte organization
;-------------------------
; Address [31:24] [23:16] [15:8] [7:0]
; 0x1FF80000 - nRDP - RDP (0xFF5500AA)
; 0x1FF80004 - nUSER - USER (0xFF870078)
; 0x1FF80008 nWRP1 nWRP0 WRP1 WRP0 (0xFFFF0000)
; 0x1FF8000C nWRP3 nWRP2 WRP3 WRP2 (0xFFFF0000)
FLASH_OPT EQU 1
RDP EQU 0xAA
nRDP EQU RDP:EOR:0xFF
WRP00 EQU 0x00
WRP01 EQU 0x00
WRP02 EQU 0x00
WRP03 EQU 0x00
nWRP00 EQU WRP00:EOR:0xFF
nWRP01 EQU WRP01:EOR:0xFF
nWRP02 EQU WRP02:EOR:0xFF
nWRP03 EQU WRP03:EOR:0xFF
USER EQU 0x78
nUSER EQU USER:EOR:0xFF
IF FLASH_OPT <> 0
AREA |.ARM.__AT_0x1FF80000|, CODE, READONLY
DCB RDP, 0x00, nRDP, 0xFF
DCB USER, 0x00, nUSER, 0xFF
DCB WRP00, WRP01, nWRP00, nWRP01
DCB WRP02, WRP03, nWRP02, nWRP03
ENDIF
Parece que este archivo está dando simplemente una forma agradable de configurar estos bytes de opción, pero ¿cómo se está haciendo? Hice un poco de investigación y resulta que el AREA
indica al ensamblador que genere una nueva área, en este caso una código área que será sólo lectura .
Además, el DCB
asigna memoria, en este caso 16 bytes, y los inicializa con los respectivos valores dados.
Mi pregunta, entonces, es ¿dónde está la especificación relativa a la ubicación de este bloque de memoria recién asignado? Es decir, ¿cómo se escribe el valor de este bloque de 16 bytes en los registros apropiados (0x1FF80000, etc)?
La única mención a esta dirección la da el |.ARM.__AT_0x1FF80000|
que se pasa a AREA
. Sin embargo, este primer argumento es sólo el nombre de esta nueva área según el documentación .
O tal vez la mejor pregunta sea: ¿Cómo podemos especificar dónde se almacenará un ÁREA en la memoria?