FC2カウンター FPGAの部屋 The Simple MicroBlaze Microcontroller 11(SDKでエラー発生)
FC2ブログ

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

FPGAの部屋

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

The Simple MicroBlaze Microcontroller 11(SDKでエラー発生)

SMMでCMOSカメラのパラメータを設定するために、LCDにパラメータを表示して設定するという計画(長い。。。)のCソースは、だいたい書き終えた。550行くらいあるので、ソースをブログに貼ることができない。長い。
SDKでビルドしようとしたらエラーになってしまった。エラーは下の通り。

../../empty_application_bsp_0/microblaze_0/lib/libxil.a(write.o): In function `write':
/gnu/mb_gnu/src/gcc/libgloss/microblaze/write.c:36: undefined reference to `outbyte'
/gnu/mb_gnu/src/gcc/libgloss/microblaze/write.c:34: undefined reference to `outbyte'
../../empty_application_bsp_0/microblaze_0/lib/libxil.a(read.o): In function `read':
/gnu/mb_gnu/src/gcc/libgloss/microblaze/read.c:35: undefined reference to `inbyte'


SMM_41_101215.png

早速、おなじみのXilinxのアンサーをあさると、”32968 - 11.1 EDK - GCC コンパイラで undefined reference to "outbyte" エラーが発生する”が見つかった。ソリューションを下に引用する。

このエラーは、[Software Platform Settings] で stdout が None に設定されているのに print 関数で有効な stdout が必要になるために発生します。
[Software] > [Software Platform Settings] > [OS and Libraries] で有効な stdout を設定してライブラリを生成し直すとこの問題を解決できます。


あれ?これはよくみるとXPSでの解決策だった。SDKはSoftwareメニューがない。。。どうしたら良いのか?
stdio.hをインクルードして、sprintfを使っているのが多分まずいんだろうと思う?

    switch (setting_item) {
        case AGC_SET :
            if (agc_reg)
                i = sprintf((char *)Str, "AGC ON");
            else
                i = sprintf((char *)Str, "AGC OFF");
            break;
        case GAIN_LEVEL_SET :
            i = sprintf((char *)Str, "AGC GAIN %03x", gain_level);
            break;


UG643 OS and Libraries Document Collectionの76ページのTable16: Configuration Parameterの stdin, stdoutをnoneから何か選べれば大丈夫だと思うのだが、その方法がわからない?やはりXPSを使う必要があるのかな?

あれ?もしかしたら、現在はSMM_DEG_noUART_hw_platformを使っているが、これではstdin, stdoutを使うにしてもどこにつないだら良いのだろう?となってしまうのではないか?使わないまでもUARTがあるのを選べば、stdin, stdoutがUARTになっているということはないだろうか?

SMM_Fullつまり、DEBUGもUARTも入ってる物をSDKで読み込んだら、Board Supprot Package Settings のところでstdin, stdout がUART になっていた。これでやればCソースをコンパイルできるかな?
SMM_42_101215.png

やってみたところ、今度は undefined reference to `outbyte'などのエラーは出なくなったので、stdin, stdoutの問題はクリアされているようだが、どうやら8KBのRAMが一杯になってしまったのかな?

/cygdrive/k/HDL/Xilinx/12.3/ISE_DS/EDK/gnu/microblaze/nt/bin/../lib/gcc/microblaze-xilinx-elf/4.1.2/../../../../microblaze-xilinx-elf/bin/ld: region ilmb_cntlr_dlmb_cntlr is full (empty_application_0.elf section .text)
/cygdrive/k/HDL/Xilinx/12.3/ISE_DS/EDK/gnu/microblaze/nt/bin/../lib/gcc/microblaze-xilinx-elf/4.1.2/../../../../microblaze-xilinx-elf/bin/ld: empty_application_0.elf: section .text lma 0x50 overlaps previous sections
/cygdrive/k/HDL/Xilinx/12.3/ISE_DS/EDK/gnu/microblaze/nt/bin/../lib/gcc/microblaze-xilinx-elf/4.1.2/../../../../microblaze-xilinx-elf/bin/ld: empty_application_0.elf: section .fini lma 0x78 overlaps previous sections
/cygdrive/k/HDL/Xilinx/12.3/ISE_DS/EDK/gnu/microblaze/nt/bin/../lib/gcc/microblaze-xilinx-elf/4.1.2/../../../../microblaze-xilinx-elf/bin/ld: empty_application_0.elf: section .rodata lma 0x98 overlaps previous sections
/cygdrive/k/HDL/Xilinx/12.3/ISE_DS/EDK/gnu/microblaze/nt/bin/../lib/gcc/microblaze-xilinx-elf/4.1.2/m/crtend.o:(.init+0x0): relocation truncated to fit: R_MICROBLAZE_32_PCREL_LO against `.text'
collect2: ld returned 1 exit status
make: *** [empty_application_0.elf] Error 1


メモリの量が足りないとしたら、やはり、stdioのライブラリを呼んでしまったので、ライブラリ分だけ増えちゃったんだろうな?
どうしようか?sprintfを使わないで、独自に関数を書いちゃおうか?そうしてみます。

(2010/12/16:追加)
sprintfを独自関数で書きなおしても

/cygdrive/k/HDL/Xilinx/12.3/ISE_DS/EDK/gnu/microblaze/nt/bin/../lib/gcc/microblaze-xilinx-elf/4.1.2/../../../../microblaze-xilinx-elf/bin/ld: region ilmb_cntlr_dlmb_cntlr is full (empty_application_0.elf section .heap)


になってしまった。
こうなったら、SMMをXPSで、リコンフィグして、メモリを8Kから16Kに変更しようと思う。
  1. 2010年12月15日 05:04 |
  2. SMM
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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