Pregunta

Estoy intentando programar ARM utilizando Eclipse + CDT + yagarto (gnu toolchain) + OpenOCD. En varios proyectos de muestra (del sitio de yagarto, por ejemplo), encontré scripts de vinculador (* .ld) donde se especificó mucha información de vinculación (junto con las definiciones de las secciones). En realidad no me he enfrentado a estos archivos antes (IAR no los necesita), y los encuentro algo difíciles de entender a primera vista. Entonces, mi pregunta es si puedo usar un solo archivo de script para mi procesador de destino (STR710FZ2T6) con todos mis proyectos o debo familiarizarme al escribir estos scripts y escribirlos para cada proyecto. Si puedo usar un solo archivo para todos los proyectos para un procesador de destino en particular, ¿podría darme un consejo donde puedo encontrar uno tan universal?

¿Fue útil?

Solución

Mi opinión es que cada tercera persona tiene un script o solución diferente. Hay una serie de problemas que deben resolverse, los distintos enlazadores los resolverán de diferentes maneras. Creo que GNU lo ha hecho demasiado difícil, si no la magia negra.

Para un sistema integrado, a menudo va a tener un flash o eeprom o alguna otra forma de memoria de solo lectura para arrancar. Al igual que otros procesadores, el ARM tiene una tabla vectorial para decirle esencialmente dónde está el código de reinicio e interrumpir, etc. Así que esa tabla debe estar en un lugar específico y usted debe decirle al vinculador que lo coloque en ese lugar específico (primero) .

Uno de los scripts que me gusta usar es:

MEMORY
{
    bob (RX) : ORIGIN = 0x0000000, LENGTH = 32K
    joe (WAIL) : ORIGIN = 0x2000000, LENGTH = 256K
}

SECTIONS
{
    JANE : { startup.o } >bob
}

Normalmente uso ram y rom como nombres en lugar de bob and joe, pero demostrando aquí que no importa cuáles sean los nombres, solo son etiquetas.

Otra variación sobre el tema:

MEMORY
{
    rom(RX)   : ORIGIN = 0x00000000, LENGTH = 0x8000
    ram(WAIL) : ORIGIN = 0x20000000, LENGTH = 0x2000
}

SECTIONS
{
    .text : { *(.text*) } > rom
}

El primero le permite colocar los archivos en la línea de comando del vinculador en cualquier orden, pero debe tener la tabla vectorial en el archivo startup.o. Este último le permite usar cualquier nombre de archivo, pero el primer archivo en el script del vinculador debe tener la tabla vectorial.

arm-thumb-elf-gcc -Wall $(COPS) vectors.o putget.o blinker2.c -T memmap -o blinker2.elf

O con ld directamente

arm-thumb-elf-ld vectors.o putget.o blinker2.o -T memmap -o blinker2.elf

El RX le dice al enlazador que ponga cosas de lectura y ejecución en esa sección de memoria y el WAIL es básicamente todo lo demás. Si solo tiene un ram, por ejemplo, puede poner todas las banderas RXWAIL en la línea que indica dónde está el ram. Dependiendo de su cargador, en ese caso, puede confiar en el archivo elf que le indica dónde iniciar el cargador o simplemente puede hacer que el punto de entrada sea el principio del binario y que el cargador sea más sencillo. Los brazos (no la corteza-m3) tienen una instrucción de bifurcación como el primer vector para el vector de reinicio, por lo que puedes pretender construir una tabla de vectores para una solución de ariete y simplemente funcionará.

Hay una serie de problemas con esta solución que no me molestan. Inicializo las variables en mi código, no durante la declaración.

Esto

int rx;

int main ( void )
{
  rx = 7;

en lugar de

int rx=7;

int main ( void )
{

Nunca asumo que una variable es cero cuando se inicia el código, siempre lo inicializo en algo antes de comenzar. El código de inicio más el script del enlazador como equipo pueden trabajar juntos para facilitar la automatización del restablecimiento del código bss y la copia de datos de inicio que no sean cero de rom a ram en el arranque. (que int rx = 7; arriba requiere un código que copia el valor 7 de algún lugar en rom y lo escribe en la ubicación de memoria en la memoria ram asignada para la variable rx para que cuando main () comience el 7 esté allí.

Mi código de inicio también es bastante simple como resultado de este método:

.globl _start
_start:
    b reset
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang

hang : b hang

reset:
    ldr sp,=0x10004000
    bl main
    b hang

Verá o leerá acerca de las soluciones que permiten que el código de inicio y la secuencia de comandos del vinculador trabajen juntos para no tener que usar los punteros de la pila de código fijo, el espacio de almacenamiento dinámico, cosas como esas, de nuevo, puede poner mucho trabajo en un inicio complicado Las secuencias de comandos de código y vinculador para obtener cierta automatización y quizás guardar algo de trabajo, tal vez no. La automatización, si / cuando funciona, puede y reducirá el error humano, y eso puede ser bueno, también si cambia los chips a menudo o intenta escribir un bit de código que funciona en una familia de chips, también puede querer esta automatización. .

Mi conclusión es SÍ, puede vivir con un solo script de vinculador para todo su trabajo de ARM. Pero tienes que adaptar tu trabajo a ese guión. Es probable que no encuentre un script que funcione con el código de ejemplo de todos. Cuanto más complicado sea el guión, más difícil será pedir prestado. Sí, es probable que mis scripts anteriores se puedan hacer en la línea de comandos de ld, pero hace mucho tiempo cuando (gcc 2.95) no pude hacer que funcionara, así que desarrollé el script mínimo anterior y los he estado usando desde entonces. Tuve que modificar el segundo script por algún motivo, pero con 4.x.x, sin duda 4.4.x puedo usar cualquiera de los dos.

Otros consejos

No hay un script de enlace universal. Estos scripts son muy importantes, ya que definen en qué parte de la memoria (RAM o ROM) se ubicarán las distintas secciones de datos y programas. Hay algo equivalente en los compiladores IAR (archivos xcl si recuerdo correctamente). Obviamente solo has usado los predeterminados hasta ahora.

Hay un buen documento sobre STR7xx llamado " Uso de herramientas de código abierto para STR7xx Cross Desarrollo " ;. Puedes encontrar un enlace en la página de inicio de yagarto. Le recomiendo que lo mire e intente comprender cómo funcionan los archivos del enlazador. También hay algunos otros archivos de configuración que necesita tener un poco de comprensión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top