embedded - Beagleboard裸机编程

标签 embedded arm beagleboard

我刚得到BeagleBoard-Xm,我想知道是否有详细的分步教程,介绍如何获取在硬件上运行的非常简单的裸机软件?

我问的原因是我想深入了解硬件体系结构的工作原理,包括引导加载程序,链接器,中断,异常,MMU等。我认为最好的方法是让一个简单的hello world程序在beagleboard xm上执行而无需一个操作系统。没什么大不了的,只要启动开发板并在屏幕上显示“hello world”输出即可。而已!

下一步将是运行一个微型操作系统,该操作系统可以安排一些非常简单的任务。不需要文件系统,只需了解操作系统的基础知识即可。

任何帮助表示赞赏!

最好的祝福

吉古先生

最佳答案

绝对没问题...

首先,要启动并运行串行端口,我有一个较早/较早的Beagleboard,并记住了串行端口以及有关I / O的所有痛苦信息,不过仍然要在其上设置一个串行端口,以便您可以看到它启动。

我认为它可以引导uboot,您可以按一个键或esc或类似的方法来中断正常引导(进入linux)。从uboot提示符很容易加载您的第一个简单程序。

目前我手头有一些Beagleboard代码,但是我手边的Beagleboard本身并不方便尝试。因此,请转到http://sam7stuff.blogspot.com/了解如何为无OS嵌入式程序混合一些启动汇编程序和C代码(对于arm,我为其他thumb / cortex-m3平台提供了许多示例,但启动方式有所不同) 。

用于事物和内存地址空间的sam7端口与beagleboard / omap完全不同。以上是您可以更改或重新发明的框架。

您将需要ti.com的OMAP 35x技术引用手册。在其网站OMAP3530上搜索omap部分。

也是Beagleboard文档。例如,以下语句:

BeagleBoard上提供了一个RS232端口,可用于访问TX和
UART3的RX线

因此,在omap的trm中搜索UART3会显示它位于基址0x49020000。 (通常很难弄清某个东西的整个地址,因为手册通常在这里有一部分内存映射,在那儿还有另一部分,并且在寄存器描述附近只调出了地址的低位。)

查看uart寄存器THR_REG是写入要发送到uart的字节的位置,请注意,它是一个16位寄存器。

知道这一点,我们可以制作第一个程序:

.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

这是一个生成文件:
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

以及使用的链接脚本:
/* rammap */
MEMORY
{
    ram : ORIGIN = 0x80300000, LENGTH = 0x10000
}

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

请注意,已从codesourcery中调用linux版本,您不需要该版本的gnu交叉编译器,实际上,此asm代码仅需要汇编程序和链接程序(binutils的东西)。 arm-none-eabi -...类型的交叉编译器也可以正常工作(假设您从codesourcery获得了lite工具)。

一旦有了.bin文件,请查看uboot上的帮助,我不记得确切的命令了,但它可能是0x80300000或load_xmodem或类似的东西。基本上,您想通过串行端口将.bin文件x或y或z调制解调器插入处理器的内存空间,然后使用go或命令告诉uboot的任何命令分支到您的程序。

您应该看到少数U字符(0x55为'U')在运行时从串行端口中出来。

首先,您的主要目标是建立一个简单的串行端口例程,以便可以打印出东西进行调试,或者查看程序在做什么。稍后您可以进入图形等,但首先使用串行端口。

一直在作弊。自从uboot出现并初始化了我们不需要的串行端口后,只需将字节推入thr中即可。但是很快,您将溢出thr的存储并丢失字节,因此您需要读取omap的trm并找到某种表示发送器为空的位,它已经发送了所有信息,然后创建了一个uart_send类型函数来轮询发送器为空,然后发送一个字节。

还忘了printf(),您需要创建自己的打印数字(八进制或十六进制是最简单的)以及可能需要打印的字符串。我整天整夜都在做这种工作,而我使用的99%的时间都是一个小的例程,可以在uart上打印32位十六进制数字。从数字我可以调试并查看程序的状态。

因此,请采用sam7模型或类似的模型(请注意,编译器和链接器命令行选项非常重要,链接命令行上的文件顺序也很重要,如果要使用第一个指令,则第一个文件必须是您的入口点/ .bin文件中的单词是您的切入点,这通常是一个好主意,因为在您想知道如何控制它以从rom引导的过程中,这通常是一个好主意。

您可能无需删除或替换uboot就可以做很多事情,如果您开始查看基于Linux的uboot引导命令,您会发现它正在将Flash中的.bin文件复制到ram或某处。 ,然后分支到它。现在分支到linux,esp arm linux涉及一些arm表并可能设置一些寄存器,您的程序将不需要或不需要它们。在将程序复制到ram之后,基本上您想使用的任何命令都是您要在uboot引导脚本中编写的脚本,如果您选择让板引导并像在Linux上那样运行。

说您可以使用jtag而不依靠uboot来工作,但是当您沿着该路径运行时,虽然可能需要在引导上进行一定数量的操作才能使芯片启动并运行,尤其是配置uart可能某个地方只有几个时钟分频器,时钟使能,I / O使能之类的东西。这就是为什么sam7示例以闪烁的方式开始显示led而不是uart的原因。 amotek jtag-tiny是一个很好的jtag wiggler,我很高兴,每天在工作中整日使用它们。 Beagleboard可能使用TI引脚而不是标准ARM引脚,因此您可能需要更改电缆。而且我不知道OMAP是否允许您直接访问 ARM 抽头 Controller ,或者是否必须执行某些特定操作。您最好暂时使用uboot路由。

一旦有了一个框架,可以在其中建立少量的asm来设置堆栈并跳转到入口点C代码,则可以开始将C代码变成OS或做任何您想做的事情。如果您查看chibios或prex或其他类似的东西,您会发现它们具有小的asm启动代码,可以将它们引导到他们的系统中。同样,那里有uart调试和非调试例程。许多rtose将要使用中断,而不是轮询thr为空。

如果这篇文章不能使您熟悉世界(让您完成一些工作),请告诉我,我将挖掘出我的beagleboard并创建一个完整的示例。我的面板与您的面板不完全匹配,但是就您好而言,它应该足够接近。

关于embedded - Beagleboard裸机编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6870712/

相关文章:

linux - 在内核构建中使用交叉编译工具

opencv - uvcvideo : Marking buffer as bad (error bit set)

c++ - 在嵌入式 x86 程序集中使用数组?

c - 头文件中的内存分配

c - 初学者 - While() - 优化

c - 更改文件(不使用 fseek 或 + 模式)或以最少的复制连接两个文件

c - 我无法理解优先级反转是如何发生的

安卓模拟器3.0内核

c++ - 如何验证 UTF-8 编码的 std::string

python - pyserial/Modbus - 故障排除 "No communication with instrument"