Beagleboard 裸机编程 [英] Beagleboard bare metal programming

查看:24
本文介绍了Beagleboard 裸机编程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我刚拿到我的 BeagleBoard-Xm,我想知道是否有任何详细的分步教程来说明如何在硬件上运行一个非常简单的裸机软件?

I just got my BeagleBoard-Xm and I'm wondering if there is any detailed step by step tutorials on how to get a very simple bare metal software running on the hardware?

我问这个问题的原因是我想深入了解硬件架构的工作原理,从引导加载程序、链接器、中断、异常、MMU 等所有内容.我认为最好的方法是让一个简单的 hello world 程序在硬件上执行没有操作系统的 beagleboard xm.没什么先进的,只需启动电路板并在屏幕上显示hello world"输出.就是这样!

The reason I ask is I want to deeply understand how the hardware architecture works, everything from the bootloader, linkers, interrupts, exceptions, MMU etc. I figured the best way is to get a simple hello world program to execute on the beagleboard xm without an OS. Nothing advanced, just start up the board and get a "hello world" output on the screen. thats it!

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

The next step would be getting an tiny OS to run, that can schedule some very simple tasks. No filesystem needed, just to understand the basics of the OS.

任何帮助表示赞赏!

最好的问候

吉古先生

推荐答案

完全没问题...

首先启动并运行串行端口,我有一个较旧/较早的 beagleboards 并记住串行端口以及有关 I/O 的所有事情都是痛苦的,但是在其上安装一个串行端口,以便您可以看到它启动.

First off get the serial port up and running, I have one of the older/earlier beagleboards and remember the serial port and just about everything about the I/O being painful, nevertheless get a serial port on it so you can see it boot.

我认为它会启动 uboot,你可以按一个键或 esc 或类似的东西来中断正常的启动(进入 linux).从 uboot 提示符可以轻松加载您的第一个简单程序.

It boots uboot I think and you can press a key or esc or something like that to interrupt the normal boot (into linux). From the uboot prompt it is easy to load your first simple programs.

我现在手头有一些 beagleboard 代码,但没有我的 beagleboard 本身来尝试它们.因此,请访问 http://sam7stuff.blogspot.com/ 以了解如何混合一些启动汇编程序和用于无操作系统嵌入式程序的 C 代码(对于 arm,我有许多其他拇指/皮质-m3 平台的示例,但这些启动方式略有不同).

I have some beagleboard code handy at the moment but dont have my beagleboard itself handy to try them. So go to http://sam7stuff.blogspot.com/ to get an idea of how to mix some startup assembler and C code for OSless embedded programs (for arm, I have a number of examples out there for other thumb/cortex-m3 platforms, but those boot a little differently).

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

The sam7 ports for things and memory address space is totally different from the beagleboard/omap. The above is a framework that you can change or re-invent.

您将需要来自 ti.com 的 OMAP 35x 技术参考手册.在他们的网站 OMAP3530 上搜索 omap 部分.

You will need the OMAP 35x techincal reference manual from ti.com. Search for the omap part on their site OMAP3530.

还有 beagleboard 文档.例如这个语句:

Also the beagleboard documentation. For example this statement:

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

A single RS232 port is provided on the BeagleBoard and provides access to the TX and RX lines of UART3

所以在 omap 的 trm 中搜索 UART3 显示它位于 0x49020000 的基地址.(通常很难找出某个东西的完整地址,因为手册通常在这里有一部分内存映射,另一部分在那里,并且在寄存器描述附近,只有地址的低几位被调用.)

So in the trm for the omap searching for UART3 shows that it is at a base address of 0x49020000. (often it is very difficult to figure out the entire address for something as the manuals usually have part of the memory map here, and another part there, and near the register descriptions only the lower few bits of the address are called out.)

看uart寄存器THR_REG就是写要发送给uart的字节的地方,注意是16位寄存器.

Looking at the uart registers THR_REG is where you write bytes to be sent out the uart, note that it is a 16 bit register.

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

Knowing this we can make the first program:

.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

以及使用的链接描述文件:

And the linker script that is used:

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

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

请注意,调用了 codesourcery 的 linux 版本,您不需要那个版本的 gnu 交叉编译器,实际上这个 asm 代码只需要一个汇编器和链接器(binutils 的东西).arm-none-eabi-... 类型的交叉编译器也可以工作(假设您从 codesourcery 获得了精简版工具).

Note the linux version from codesourcery is called out, you do not need that version of a gnu cross compiler, in fact this code being asm only needs an assembler and linker (binutils stuff). The arm-none-eabi-... type cross compiler will work as well (assuming you get the lite tools from codesourcery).

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

Once you have a .bin file look at the help on uboot, I dont remember the exact command but it is probably an l 0x80300000 or load_xmodem or some such thing. Basically you want to x, or y or z modem the .bin file over the serial port into memory space for the processor, then using a go or whatever the command is tell uboot to branch to your program.

您应该在运行时看到一些 U 字符(0x55 是 'U')从串行端口出来.

You should see a handful of U characters (0x55 is 'U') come out the serial port when run.

您的主要目标是建立一个简单的串行端口例程,以便您可以打印出来进行调试,否则就可以查看您的程序在做什么.后面可以进入图形等,但是先用串口.

Your main goal up front is to get a simple serial port routine up so you can print stuff out to debug and otherwise see what your programs are doing. Later you can get into graphics, etc. but first use the serial port.

有一些作弊正在发生.由于 uboot 出现并初始化了我们不需要的串行端口,只需将字节推入 thr.但是很快你就会溢出 thr 的存储并丢失字节,所以你需要读取 omap 的 trm 并找到某种表明发射器为空的位,它已经传输了所有内容,然后创建一个 uart_send 类型的函数来轮询发送器为空,然后发送一个字节.

There was some cheating going on. Since uboot came up and initialized the serial port we didnt have to, just shove bytes into the thr. but quickly you will overflow the thr's storage and lose bytes, so you then need to read the trm for the omap and find some sort of bit that indicates the transmitter is empty, it has transmitted everything, then create a uart_send type function that polls for transmitter empty then sends the one byte out.

也忘记 printf(),你需要创建自己的打印数字(八进制或十六进制是最简单的),也许打印字符串.我整天整夜地做这种工作,99% 的时间我使用的只是一个小程序,它从 uart 打印出 32 位十六进制数字.从数字中我可以调试并查看程序的状态.

also forget about printf(), you need to create your own print a number (octal or hex are the easiest) and perhaps print string. I do this sort of work all day and all night and 99% of the time all I use is a small routine that prints 32 bit hex numbers out the uart. from the numbers I can debug and see the status of the programs.

所以采用 sam7 模型或类似的模型(注意编译器和链接器命令行选项很重要,链接命令行上的文件顺序也很重要,如果你想拥有第一个文件必须是你的入口点.bin 文件中的第一个指令/字是您的入口点,这通常是一个好主意,因为您想知道如何控制它以从 rom 启动).

So take the sam7 model or something like it (note the compiler and linker command line options are important as is the order of files on the link command line, the first file has to be your entry point if you want to have the first instruction/word in the .bin file be your entry point, which is usually a good idea as down the road you want to know how to control this for booting from a rom).

您可能可以在不删除或替换 uboot 的情况下做很多事情,如果您开始查看 uboot 的基于 linux 的引导命令,您会发现它正在将几乎是 .bin 文件的内容从闪存或某处复制到在 ram 中定位,然后分支到它.现在分支到 linux,esp arm linux 涉及一些 arm 表并可能设置一些寄存器,您的程序不需要或不需要它.基本上,无论您想使用什么命令,在将程序复制到 ram 之后,如果您选择让电路板启动并像使用 linux 一样运行,您将在 uboot 的启动脚本中编写脚本.

You can probably do quite a bit without removing or replacing uboot, if you start to look at the linux based boot commands for uboot you will see that it is copying what is pretty much a .bin file from flash or somewhere into a spot in ram, then branching to it. Now branching to linux, esp arm linux involves some arm tables and possible setting up some registers, where your programs wont want or need that. basically whatever command you figure out to use, after you have copied your program to ram, is what you will script in a boot script for uboot should you choose to have the board boot and run like it does with linux.

说你可以使用 jtag 而不是依赖 uboot 来工作,当你走那条路时,虽然你可能需要在启动时做一些事情来启动和运行芯片,特别是配置 uart某处可能有几个时钟分频器,时钟使能,I/O 使能,诸如此类.这就是为什么 sam7 示例以闪烁的 led 事物而不是 uart 事物开始的原因.amotek jtag-tiny 是一个很好的 jtag 摆动器,我一直很高兴,每天在工作中整天使用这些.beagleboard 可能使用 TI 引脚排列而不是标准 ARM 引脚排列,因此您可能需要更改布线.而且我不知道 OMAP 是否可以让您直接访问 arm tap 控制器,或者您是否必须做一些特定的事情.你最好暂时走uboot路线.

Saying that you can use jtag and not rely on uboot to work, when you go that path though there are likely a certain number of things you have to do on boot to get the chip up and running, in particular configuring the uart is likely a few clock dividers somewhere, clock enables, I/O enables, various things like that. Which is why the sam7 example starts with a blink the led thing instead of a uart thing. The amotek jtag-tiny is a good jtag wiggler, I have been quite pleased, use these all day long every day at work. The beagleboard probably uses a TI pinout and not the standard ARM pinout so you will likely need to change the cabling. And I dont know if the OMAP gives you direct access to the arm tap controller or if you have to do something ti specific. You are better off just going the uboot route for the time being.

一旦你有一个框架,你有少量的 asm 来设置堆栈和分支到你的入口点 C 代码,你就可以开始将该 C 代码转换为操作系统或做任何你想做的事情.如果你查看 chibios 或 prex 或其他类似的东西,你会发现它们有一些小的 asm 引导代码,可以让它们进入他们的系统.同样,那里有 uart 调试和非调试例程.许多 rtose 将要使用中断而不是轮询 thr 为空.

Once you have a framework where you have a small amount of asm to setup the stack and branch to your entrypoint C code, you can start to turn that C code into an OS or do whatever you want. If you look at chibios or prex or others like it you will find they have small asm boot code that gets them into their system. Likewise there are uart debug and non-debug routines in there. Many rtoses are going to want to use interrupts and not poll for thr to be empty.

如果这篇文章不能让你开始使用你的 hello world(让你做一些工作),让我知道,我会挖出我的 beagleboard 并创建一个完整的例子.我的电路板与你的不完全匹配,但就 hello world 而言,它应该足够接近.

If this post doesnt get you up and running with your hello world (letting you do some of the work), let me know and i will dig out my beagleboard and create a complete example. My board doesnt exactly match yours but as far as hello world goes it should be close enough.

这篇关于Beagleboard 裸机编程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆