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

INACHI Minoru inachi-m @ mb.dnes.nec.co.jp
2011年 8月 23日 (火) 14:41:05 JST


チーム名:ギャロップドライブの稲地です。
本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

バイナリが膨れ上がる原因、および上記の対処で大丈夫なものか
アドバイスお願いいたします。