2011-07-29 7 views
28

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

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

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

Cualquier ayuda apreciada!

Saludos

Sr. Gigu

Respuesta

40

absolutamente ningún problema ...

En primer lugar obtener el puerto serie en marcha y funcionando, tengo una de las más antiguas beagleboards/recuerdo más temprano y el puerto serie y casi todo lo relacionado con la E/S es doloroso, sin embargo, obtenga un puerto serie para que pueda ver cómo arranca.

Funciona uboot Creo que y puede presionar una tecla o esc o algo así para interrumpir el arranque normal (en Linux). Desde el indicador de uboot, es fácil cargar sus primeros programas simples.

Tengo un código de beagleboard a la mano en este momento, pero no tengo mi beagleboard a mano para probarlos. Vaya al http://sam7stuff.blogspot.com/ para tener una idea de cómo mezclar un ensamblador de arranque y un código C para los programas integrados de OSless (para armar, tengo una serie de ejemplos para otras plataformas thumb/cortex-m3, pero esos arrancan un poco diferente) .

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

Necesitará el manual de referencia técnica OMAP 35x de ti.com. Busque la parte omap en su sitio OMAP3530.

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

Se proporciona un puerto RS232 individual en la BeagleBoard y proporciona acceso a la TX y líneas RX de UART3

Así que en el TRM para el OMAP búsqueda de UART3 muestra que se encuentra a una dirección base de 0x49020000. (a menudo es muy difícil encontrar la dirección completa para 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 pequeños de la dirección.)

En cuanto a los registros de uart THR_REG es donde se escriben los bytes que se enviarán los uart, tenga en cuenta que es un registro de 16 bits.

Sabiendo esto podemos hacer que 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í es 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 guión enlazador que se utiliza:

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

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

Nota se llama a la versión de linux de codesourcery, no necesita esa versión de un compilador cruzado gnu, de hecho, su código es asm solo necesita un ensamblador y un enlazador (cosas binutils). El compilador cruzado tipo arm-none-eabi -... funcionará también (suponiendo que obtienes las herramientas lite de codesourcery).

Una vez que tenga un archivo .bin, mire la ayuda en uboot, no recuerdo el comando exacto pero es probablemente un l 0x80300000 o load_xmodem o algo por el estilo. Básicamente, usted quiere x, o y z modem el archivo .bin sobre el puerto serie en el espacio de memoria para el procesador, luego use un comando o lo que sea que el comando indique a uboot que se bifurque a su programa.

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

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

Hubo algunas trampas pasando. Como uboot apareció e inicializó el puerto serie, no tuvimos que hacerlo, solo metimos bytes en el thr. pero rápidamente desbordará el almacenamiento del thr y perderá bytes, por lo que 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 y luego creará una función de tipo uart_send que sondee para transmisor vacío luego envía el byte fuera.

También olvide imprimir printf(), necesita crear su propia impresión 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. de los números que puedo depurar y ver el estado de los programas.

Por lo tanto, tome el modelo sam7 o algo similar (tenga en cuenta que las opciones de línea de comandos del compilador y el enlazador son importantes como es el orden de los archivos en la línea de comandos del enlace; el primer archivo debe ser su punto de entrada si desea la primera instrucción/palabra en el archivo .bin es su punto de entrada, que generalmente es una buena idea, ya que en el futuro usted querrá saber cómo controlar esto para arrancar desde una rom).

Probablemente puede hacer bastante sin quitar 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 un archivo .bin de flash o en algún lugar una mancha en el carnero, luego se ramifica a ella. Ahora, ramificándose a Linux, esp arm linux involucra algunas mesas de trabajo y la posible configuración de algunos registros, donde sus programas no querrán ni necesitarán eso. Básicamente, cualquiera que sea el comando que piense usar, después de haber copiado su programa en ram, lo que hará será script en un script de arranque para uboot si elige que la placa se inicie y ejecute como lo hace con Linux.

Decir que se puede utilizar JTAG y no depender de uboot a trabajar, cuando vas ese camino aunque hay probabilidades son de un cierto número de cosas que tiene que hacer en el arranque para obtener el chip en funcionamiento, en particular, la configuración de la Es probable que haya algunos divisores de reloj en alguna parte, el reloj habilita, permite E/S, varias cosas por el estilo.Por eso, el ejemplo sam7 comienza con un parpadeo en lugar de una cosa uart. El amotek jtag-tiny es un buen jtag wiggler, he estado bastante satisfecho, utilízalo todo el día en el trabajo. El beagleboard probablemente usa un pinout TI y no el pinout ARM estándar, por lo que es probable que necesite cambiar el cableado. Y no sé si OMAP te da acceso directo al controlador de toque del brazo 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 marco donde tenga una pequeña cantidad de asm para configurar la pila y la bifurcación en su código C de punto de entrada, puede comenzar a convertir ese código C en un sistema operativo o hacer lo que desee. Si miras chibios o prex u otros como este, verás que tienen un código de arranque de asm pequeño que los incorpora a su sistema. Del mismo modo, hay rutinas de depuración y no de depuración. Muchas salas van a querer usar interrupciones y no sondear para que estén vacías.

Si esta publicación no funciona y funciona con su mundo hello (permitiéndole hacer parte del trabajo), hágamelo saber y sacaré mi beagleboard y crearé un ejemplo completo. Mi placa no coincide exactamente con la tuya, pero en lo que se refiere a hello world, debería estar lo suficientemente cerca.

+0

Wow, esto es una gran cosa! Gracias por dedicar su tiempo para ayudarme, ¡muy apreciado! ¡Tan pronto como termine mi tesis, empezaré a profundizar en esto y trataré de hacerlo funcionar! ¡Tal vez debería comprar un Jtag para depurar mi beagleboard! ¡Gracias de nuevo! – MrGigu

+0

¡Finalmente encontré tiempo para jugar con el tablero y lo hice funcionar! Ahora puedo enviar un texto en la consola :) ¡Hay alguien que también usó esta publicación como referencia para su tutorial de metal desnudo, pensó que le gustaría saber! http://wiki.osdev.org/Beagleboard. Gracias OTRA VEZ – MrGigu

+0

@dwelch, amigo, estás en el mundo de los sistemas integrados. una vez más cosas increíbles. por ahora si veo una buena respuesta/artículo, podría adivinar cuál es usted. – deepak

Cuestiones relacionadas