2012年3月27日火曜日

実装開始!

まずは起動してすぐwhileループするプログラムを書く
電源ONして最初に動き出す処理はC++ではかけないので最初だけアセンブラとCを使う

■エントリポイント(Start.S)
.global start

.extern main_start

/**
 * BeagleBoard は物理メモリが0x80000000~にある.
 *
 * プログラムコードを0x80040000からにしてそれ以下はスタックやら適当に使う
 */
start:
    ldr sp, =0x80040000
    ldr pc, =main_start


■メイン関数(Main.cpp)
extern "C" {

void main_start() {
    while (1) {}
}

}


■コンパイル
上記2つのアセンブラとCのソースコードをコンパイルする。
実装方針で示したようにC++の例外機構は使わない。
またデバッグがしやすいように最適化もしない。
よってコンパイル時は以下のオプション

arm-none-linux-gnueabi-gcc -c -O0 -g -mcpu=cortex-a8 -mabi=aapcs-linux -Wall -fno-exceptions -fno-enforce-eh-specs -fno-rtti Start.S Main.cpp

-mabi=aapcs-linuxオプションをつけないとリンク時にエラーが起きてしまう。
生成するオブジェクトファイルの形式に関する指定だと思われるが調査は後回し

■リンク
リンクするときにはプログラムをロードする先がBeagleBoardのメインメモリが存在するアドレスになるようにオプションを指定する。
又、-nostartfiles を指定して通常アプリ用のライブラリのリンクを禁じる
デバッグ用にマップファイルも生成するようにした時は以下のオプション

arm-none-linux-gnueabi-ld -nostartfiles -e start -Ttext 0x80040000 -Map kernel.map -o kernel.elf Start.o Main.o


0 件のコメント:

コメントを投稿