FC2カウンター FPGAの部屋 MicroBlaze MCSをISE WebPACKから使用する5(gdb編)
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

MicroBlaze MCSをISE WebPACKから使用する5(gdb編)

MicroBlaze MCSをISE WebPACKから使用する4(XMD編)”の続き。

今回は、”iso.enat.jp さんのブログ”の”MicroBlaze MCS でgdbを使う”を参考にさせていただいて、ISE WebPACKでも使えるgdbでデバックしてみることにした。

最初に、デバック情報付きのELFファイルを作る必要がある。前回のMakefileでLDFLAGS1 の -Wl,-s は ld で全てのシンボル情報を出力ファイルから落すというオプションだった。これが付いているとmb-gcc で-g オプションを付けても、デバック情報が追加されない。ということで、Makefile を作りなおした。

TARGET=Atlys_LED_test.elf
TARGET_DEBUG=Atlys_LED_test_debug.elf
SRCDIR=./
OBJDIR=./

SRCS=            $(SRCDIR)Atlys_LED_test.c
OBJS=            $(OBJDIR)Atlys_LED_test.o
OBJS_DEBUG=        $(OBJDIR)Atlys_LED_test_debug.o

CC=mb-gcc
CFLAGS=-O2 -mlittle-endian -Wl,-Map=Atlys_LED_test.map
CFLAGS_DEBUG=-O0 -g -mlittle-endian -Wl,-Map=Atlys_LED_test_debug.map
LDFLAGS1=-Wl,-s

$(TARGET) : $(OBJS)
    $(CC) $(CFLAGS) $(LDFLAGS1) $(OBJS) -o $(OBJDIR)$(TARGET) $(LDFLAGS2)

$(OBJDIR)Atlys_LED_test.o: $(SRCDIR)Atlys_LED_test.c $(INCS)
    $(CC) $(CFLAGS) -c $< -o $@

clean:
    rm -f $(OBJDIR)*.elf $(OBJDIR)*.o $(OBJDIR)*.map 

debug: $(TARGET_DEBUG)

$(TARGET_DEBUG) : $(OBJS_DEBUG)
    $(CC) $(CFLAGS_DEBUG) $(OBJS_DEBUG) -o $(OBJDIR)$(TARGET_DEBUG) $(LDFLAGS2)

$(OBJDIR)Atlys_LED_test_debug.o: $(SRCDIR)Atlys_LED_test.c $(INCS)
    $(CC) $(CFLAGS_DEBUG) -c $< -o $@


(2012/02/10:修正)上のMakefileの CFLAGS_DEBUG=-O2 -g -mlittle-endian -Wl,-Map=Atlys_LED_test_debug.map から CFLAGS_DEBUG=-O0 -g -mlittle-endian -Wl,-Map=Atlys_LED_test_debug.map に修正しました。


これで、Cygwin を立ち上げて、make すると、今までと同じで、make debug するとAtlys_LED_test_debug.elf が出力される。
MB_MCS_90_120209.png


最初に、iMPACTでAtlys_LED_test.bit をダウンロードする。
(注)必ずその都度、できたELFファイルを、microblaze_mcs_data2mem TCLコマンドでビットファイルに入れておく。

次に、XMDを前回同様に立ち上げる。その手順をもう一度下に示す。

・コマンドプロンプトを立ち上げて、ISE13.4のインストール・フォルダに行って、setting32.bat (64ビットWindowsの方はsetting64.bat) を実行する。

・Atlys_LED_test.elf のあるフォルダに移動してXMDを起動する。
MB_MCS_84_120208.png

・MicroBlazeのMDMペリフェラルに、XilinxのUSBダウンロードケーブルで、USB2ポートで接続する。(connect mb mdm -cable type xilinx_platformusb port USB2) (追加:connect mb mdm のみでOKのようです)
MB_MCS_85_120208.png


次に、Cygwin上で、gdbを立ち上げる。

・”mb-gdb”コマンドを入力する。
MB_MCS_91_120209.png

・”load Atlys_LED_test_debug.elf"コマンドを入力したら、”You can't do that when your target is `None'”という表示が出た。

・”file Atlys_LED_test_debug.elf"コマンドを入力したら、elfファイルが読めたようだ。
MB_MCS_92_120209.png

・”list”コマンドを入力した。
MB_MCS_93_120209.png

・”b 22”コマンドを入力して、”*(volatile unsigned int *)(PIT1_PRELOAD_ADDR) = COUNT_VALUE; // 100MHzで1秒”でブレークする。(Cソースは、”MicroBlaze MCSをISE WebPACKから使用する3”の最後を参照のこと)
MB_MCS_94_120209.png

・”target remote localhost:1234 id 0”コマンドを入力して、XMDと接続した。id 0 を入れないとXMDとの接続ができなかった
MB_MCS_95_120209.png

・Cygwin側で”Ignoring packet error, continuing...”が出て、XMDで”Error: No Data on the Socket”のエラーが出たら、XMDでexit を入力して、XMDを終了する。
MB_MCS_96_120209.png
MB_MCS_97_120209.png

・XMDをもう一度立ち上げ、MicroBlazeのMDMペリフェラルに、XilinxのUSBダウンロードケーブルで、USB2ポートで接続する。(connect mb mdm -cable type xilinx_platformusb port USB2)

・もう一度、Cygwinで、”target remote localhost:1234 id 0”コマンドを入力して、XMDと接続する。

・Cygwin に”main () at Atlys_LED_test.c:28”と出て、正常にgdb が起動した。
MB_MCS_98_120209.png
MB_MCS_99_120209.png

GDBコマンドサイトを見ながらコマンドを入れていく。

・まずはp (print)コマンドで led 変数を見てみた。p/x にすると16進になる。(フリーランしてしまった時は、gdb側で止まらないので、XMDの方で stop コマンドを入力すると停止する)
MB_MCS_100_120209.png

・cont コマンドを入力して、次のブレークポイントまで進めた。次のブレークポイントは、現在の行なので、カウントが進んでいるはず。同様に、p (print)コマンドで led 変数を見てみたが、変化がなかった。もう一度、cont コマンドを入れて、led 変数を見てみたら変化している。ボードのLED表示も変化していた。
MB_MCS_101_120209.png

・ブレークポイントで止まるとXMDの方にも表示が出る。
MB_MCS_102_120209.png

・gdb で s や n を押すと1行進む。s はStep in で、n はStep overだ。
MB_MCS_103_120209.png

・最後に、Cygwin に q を、XMD に exit をいれると終了する。

エラーが出た時に、XMDを再起動すればうまくいくのを見つけるのが大変だった。半日、ブログを書くのが遅れてしまった。でも、無事にまとまってよかったと思う。
これで、ISE WebPACKのみでデバックも出来る。

(2010/02/10:追記)
mb-gcc で最初に -O2 オプションを入れないほうが良いとのご指摘を頂いた。確かにそうだと思うので、debug の方だけ、-O0 にしてやってみた。

オプティマイズされている弊害ではないか?という現象も見えていた。下の図で s コマンドで進んでいって30行から25行に戻るのはおかしい。28行に戻るべきだと思う。更に、”b_GPI1 = c_GPI1;”の行が抜けてしまった。これはコンパイラでオプティマイズされているからではないかと推測していた。
MB_MCS_103_120209.png

下にAtlys_LED_test.c のソースコードをもう一度貼っておく。

// 
// Atlys_LED_test.c
//
// AltysボードのLEDを1秒ごとに+1するソフトウェア
// 初めは割り込みを使わないで実行する
//

#define    GPO1_ADDR            0x80000010
#define GPI1_ADDR            0x80000020
#define PIT1_PRELOAD_ADDR    0x80000040
#define PIT1_COUNTER_ADDR    0x80000044
#define PIT1_CONTROL_ADDR    0x80000048

#define COUNT_VALUE            100

int main()
{
    unsigned int b_GPI1 = 0;
    unsigned int c_GPI1 = 0;
    unsigned int led = 0x55;
    
    *(volatile unsigned int *)(PIT1_PRELOAD_ADDR) = COUNT_VALUE; // 100MHzで1秒
    *(volatile unsigned int *)(PIT1_CONTROL_ADDR) = 0x3// Timer Enable, Auto Reload
    
    *(volatile unsigned int *)(GPO1_ADDR) = led;
    
    while(1){
        c_GPI1 = 0x2 & (*(volatile unsigned int *)(GPI1_ADDR));
        if (c_GPI1 != b_GPI1){
            *(volatile unsigned int *)(GPO1_ADDR) = led++;
        }
        b_GPI1 = c_GPI1;
    }
}



最初に、-O2 の場合と、-O0 の場合のAtlys_LED_test_debug.elf の大きさの差だが、どちらも9,357バイトで差がなかった。差分をとって見ると違っているようだ。

実際にmb-gdb を起動してステップ実行してみると、確実にCソースの行で停止した。下図に示す。
MB_MCS_104_120209.png

やはり、磯村さんが指摘されたように、mb-gcc の -O オプションは、少なくともデバック時は -O0 の方が良いようだ。上のMakefile を修正しました。
  1. 2012年02月09日 20:47 |
  2. MicroBlaze MCS
  3. | トラックバック:0
  4. | コメント:4

コメント

デバックで使用する場合は最適化しない方が良いと思います。
Xilinxのエンベッドシス テムツールリ フ ァレンスマニ ュアルUG111 (EDK 11.1)(日本語版)
のP.141でも「メモ : C プログラムの機能を初めて検証する場合は、
-O2 ま たは-O3 などの mb-gcc の最適化オプションを使用しないことをお勧めします。」
となっています。
  1. 2012/02/09(木) 21:24:09 |
  2. URL |
  3. 磯村 剛 #-
  4. [ 編集 ]

isoさんなんですか?お世話になっております。

正直、そこは迷いました。-O2を外したこともあったんですが、デバック時もとりあえず入れてあります。それがわかっていれば、おかしくなった時にも対処できると思います。元にしたMakefieが-O2入っていたので、入れておくことにしました。
ですが、もうすでに、おかしくなっているようです。http://blog-imgs-19.fc2.com/m/a/r/marsee101/MB_MCS_103_120209.png です。
気がついてはいるんですけど、もう一度確かめて、違いを追加したいと思います。
  1. 2012/02/09(木) 22:18:32 |
  2. URL |
  3. marsee #f1oWVgn2
  4. [ 編集 ]

 おはようございます。
 デバッグ情報は、生成された機械語コードとソースの各行の対応関係などを記録していますが、最適化で機械語レベルの変更が行われると、この対応関係が往々にして崩れてきます。で、gdbが対応関係を得られない場合は、関数の先頭行に戻ったりと・・・。この他に、最適化で変数がレジスタに割りつけられた結果、printで見えなくなるなどの弊害も出ます。
  1. 2012/02/10(金) 08:41:53 |
  2. URL |
  3. くり #mQop/nM.
  4. [ 編集 ]

くりさん、こんにちは。お久しぶりです。
前からわかってはいたのですが、今回ので、最確認しました。気を付けたいと思います。
  1. 2012/02/10(金) 20:40:00 |
  2. URL |
  3. marsee #f1oWVgn2
  4. [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/2060-829e7610
この記事にトラックバックする(FC2ブログユーザー)