MrG*_*igu 29 embedded arm beagleboard
我刚拿到了BeagleBoard-Xm,我想知道是否有关于如何在硬件上运行非常简单的裸机软件的详细分步教程?
我问的原因是我想深入了解硬件架构如何工作,从引导程序,链接器,中断,异常,MMU等等.我认为最好的方法是在beagleboard xm上执行一个简单的hello world程序而不用操作系统.没有任何进展,只需启动电路板并在屏幕上获得"hello world"输出.而已!
下一步将是运行一个小型操作系统,可以安排一些非常简单的任务.无需文件系统,只需了解操作系统的基础知识即可.
任何帮助赞赏!
最好的祝福
吉古先生
old*_*mer 41
绝对没问题......
首先让串口启动并运行,我有一个旧的/早期的beagleboard并记住串口,几乎关于I/O的一切都很痛苦,但是它上面有一个串口,所以你可以看到它启动.
它启动uboot我认为你可以按一个键或esc或类似的东西来中断正常启动(进入linux).从uboot提示符开始,您可以轻松加载第一个简单程序.
我现在有一些beagleboard代码方便,但没有我的beagleboard本身很方便尝试它们.所以请访问http://sam7stuff.blogspot.com/,了解如何为OSless嵌入式程序混合一些启动汇编程序和C代码(对于arm,我有很多其他thumb/cortex-m3的例子)平台,但那些启动有点不同).
事物和内存地址空间的sam7端口与beagleboard/omap完全不同.以上是您可以更改或重新发明的框架.
您将需要ti.com上的OMAP 35x techincal参考手册.在其站点OMAP3530上搜索omap部件.
还有beagleboard文档.例如这句话:
BeagleBoard上提供单个RS232端口,可以访问UART3的TX和RX线
因此,在omap中搜索UART3的trm显示它位于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
Run Code Online (Sandbox Code Playgroud)
这是一个makefile:
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
Run Code Online (Sandbox Code Playgroud)
以及使用的链接描述文件:
/* rammap */
MEMORY
{
ram : ORIGIN = 0x80300000, LENGTH = 0x10000
}
SECTIONS
{
.text : { *(.text*) } > ram
}
Run Code Online (Sandbox Code Playgroud)
请注意,来自codesourcery的linux版本被调出,你不需要那个版本的gnu交叉编译器,实际上这个代码只需要一个汇编器和链接器(binutils stuff).arm-none-eabi -...类型的交叉编译器也可以工作(假设你从codesourcery获得了lite工具).
一旦你有一个.bin文件看看uboot的帮助,我不记得确切的命令,但它可能是l 0x80300000或load_xmodem或某些这样的东西.基本上你想将x,或y或z调制解调器上的.bin文件通过串口进入处理器的内存空间,然后使用go或者任何命令告诉uboot分支到你的程序.
运行时,您应该看到一些U字符(0x55为'U')从串口出来.
您的主要目标是获得一个简单的串行端口例程,以便您可以打印出来进行调试,以及查看您的程序正在执行的操作.稍后你可以进入图形等,但首先使用串口.
有一些作弊行为正在进行中.由于uboot出现并初始化了我们没有的串口,只需将字节推入thr即可.但很快就会溢出thr的存储并丢失字节,所以你需要读取omap的trm并找到某种指示发送器为空的位,它已经传输了所有内容,然后创建了一个uart_send类型函数,用于轮询发送器为空然后发送一个字节.
也忘了printf(),你需要创建自己的打印数字(八进制或十六进制是最简单的),也许打印字符串.我整天都在做这种工作,而且我所使用的99%的时间都是一个小例程,可以从uart中输出32位十六进制数字.从我可以调试的数字和看到程序的状态.
所以采用sam7模型或类似的东西(注意编译器和链接器命令行选项很重要,因为链接命令行上的文件顺序,如果你想获得第一条指令,第一个文件必须是你的入口点/ .bin文件中的单词是你的入口点,这通常是一个好主意,因为你想知道如何控制它从rom启动).
你可以在不删除或替换uboot的情况下做很多事情,如果你开始查看uboot的基于linux的启动命令,你会发现它正在从闪存或某个地方将某个.bin文件复制到ram中的某个位置然后分支到它.现在分支到linux,esp arm linux涉及一些arm表并可能设置一些寄存器,你的程序不会想要或不需要它.在你将程序复制到ram之后,基本上你想要使用的任何命令,你将在uboot的启动脚本中编写脚本,如果你选择让板启动和运行就像使用linux一样.
说你可以使用jtag而不是依赖uboot来工作,当你走这条路时虽然在启动时你可能需要做一些事情才能让芯片启动并运行,特别是配置uart很可能是某些时钟分频器,时钟使能,I/O使能,各种各样的事情.这就是为什么sam7示例以闪烁的方式开始,而不是uart的东西.amotek jtag-tiny是一个很好的jtag wiggler,我一直很高兴,每天都在工作中使用这些.beagleboard可能使用TI引脚排列而非标准ARM引脚排列,因此您可能需要更改布线.而且我不知道OMAP是否允许您直接访问手臂控制器控制器,或者您是否必须执行特定的操作.你最好暂时离开uboot路线.
一旦你有一个框架,你有少量的asm来设置堆栈并分支到你的入口点C代码,你可以开始将该C代码转换为操作系统或做任何你想做的事情.如果您查看chibios或prex或其他类似的东西,您会发现它们具有小的asm启动代码,可以将它们引入系统.同样,那里有uart调试和非调试例程.许多rtoses都想要使用中断而不是轮询thr是空的.
如果这篇文章没有让你和你的hello世界一起运行(让你做一些工作),请告诉我,我将挖掘我的beagleboard并创建一个完整的例子.我的董事会并不完全匹配你的董事会,但就你好世界来说,它应该足够接近.
| 归档时间: |
|
| 查看次数: |
14755 次 |
| 最近记录: |