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

INACHI Minoru inachi-m @ mb.dnes.nec.co.jp
2011年 8月 29日 (月) 12:19:45 JST


チーム名:ギャロップドライブの稲地です。

添付されていた mindstormsnxt_rom.ld でバイナリを作り直し、
正常に動作できていることを確認しました。

これで安心して C++ で作業を進められます。
ありがとうございました。

(2011/08/25 21:48), 竹内良輔 wrote:
> 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
> 
> バイナリが膨れ上がる原因、および上記の対処で大丈夫なものか
> アドバイスお願いいたします。