web-dev-qa-db-ja.com

Beagleboardベアメタルプログラミング

BeagleBoard-Xmを入手したばかりですが、ハードウェア上で非常に単純なベアメタルソフトウェアを実行する方法について、詳細なステップバイステップのチュートリアルがあるかどうか疑問に思っています。

私が尋ねる理由は、ハードウェアアーキテクチャがどのように機能するか、ブートローダー、リンカー、割り込み、例外、MMUなど)からすべてを深く理解したいからです。私は、簡単なhelloを取得するのが最善の方法だと考えました。 OSなしでビーグルボードxmで実行するワールドプログラム。何も進んでいません。ボードを起動して、画面に「ハローワールド」出力を表示するだけです。それだけです。

次のステップは、いくつかの非常に単純なタスクをスケジュールできる小さなOSを実行することです。 OSの基本を理解するためだけに、ファイルシステムは必要ありません。

助けていただければ幸いです。

宜しくお願いします

ギグさん

29
MrGigu

全く問題ありません...

まず、シリアルポートを起動して実行します。私は、古い/以前のビーグルボードの1つを持っており、シリアルポートと、I/Oのほとんどすべてが苦痛であることを覚えていますが、シリアルポートを取得して、起動を確認できるようにします。

それは私が思うubootを起動し、あなたは通常の起動(Linuxへの)を中断するためにキーまたはescまたはそのようなものを押すことができます。 ubootプロンプトから、最初の単純なプログラムを簡単にロードできます。

現時点ではビーグルボードのコードがいくつかありますが、ビーグルボード自体を試してみるのは便利ではありません。したがって、 http://sam7stuff.blogspot.com/ にアクセスして、OSless組み込みプログラム用のスタートアップアセンブラーとCコードを組み合わせる方法を理解してください(armの場合、いくつかの例があります)他のthumb/cortex-m3プラットフォームの場合ですが、起動方法が少し異なります)。

モノとメモリアドレス空間用のsam7ポートは、beagleboard/omapとはまったく異なります。上記は、変更または再発明できるフレームワークです。

Ti.comのOMAP35xテクニカルリファレンスマニュアルが必要になります。彼らのサイトOMAP3530でomapパーツを検索してください。

また、ビーグルボードのドキュメント。たとえば、次のステートメント:

単一のRS232ポートがBeagleBoardに提供され、UART3のTXおよびRXラインへのアクセスを提供します

したがって、UART3を検索するomapの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

これがそのメイクファイルです:

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 -...タイプのクロスコンパイラも同様に機能します(コードソースからライトツールを入手すると仮定します)。

.binファイルを取得してubootのヘルプを確認すると、正確なコマンドは覚えていませんが、おそらくl0x80300000またはload_xmodemなどです。基本的には、シリアルポートを介して.binファイルをプロセッサのメモリスペースにx、y、またはzモデムで接続し、goまたはコマンドがubootにプログラムに分岐するように指示するものを使用します。

実行すると、少数のU文字(0x55は「U」)がシリアルポートから出てくるのがわかります。

事前の主な目標は、単純なシリアルポートルーチンを起動して、デバッグ用に印刷したり、プログラムの動作を確認したりできるようにすることです。後でグラフィックスなどに入ることができますが、最初にシリアルポートを使用します。

いくつかの不正行為が起こっていました。 ubootが起動し、シリアルポートを初期化する必要がなかったので、バイトをthrに押し込みました。しかし、すぐにthrのストレージがオーバーフローし、バイトが失われるため、omapのtrmを読み取り、送信機が空であることを示す何らかのビットを見つけ、すべてを送信した後、ポーリングするuart_sendタイプの関数を作成する必要があります。送信機が空の場合、1バイトを送信します。

また、printf()についても忘れてください。独自の印刷番号(8進数または16進数が最も簡単です)と、おそらく印刷文字列を作成する必要があります。私はこの種の作業を一日中、一晩中行っています。99%の時間、私が使用するのは、32ビットの16進数をUARTから出力する小さなルーチンです。数字からデバッグしてプログラムのステータスを確認できます。

したがって、sam7モデルなどを使用します(リンクコマンドラインでのファイルの順序と同様に、コンパイラとリンカのコマンドラインオプションが重要であることに注意してください。最初の命令が必要な場合は、最初のファイルをエントリポイントにする必要があります/ .binファイル内の単語がエントリポイントになります。これは、ROMから起動するためにこれを制御する方法を知りたいので、通常は良い考えです。

Ubootを削除または交換しなくても、おそらくかなりのことができます。ubootのLinuxベースのブートコマンドを調べ始めると、フラッシュまたはどこかからRAM内のスポットにほとんど.binファイルをコピーしていることがわかります。 、次に分岐します。 Linuxに分岐するようになったesparm linuxには、いくつかのarmテーブルと、プログラムが必要としない、または必要としないレジスタの設定が含まれます。基本的に、プログラムをramにコピーした後、使用することがわかっているコマンドは、Linuxの場合と同じようにボードを起動して実行することを選択した場合に、ubootのブートスクリプトでスクリプトを作成するものです。

Jtagを使用でき、ubootに依存せずに動作できると言って、そのパスに進むと、チップを起動して実行するために起動時に実行する必要がある特定の数のことがある可能性がありますが、特にuartの構成はどこかにいくつかのクロック分周器、クロックが有効、I/Oが有効、そのようなさまざまなもの。これが、sam7の例がuartのものではなくLEDのものを点滅させることから始まる理由です。 amotekjtag-tinyは優れたjtagウィグラーです。私は非常に満足しています。これらを一日中仕事で使用してください。ビーグルボードはおそらく標準のARMピン配置ではなくTIピン配置を使用しているため、ケーブルを変更する必要があります。OMAPでアームタップコントローラーに直接アクセスできるかどうかはわかりません。何か特定のことをしなければなりません。とりあえずubootルートに行くほうがいいです。

スタックをセットアップしてエントリポイントのCコードに分岐するための少量のasmがあるフレームワークができたら、そのCコードをOSに変換したり、好きなことをしたりすることができます。 chibiosやprexなどを見ると、システムに取り込む小さなasmブートコードがあることがわかります。同様に、そこにはuartデバッグルーチンと非デバッグルーチンがあります。多くのrtoseは、割り込みを使用し、thrが空になるようにポーリングしたくないと考えています。

この投稿でHelloWorldを使用できない場合(作業の一部を実行できる場合)は、お知らせください。ビーグルボードを掘り下げて、完全な例を作成します。私のボードはあなたのボードと完全には一致しませんが、Hello Worldに関しては、十分に近いはずです。

41
old_timer

TIStarterWareを試すこともできます。

http://www.ti.com/tool/starterware-sitara

4
dhanushka