Programación de Beagleboard bare metal


Acabo de recibir mi BeagleBoard-Xm y me pregunto si hay algún tutorial detallado paso a paso sobre cómo obtener un software bare metal muy simple que se ejecuta en el hardware?

La razón por la que pregunto es que quiero entender profundamente cómo funciona la arquitectura de hardware, todo desde el gestor de arranque, enlazadores, interrupciones, excepciones, MMU, etc. Pensé que la mejor manera es obtener un simple programa hello world para ejecutar en el beagleboard xm sin un sistema operativo. Nada avanzado, solo encienda el tablero y obtener una salida "hola mundo" en la pantalla. ¡eso es!

El siguiente paso sería conseguir que se ejecute un pequeño sistema operativo, que pueda programar algunas tareas muy simples. No se necesita ningún sistema de archivos, solo para entender los conceptos básicos del sistema operativo.

Cualquier ayuda apreciada!

Saludos cordiales

Sr. Gigu

Author: MrGigu, 2011-07-29

2 answers

Absolutamente ningún problema...

En primer lugar tener el puerto serie en marcha, tengo uno de los beagleboards más antiguos/anteriores y recuerdo el puerto serie y casi todo sobre la E/S que es doloroso, sin embargo, obtener un puerto serie en él para que pueda verlo arrancar.

Arranca uboot creo y se puede pulsar una tecla o esc o algo así para interrumpir el arranque normal (en linux). Desde el prompt de uboot es fácil cargar sus primeros programas simples.

I tenga algo de código beagleboard a mano en este momento, pero no tenga mi beagleboard a mano para probarlos. Así que vaya a http://sam7stuff.blogspot.com/ para tener una idea de cómo mezclar algún ensamblador de inicio y código C para programas embebidos OSless (para arm, tengo una serie de ejemplos para otras plataformas thumb / cortex-m3, pero esas arrancan un poco diferente).

Los puertos sam7 para cosas y espacio de direcciones de memoria son totalmente diferentes de beagleboard/omap. Lo anterior es un marco que puede cambiar o reinventar.

Necesitará el manual de referencia de OMAP 35x techincal desde ti.com. Buscar la parte omap en su sitio OMAP3530.

También la documentación de beagleboard. Por ejemplo, esta declaración:

Se proporciona un único puerto RS232 en el BeagleBoard y proporciona acceso al TX y RX líneas de UART3

Así que en el trm para el omap buscando UART3 muestra que está en una dirección base de 0x49020000. (a menudo es muy es difícil averiguar la dirección completa de algo, ya que los manuales generalmente tienen parte del mapa de memoria aquí, y otra parte allí, y cerca de las descripciones de registro solo se llaman los pocos bits más bajos de la dirección.)

Mirando los registros de uart THR_REG es donde escribes bytes para ser enviado el uart, ten en cuenta que es un registro de 16 bits.

Sabiendo esto podemos hacer el primer programa:

.globl _start
_start:
    ldr r0,=0x49020000
    mov r1,#0x55
    strh r1,[r0]
    strh r1,[r0]
    strh r1,[r0]
    strh r1,[r0]
    strh r1,[r0]
hang: b hang

Aquí hay un makefile para ello:

ARMGNU = arm-none-linux-gnueabi

AOPS = --warn --fatal-warnings
COPS = -Wall -Werror -O2 -nostdlib -nostartfiles -ffreestanding 

uarttest.bin : uarttest.s
    $(ARMGNU)-as $(AOPS) uarttest.s -o uarttest.o
    $(ARMGNU)-ld -T rammap uarttest.o -o uarttest.elf
    $(ARMGNU)-objdump -D uarttest.elf > uarttest.list
    $(ARMGNU)-objcopy uarttest.elf -O srec uarttest.srec
    $(ARMGNU)-objcopy uarttest.elf -O binary uarttest.bin

Y el enlazador script que se utiliza:

/* rammap */
MEMORY
{
    ram : ORIGIN = 0x80300000, LENGTH = 0x10000
}

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

Tenga en cuenta que la versión de linux de codesourcery se llama, no necesita esa versión de un compilador cruzado de gnu, de hecho este código siendo asm solo necesita un ensamblador y un enlazador (cosas binutils). El brazo-ninguno-eabi -... type cross compiler también funcionará (suponiendo que obtenga las herramientas lite de codesourcery).

Una vez que tenga un.archivo bin mira la ayuda en uboot, no recuerdo el comando exacto, pero es probablemente un l 0x80300000 o load_xmodem o algo así. Básicamente quieres x, o y o z módem el .bin archivo sobre el puerto serie en el espacio de memoria para el procesador, a continuación, utilizando un go o lo que sea el comando es decir uboot a la rama a su programa.

Debería ver un puñado de caracteres U (0x55 es 'U') salir del puerto serie cuando se ejecuta.

Su objetivo principal es obtener una rutina de puerto serie simple para que pueda imprimir cosas para depurar y, de lo contrario, ver lo que están haciendo sus programas. Más tarde usted puede conseguir en gráficos, etc. pero primero use el puerto serie.

Hubo algunos engaños. Desde que uboot surgió e inicializó el puerto serie, no tuvimos que hacerlo, simplemente metiendo bytes en el thr. pero rápidamente desbordará el almacenamiento del thr y perderá bytes, por lo que luego necesitará leer el trm para el omap y encontrar algún tipo de bit que indique que el transmisor está vacío, lo ha transmitido todo, luego cree una función de tipo uart_send que sondee el transmisor vacío y luego envíe el byte fuera.

También olvídese de printf(), necesita crear su propia impresión de un número (octal o hexadecimal son los más fáciles) y tal vez imprimir cadena. Hago este tipo de trabajo todo el día y toda la noche y el 99% del tiempo todo lo que uso es una pequeña rutina que imprime números hexadecimales de 32 bits en el uart. a partir de los números puedo depurar y ver el estado de los programas.

Así que tome el modelo sam7 o algo parecido (tenga en cuenta que las opciones de la línea de comandos del compilador y del enlazador son importantes, así como el orden de archivos en la línea de comandos de enlace, el primer archivo tiene que ser su punto de entrada si desea tener la primera instrucción/palabra en el .bin archivo ser su punto de entrada, que suele ser una buena idea como en el camino que desea saber cómo controlar esto para arrancar desde una rom).

Probablemente puede hacer un poco sin eliminar o reemplazar uboot, si comienza a mirar los comandos de arranque basados en linux para uboot verá que está copiando lo que es más o menos a .archivo bin de flash o en algún lugar en un lugar en ram, luego ramificándose hacia él. Ahora ramificando a linux, esp arm linux implica algunas tablas arm y la posible configuración de algunos registros, donde sus programas no quieren o necesitan eso. básicamente, cualquier comando que decida usar, después de haber copiado su programa a la ram, es lo que escribirá en un script de arranque para uboot si elige que la placa arranque y se ejecute como lo hace con Linux.

Diciendo que puedes usar jtag y no confiar en uboot para funcionar, cuando vas que ruta aunque es probable que haya un cierto número de cosas que tiene que hacer en el arranque para conseguir el chip en marcha, en particular, la configuración de la uart es probable que algunos divisores de reloj en algún lugar, el reloj habilita, I/O habilita, varias cosas por el estilo. Es por eso que el ejemplo sam7 comienza con un parpadeo de la cosa led en lugar de una cosa uart. El amotek jtag-tiny es un buen jtag wiggler, he estado muy satisfecho, usar estos durante todo el día todos los días en el trabajo. El beagleboard probablemente usa un pinout TI y no el pinout estándar del BRAZO así que usted necesitará probablemente cambiar el cableado. Y no sé si el OMAP te da acceso directo al controlador arm tap o si tienes que hacer algo específico. Es mejor que solo vayas por la ruta uboot por el momento.

Una vez que tenga un framework donde tenga una pequeña cantidad de asm para configurar la pila y ramificar a su código C de entrypoint, puede comenzar a convertir ese código C en un sistema operativo o hacer lo que quiera. Si nos fijamos en chibios o prex o otros como que usted encontrará que tienen pequeño código de arranque asm que los pone en su sistema. Del mismo modo, hay rutinas de depuración y no depuración de uart allí. Muchos rtoses van a querer usar interrupciones y no sondear para que thr esté vacío.

Si este post no te pone en marcha con tu hello world (permitiéndote hacer parte del trabajo), házmelo saber y sacaré mi beagleboard y crearé un ejemplo completo. Mi tabla no coincide exactamente con la tuya, pero en lo que respecta a hello world, debería estar lo suficientemente cerca.

 40
Author: old_timer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-14 15:09:30

También puedes probar TI StarterWare:

Http://www.ti.com/tool/starterware-sitara

 4
Author: dhanushka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-03 03:42:56