1 votos

Programación de bytes de opción ARM mediante directivas en ensamblador

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:

enter image description here

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?

2voto

Chad Wilamowski Puntos 1

El enlazador ARM coloca automáticamente las secciones prefijadas con __at en la dirección especificada. En el código C, se especificaría la sección utilizando el parámetro section atributo, así:

// place flash_key in a section called .ARM.__at_0x8000
long flash_key __attribute__((section(".ARM.__at_0x8000")));

Puedes controlar el comportamiento pasando --autoat o --noautoat al enlazador.

Ver Colocación de una llave en la memoria flash con una sección __at de la Guía del Usuario del Enlazador ARM para más detalles.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X