embedded - tutorial - beaglebone family
Programación Beagleboard Bare Metal. (2)
Absolutamente no hay problema ...
En primer lugar, ponga en funcionamiento el puerto serie, tengo uno de los beagleboards más antiguos / anteriores y recuerdo el puerto serie y casi todo lo relacionado con la E / S es dolorosa, sin embargo, obtenga un puerto serie para que pueda verlo arrancar.
Creo que puedes arrancar y puedes presionar una tecla o una tecla o algo así para interrumpir el arranque normal (en linux). Desde el indicador de uboot es fácil cargar sus primeros programas simples.
Tengo algún código beagleboard a la mano en este momento, pero no tengo mi propio beagleboard a mano para probarlos. Así que vaya a http://sam7stuff.blogspot.com/ para tener una idea de cómo mezclar un ensamblador de inicio y código C para programas integrados OSless (para arm, tengo una serie de ejemplos para otros pulgares / cortex-m3 plataformas, pero esas arrancan un poco diferente).
Los puertos sam7 para cosas y espacio de direcciones de memoria son totalmente diferentes del beagleboard / omap. Lo anterior es un marco que puede cambiar o reinventar.
Necesitará el manual de referencia técnica de 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 solo puerto RS232 en el BeagleBoard y proporciona acceso a las líneas TX y RX de UART3
Entonces, en el trm para el omap que busca UART3 se muestra que está en una dirección base de 0x49020000. (a menudo es muy difícil averiguar la dirección completa de algo, ya que los manuales suelen tener parte del mapa de memoria aquí y otra parte allí, y cerca de las descripciones de los registros solo se mencionan los pocos bits inferiores de la dirección).
Mirando los registros de uart, THR_REG es donde se escriben los bytes que se enviarán a la uart, tenga en cuenta que es un registro de 16 bits.
Sabiendo esto podemos realizar 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 script de enlace 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 está invocada, no necesita esa versión de un compilador cross gnu, de hecho este código asm solo necesita un ensamblador y un vinculador (cosas binutils). El compilador cruzado de tipo arm-none-eabi -... también funcionará (asumiendo 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 probable que sea un l 0x80300000 o load_xmodem o algo así. Básicamente, usted quiere que x, o y o z modem el archivo .bin a través del puerto serie en el espacio de memoria para el procesador, luego use un go o lo que sea el comando que le dice a uboot que se ramifique 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 poder imprimir cosas para depurar y, de lo contrario, ver qué están haciendo sus programas. Más tarde puede ingresar a gráficos, etc., pero primero use el puerto serie.
Había algunas trampas en marcha. Desde que surgió uboot e inicializamos el puerto serie que no teníamos que, simplemente metemos bytes en el thr. pero rápidamente desbordará el almacenamiento del thr y perderá bytes, por lo que deberá 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 crear una función de tipo uart_send que encueste Transmisor vacío luego envía un byte.
también olvídate de printf (), necesitas crear tu propia impresión un número (octal o hexadecimal son los más fáciles) y quizás 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. 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 línea de comandos del compilador y el vinculador son importantes, al igual que el orden de los archivos en la línea de comandos del enlace, el primer archivo debe ser su punto de entrada si desea tener la primera instrucción / La palabra en el archivo .bin será su punto de entrada, lo que suele ser una buena idea, ya que en el camino desea saber cómo controlar esto para arrancar desde una ROM.
Probablemente pueda 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 prácticamente un archivo .bin de flash o en algún lugar en un lugar en el ram. , luego se ramifica a ella. Ahora ramificando a linux, especialmente arm linux involucra algunas tablas de armos y la posible configuración de algunos registros, donde sus programas no lo querrán ni lo necesiten. básicamente, cualquier comando que descubras usar, después de que hayas copiado tu programa a ram, es lo que escribirás en un script de arranque para uboot si eliges hacer que la placa arranque y se ejecute como lo hace con linux.
Al decir que puede usar jtag y no confiar en que uboot funcione, cuando vaya por ese camino, es probable que haya un cierto número de cosas que debe hacer para arrancar el chip, en particular, configurar el uart es probablemente una pocos divisores de reloj en algún lugar, el reloj habilita, la E / S habilita, varias cosas así. Es por eso que el ejemplo sam7 comienza con un parpadeo del led en lugar de un uart. El amotek jtag-tiny es un buen waggler jtag, estoy bastante satisfecho, uso estos todo el día todos los días en el trabajo. El beagleboard probablemente usa un pinout de TI y no el pinout ARM estándar, por lo que es probable que tenga que cambiar el cableado. Y no sé si el OMAP le da acceso directo al controlador de derivación del brazo o si tiene que hacer algo específico. Es mejor que vayas por la ruta de 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 a su código de punto de entrada C, puede comenzar a convertir ese código C en un sistema operativo o hacer lo que desee. Si te fijas en chibios o prex u otros similares, encontrarás que tienen un pequeño código de inicio que los introduce en su sistema. Del mismo modo, hay rutinas uart debug y non-debug allí. Muchos rtoses van a querer usar interrupciones y no sondear para que estén vacías.
Si esta publicación no te ayuda a ponerte en marcha con tu mundo de saludo (te permite hacer parte del trabajo), avísame y desenterraré mi beagleboard y crearé un ejemplo completo. Mi tablero no coincide exactamente con el tuyo, pero en lo que respecta a hello world, debería estar lo suficientemente cerca.
Acabo de recibir mi BeagleBoard-Xm y me pregunto si hay tutoriales detallados paso a paso sobre cómo obtener un software simple y simple en el hardware.
La razón por la que pregunto es que quiero entender en profundidad cómo funciona la arquitectura de hardware, todo desde el cargador de arranque, los enlazadores, las interrupciones, las excepciones, la MMU, etc. Supuse que la mejor manera es obtener un programa simple hello world para ejecutar en el beagleboard xm sin un sistema operativo. Nada avanzado, solo inicie el tablero y obtenga una salida de "hola mundo" en la pantalla. ¡Eso es!
El siguiente paso sería conseguir que se ejecute un pequeño sistema operativo, que puede 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!
Atentamente
Sr. Gigu
También puedes probar TI StarterWare: