2012年3月27日火曜日

デバッグ実行

作成したwhileループするだけのアプリケーションをEclipseからデバッグ実行する

■手順
(1)OpenOCDを起動
 以前にセットアップしたOpenOCDを起動する
 Eclipseのメニュー「Run」-[External Tools」から「openocd」を選択

(2)Eclipseデバッガ起動設定
 Eclipseのメニュー「Run」-「Debug Configurations」を選択
 左のリストから「GDB Hardware Debugging」を選択して新規作成する

 Application には作成したアプリケーションkernel.elf を選択する


 DebuggerにはG++LiteをインストールしたフォルダにあるGDBを選択する
 OpenOCDはTCPポート3333で動作しているのでPort numberは3333にしておく


 Startupはデフォルトの設定に加えて「monitor reset halt」の記述を追加
 

 以上でデバッグ実行の設定は終わり


(3)ブレークポイントの設定
 ちゃんとブレークするかどうかMain.cpp#main_start()のwhileループにEclipse上からブレークを張る

(4)デバッグ実行
 (2)で設定したデバッグ設定でデバッグ実行を開始





 実行を開始するとブレークした状態で始まる。Debugウィンドウの再生ボタンぽいのを押して実行を継続するとMain.cppのwhileループに張ったブレークポイントまで実行して再度ブレークする

 とりあえずEclipseでソース編集、デバッグ実行するところまで環境が整った

実装開始!

まずは起動してすぐ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


2012年3月23日金曜日

実装は・・・

実装方針

■言語
 C++。Cよりコードを書かずに済むから
 アセンブラが必要な部分もあるが、可能な限りC++で記述する
 C++例外機構は面倒なのでまずは使わない

■メモリ管理
 MMUによるページ管理を行う
 ただし、実装が軌道に乗るまではページ管理はしない

■CPU例外機構
 実装が軌道に乗るまで使用しない。不具合で例外が発生した場合は無限ループに突入させる
 ページ管理が出来るようになった後に正式な形に実装する

■マイルストーン
1、デバッガからスタートアップコードの起動
  無限ループするコードをデバッガで起動して実行できるようにする

2、UARTデバイスドライバの作成
  ターミナルソフトと通信できるようにするためのドライバを作成する

3、printf, cout的な文字列出力処理を作成

4、ページ管理機能作成

5、CPU例外処理機構実装

6、マルチタスク化

7、VGAドライバ作成
  DVI出力から画面表示できるようにする。
  まずは矩形描画程度まで

8、SD/MMCドライバ作成
  MMCモードでのデータ転送が出来るドライバを作成する

9、ファイルシステムドライバ作成
  一般的なSDカードのファイルシステムFATに対応する

10、ファイル入力機能作成
 SDカードからファイルを読み込めるようにする

11、画像ファイルの画面表示
 JPEGファイルを読み込んで画面に表示できるようにする
 
 以上ここまでで、簡易画像ビューワを実現するところまでまずは実装する

2012年3月14日水曜日

デバッグ準備 - OpenOCD起動

いよいよデバッガを起動させる。
デバッグにはOpenOCDとCode Sourcery G++Liteが必要。

まずEclipseからOpenOCDを起動させる設定を行う
Eclipseメニューの[Run]-[External Tools]-[External Tools Configurations] を選択
Programとして新規項目を作成する







LocationにOpenOCDの実行ファイルを指定する
Working Directoryは適当に。
ArgumentはFlyswatterとBeagleBoardの組み合わせで使用するので以下のようにする

-f interface/flyswatter.cfg -f board/ti_beagleboard.cfg

[Run]ボタンを押して実行したら以下のようなコンソール表示が出たらOK


Open On-Chip Debugger 0.4.0 (2010-02-22-19:05)
Licensed under GNU GPL v2
For bug reports, read
    http://openocd.berlios.de/doc/doxygen/bugs.html
RCLK - adaptive
Warn : omap3530.dsp: huge IR length 38
RCLK - adaptive
trst_only separate trst_push_pull
Info : RCLK (adaptive clock speed) not supported - fallback to 1000 kHz
Info : JTAG tap: omap3530.jrc tap/device found: 0x0b7ae02f (mfg: 0x017, part: 0xb7ae, ver: 0x0)
Info : JTAG tap: omap3530.dap enabled
Info : omap3530.cpu: hardware has 6 breakpoints, 2 watchpoints
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x2800042, MEM_AP_TAR 0x54011140
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x2800042, MEM_AP_TAR 0x54011140
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x2800042, MEM_AP_TAR 0x54011140
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x2800042, MEM_AP_TAR 0x54011140
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x2800042, MEM_AP_TAR 0x54011150
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x2800042, MEM_AP_TAR 0x54011150
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x2800042, MEM_AP_TAR 0x540111c0
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x2800042, MEM_AP_TAR 0x540111c0