(etrobo 13) Re: TOPPERS/JSP を NXT BIOS & C++ で利用するときの問題

竹内良輔 roi @ mx1.ttcn.ne.jp
2011年 8月 25日 (木) 21:48:12 JST


TOPPERSプロジェクト教育WGの竹内です。

原因は、C++用のコンストラクタの初期化セグメント.torsがRAM領域にアサインされているからです。
C++でクラスを使用したテストを行わなかったせいです。
申し訳、ありません。
通常、NXT BIOSのようなROM実行のプログラムは
初期データがあるセグメントデータ領域は、実行時はRAM上にありますが、
初期データはROM上において、スタートアップルーチンで、実行時のRAMにコピーを行う必要があります。

mindstormsnxt_rom.ldがcppには問題があり.torsセグメントをRAMに割り付けています。 

添付のように、
.torsセグメントを、rom領域に割り当てて、
.rtextと.dataにはさめば、
スターアップルーチンでram領域にコピーするようになります。

.torsはrom領域に割り当てても(たぶん)問題ないと思います。



-----Original Message----- 
From: INACHI Minoru
Sent: Tuesday, August 23, 2011 2:41 PM
To: etrobo @ toppers.jp
Subject: (etrobo 12) TOPPERS/JSP を NXT BIOS & C++ で利用するときの問題

チーム名:ギャロップドライブの稲地です。
本MLにはじめて投稿させていただきます。

さっそくですが、TOPPERS/JSP を NXT BIOS & C++ の環境で利用
しようとして、問題にぶつかってしまったので、相談にのって
いただけないでしょうか。

その問題とは転送するバイナリが巨大に膨れ上がって NXT に転送
できないというものです。

以下の C++ 用サンプルプログラムを NXT BIOS 用に make します。

jsp-1.4.4-nxt/OBJ/MINDSTORMSNXT/SAMPLE_CPP

これで出来上がるバイナリのサイズは以下のとおりです。

-rwxr-xr-x 1 XXXXXXXXXXXXX Domain Users  39472 Aug 23 12:44 jsp.bin

sample.cpp に以下のように簡単な C++ オブジェクトを定義します。

=================================================================
--- sample.cpp.orig 2011-03-20 11:08:23.000000000 +0900
+++ sample.cpp 2011-08-23 12:56:26.213365500 +0900
@@ -30,6 +30,15 @@
static char mstate; /* 走行体の状態 */
static char keystate; /* タッチセンサーの状態 */

+class CPPTEST {
+public:
+    CPPTEST() :var(0) {}
+private:
+    int var;
+};
+
+CPPTEST cpptest;
+
//*****************************************************************************
// 関数名 : tail_control
// 引数  : angle (モータ目標角度[度])
=================================================================

これで再コンパイルすると、以下のようにバイナリが 1MB ほどに膨れ
上がり、NXT に転送できなくなります。

-rwxr-xr-x 1 XXXXXXXXXXXXX Domain Users 1018448 Aug 23 12:58 jsp.bin

この現象はグローバルに C++ オブジェクトを定義しなければ発生しません。
手探りで以下のような修正を加えたところ、サイズが膨れ上がる現象は
無くなり、NXT に転送もできて、今のところ動作もしています。

jsp-1.4.4-nxt/config/armv4/mindstormsnxt/
=================================================================
--- mindstormsnxt_rom.ld.orig 2011-05-14 09:34:16.000000000 +0900
+++ mindstormsnxt_rom.ld 2011-08-23 12:05:48.156618200 +0900
@@ -138,9 +138,10 @@
   KEEP(* (*.dtors*))
   __dtor_end = .;
     . = ALIGN(16);
-} > ram
+} > rom

/* ROM_ONLY __rom_end__ = ADDR(.text) + SIZEOF(.text) ; */
+ __rom_end__ = __dtor_end ;

/*
  * The stack is placed in ram.
=================================================================

転送するバイナリのサイズは以下のようになりました。

-rwxr-xr-x 1 XXXXXXXXXXXXX Domain Users  39536 Aug 23 13:01 jsp.bin

バイナリが膨れ上がる原因、および上記の対処で大丈夫なものか
アドバイスお願いいたします。
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: mindstormsnxt_rom.ld
型:         application/octet-stream
サイズ:     4686 バイト
説明:       無し
URL:        <http://www.toppers.jp/pipermail/etrobo/attachments/20110825/abf0b9a3/attachment.obj>