2011-07-29 40 views
28

我剛拿到我的BeagleBoard-Xm,我想知道是否有詳細的一步一步的教程如何獲得一個非常簡單的裸機軟件在硬件上運行?Beagleboard裸機編程

我問的原因是我想深入瞭解硬件架構是如何工作的,包括bootloader,連接器,中斷,異常,MMU等。我認爲最好的方法是獲得一個簡單的Hello World程序來執行沒有操作系統的beagleboard xm。沒有什麼進展,只需啓動電路板並在屏幕上獲得「hello world」輸出。而已!

下一步將是一個微型操作系統運行,可以安排一些非常簡單的任務。沒有文件系統需要,只是爲了瞭解操作系統的基礎知識。

任何幫助表示讚賞!

問候

Gigu先生

回答

40

絕對沒問題......

首先獲得串口運行起來,我有舊/較早beagleboards之一,記得串口並且幾乎所有關於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技術參考手冊。在他們的網站OMAP3530上搜索omap部分。

還有beagleboard文檔。例如以下語句:

設在BeagleBoard的單RS232端口,並提供訪問TX和UART3

的 接收線路

所以在TRM的OMAP搜索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 
} 

注codeourcery的linux版本被調出,你不需要GNU交叉編譯器的版本,實際上是t他的asm代碼只需要彙編器和鏈接器(binutils的東西)。 arm-none-eabi -...類型的交叉編譯器也可以工作(假設你從codesourcery獲得lite工具)。

一旦你有一個.bin文件看看uboot的幫助,我不記得確切的命令,但它可能是一個0x80300000或load_xmodem或一些這樣的事情。基本上你希望x或y或z modem將串口上的.bin文件調入處理器的內存空間,然後使用go或者任何命令告訴uboot分支到你的程序。

運行時應該看到少數U字符(0x55是'U')從串口出來。前面的主要目標是獲得一個簡單的串口例程,以便您可以打印出來進行調試,或者查看您的程序正在做什麼。稍後,您可以進入圖形等,但首先使用串行端口。

有一些作弊正在進行。由於uboot啓動並初始化了我們不需要的串行端口,只是將字節插入到thr中。但很快你會溢出thr的存儲空間並丟失字節,所以你需要讀取omap的trm並找到某種指示發送器爲空的位,它已經傳輸了所有內容,然後創建一個uart_send類型函數來輪詢發送器空然後發送一個字節。

也忘記了printf(),您需要創建自己的打印數字(八進制或十六進制是最簡單的),也許是打印字符串。我整天整夜都在做這類工作,99%的時間我都用一個小例程來打印32位十六進制數字。從我可以調試的數字中查看程序的狀態。

因此,採取sam7模型或類似的東西(注意編譯器和鏈接器命令行選項是重要的,因爲鏈接命令行上的文件的順序,第一個文件必須是你的入口點,如果你想有.bin文件中的第一個指令/單詞是你的入口點,在你想知道如何控制這個從ROM引導的道路上,這通常是一個好主意。

如果你開始看uboot的基於Linux的啓動命令,你可能會做很多事情而不刪除或替換uboot,你會發現它正在將幾乎是.bin文件從閃存或某處複製到在公羊的位置,然後分支。現在分支到linux,esp arm linux涉及到一些arm表,並且可能設置一些寄存器,你的程序不需要或不需要這些寄存器。基本上你想要使用的任何命令,在將程序複製到RAM後,如果你選擇使用Linux引導並運行它,你將在引導腳本中爲uboot編寫腳本。

說你可以使用jtag而不依靠uboot工作,當你走這條路徑時,雖然在啓動時可能需要做某些事情來啓動和運行芯片,特別是配置uart可能是某個地方的幾個時鐘分頻器,時鐘使能,I/O使能,這樣的各種事情。這就是爲什麼sam7的例子是以眨眼的方式開始,而不是一個瑣事。 amotek jtag-tiny是一個很好的jtag搖擺器,我很高興,每天都在工作中使用這些。 Beagleboard可能使用TI引腳,而不是標準的ARM引腳,因此您可能需要更改佈線。而且我不知道OMAP是否可以讓你直接訪問手臂控制器,或者如果你必須做某些特定的事情。你現在最好只是暫時去uboot路線。

一旦你有一個框架,你有少量的asm來設置堆棧和分支到你的入口點C代碼,你可以開始把這個C代碼轉換成一個操作系統或做任何你想做的事情。如果你看看chibios或prex或其他喜歡它的人,你會發現他們有小的啓動代碼讓他們進入他們的系統。同樣,在那裏有uart調試和非調試例程。許多rtoses將要使用中斷,而不是輪詢thr爲空。

如果這篇文章不能讓你和你的hello世界一起運行(讓你做一些工作),讓我知道,我會挖掘我的beagleboard並創建一個完整的例子。我的主板並不完全符合你的要求,但至於世界上你好,它應該足夠接近。

+0

哇,這是偉大的東西!感謝您花時間幫助我,非常感謝!一旦我完成論文,我就會開始深入研究這個問題,並試圖讓它發揮作用!也許我應該購買一個Jtag來調試我的Beagleboard!再次感謝! – MrGigu

+0

我終於找到時間與董事會一起玩,並得到它的工作!我現在可以在控制檯上輸出一些文本:)有人也將這篇文章用作他裸機教程的參考,認爲你想知道! http://wiki.osdev.org/Beagleboard。再次感謝 – MrGigu

+0

@dwelch,兄弟,你們遍佈嵌入式系統世界。再次驚人的東西。現在,如果我看到一個很好的答案/文章,我可以猜出它。 – deepak