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

Eclipseの準備

ソースコードの作成、デバッグは全てEclipse環境で行う。
そのための下準備。

まずはCDTプラグインをインストールする。






次にCDTプラグインのオプションであるHardware Debuggingプラグインを追加する
利用可能なアップデートサイト一覧からCDTを選択





そして、Hardware Debuggingを選択してインストール




これで準備は完了


2012年3月10日土曜日

ドライバのインストール

FlyswatterはPCとUSBで接続。その際にドライバをインストールする必要がある。
ドライバはOpenOCDをインストールしたフォルダにある

C:/Program Files/OpenOCDにインストールしたとすると
C:/Program Files/OpenOCD/0.4.0/drivers/libusb-win32_ft2232_driver-***.zipというのがある。これがドライバ。
これを解凍してドライバインストール画面から選択すればOK

インストールするとデバイスマネージャーで2つのデバイスとして認識される。
USB Serial Converter AとB
このうちUSB Serial Converter Aのドライバを手動で変更する

デバイスマネージャーでUSB Serial Converter Aを選択して「ドライバの更新」→「ドライバを手動で検索してインストール」→「一覧から選択」

ここで、一覧の中から「TinCanTools Flyswatter (Channel A)」を選択してインストールする。

・・・WindowsXPはこれで素直にインストールできるのだがWindows7では出来ない
ドライバに署名がないといわれて怒られる。
仕方ないのでWindows7はテストモードにして署名を回避する。ただし、セキュリティ的に問題ありなのかもしれない・・・

テストモードへはコマンドプロンプト(管理者権限で実行)からのコマンド実行で入れる
bcdedit /set TESTSIGNING ON

テストモードから抜ける場合は
bcdedit /set TESTSIGNING OFF

開発環境

BeagleBoardとFlyswatterで開発するためのソフトウェア環境について

■OS
 Windows XP もしくは 7

■コンパイラ
 CodeSourcery G++Lite ARM版

■デバッガ
 Open OCD 0.4.0
 この辺りにビルド済みのOpen OCDバイナリがある

■統合開発環境
 Eclipse 3.7 Indigo
 ソースコードの編集、Open OCDと連携してのデバッグ実行のために使用

狩のための武装

何はともあれBeagleBoardとデバッグツールの購入
デバッグツールにはTincan tools社Flyswatterを使うことにした。

BeagleBoardはDigiKeyで注文。Flyswatterも同時に注文したかったけど残念ながら扱っていない様子
仕方ないのでFlyswatterは個人輸入サービスを使うことにした。
UNIPOSで扱っていたのでこちらで注文。
BeagleBoard接続用にBeagleBoard Adapter Kitというオプションがあるので、それも合わせて注文

今なら円高なのでどちらも安めに買えるかも♪

そうして届いたBeagleBoardとFlyswatterがこちら。


旅立ち


BeagleBoardという組み込み基板がある。
BeagleBoardといえばLinuxを動かしたり、Androidを動かしたりという記事を良く見かける。
それはそれで面白いのだが、出来ればOSを0から自分で作ってみたいと思う。

そこで無謀かもしれないがBeagleBoard上で動くOSを0から作る事にチャレンジする。
このブログはOSを「動かす」のではなく「作る」作業の記録。
主に自分のための作業記録だが、誰か他のエンジニアの役に立てば幸いである。

さぁ、では行こうか