(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>