CS+からe2studioへのインポート後GCCでのビルドに失敗する

よろしくお願いします。

評価ボード : Renesas Starter Kit for RX231
IDE CS+:CS+ for CC V8.03.00  [21 Nov 2019]
   e2studio:Version: 2020-04 (20.4.0)

コンパイラ :Renesas CC-RX V3.02.00

      :GCC for Renesas RX 8.3.0.202002

【背景・目的】
CS+で作成したプログラムをe2studioのGCCでビルドしたいと思っております。
作成したプログラムは、元々評価キットに付随していたサンプルプログラムを改造したものでそれほど大きい変更は加えていません。

【現状】
上記プログラムを、e2studioのインポート機能において『Renesas CCRX/CC-RL(CS+)プロジェクト』を用いてインポート(①)するとビルド(CC-RXでの)も成功して所望の動作ができています。
しかし、『Renesas CCRX project to Renesas GCC RX project』を用いて行おうとすると即座にインポートはできません(下図)。

試行錯誤で、①で出来上がったフォルダにてインポート『Renesas CCRX project to Renesas GCC RX project』を行うと、インポートは何かしら終了しました。
そこで、ビルドをしたところ下記エラーが出てしまいます。

==============
Extracting support files...
17:32:25 **** プロジェクト V0.02_200319-1800 に対する構成 Debug の ビルド ****
make -j6 all
'rx-elf-gcc -O0 -mcpu=rx200 -mlittle-endian-data -I"C:/Users/e2_studio/workspace/V0.02_200319-1800/generate" -I"C:/Users/e2_studio/workspace/V0.02_200319-1800/cg_src" -I"C:/Users/e2_studio/workspace/V0.02_200319-1800" -Wa,-adlnh="r_cg_cgc.lst" -MMD -MP -MF"cg_src/r_cg_cgc.d" -MT"cg_src/r_cg_cgc.o" "../cg_src/r_cg_cgc.c" -c -o "cg_src/r_cg_cgc.o"'
'rx-elf-gcc -O0 -mcpu=rx200 -mlittle-endian-data -I"C:/Users/e2_studio/workspace/V0.02_200319-1800/generate" -I"C:/Users/e2_studio/workspace/V0.02_200319-1800/cg_src" -I"C:/Users/e2_studio/workspace/V0.02_200319-1800" -Wa,-adlnh="r_cg_cgc_user.lst" -MMD -MP -MF"cg_src/r_cg_cgc_user.d" -MT"cg_src/r_cg_cgc_user.o" "../cg_src/r_cg_cgc_user.c" -c -o "cg_src/r_cg_cgc_user.o"'
'rx-elf-gcc -O0 -mcpu=rx200 -mlittle-endian-data -I"C:/Users/e2_studio/workspace/V0.02_200319-1800/generate" -I"C:/Users/e2_studio/workspace/V0.02_200319-1800/cg_src" -I"C:/Users/e2_studio/workspace/V0.02_200319-1800" -Wa,-adlnh="r_cg_cmt.lst" -MMD -MP -MF"cg_src/r_cg_cmt.d" -MT"cg_src/r_cg_cmt.o" "../cg_src/r_cg_cmt.c" -c -o "cg_src/r_cg_cmt.o"'
'rx-elf-gcc -O0 -mcpu=rx200 -mlittle-endian-data -I"C:/Users/e2_studio/workspace/V0.02_200319-1800/generate" -I"C:/Users/e2_studio/workspace/V0.02_200319-1800/cg_src" -I"C:/Users/e2_studio/workspace/V0.02_200319-1800" -Wa,-adlnh="r_cg_cmt_user.lst" -MMD -MP -MF"cg_src/r_cg_cmt_user.d" -MT"cg_src/r_cg_cmt_user.o" "../cg_src/r_cg_cmt_user.c" -c -o "cg_src/r_cg_cmt_user.o"'
'rx-elf-gcc -O0 -mcpu=rx200 -mlittle-endian-data -I"C:/Users/e2_studio/workspace/V0.02_200319-1800/generate" -I"C:/Users/e2_studio/workspace/V0.02_200319-1800/cg_src" -I"C:/Users/e2_studio/workspace/V0.02_200319-1800" -Wa,-adlnh="r_cg_dbsct.lst" -MMD -MP -MF"cg_src/r_cg_dbsct.d" -MT"cg_src/r_cg_dbsct.o" "../cg_src/r_cg_dbsct.c" -c -o "cg_src/r_cg_dbsct.o"'
'rx-elf-gcc -O0 -mcpu=rx200 -mlittle-endian-data -I"C:/Users/e2_studio/workspace/V0.02_200319-1800/generate" -I"C:/Users/e2_studio/workspace/V0.02_200319-1800/cg_src" -I"C:/Users/e2_studio/workspace/V0.02_200319-1800" -Wa,-adlnh="r_cg_hardware_setup.lst" -MMD -MP -MF"cg_src/r_cg_hardware_setup.d" -MT"cg_src/r_cg_hardware_setup.o" "../cg_src/r_cg_hardware_setup.c" -c -o "cg_src/r_cg_hardware_setup.o"'
../cg_src/r_cg_dbsct.c:1:10: fatal error: secaddr.h: No such file or directory
 #include "secaddr.h"
          ^~~~~~~~~~~
compilation terminated.
cg_src/subdir.mk:90: recipe for target 'cg_src/r_cg_dbsct.o' failed
make: *** [cg_src/r_cg_dbsct.o] Error 1
make: *** Waiting for unfinished jobs....
make -j6 all terminated with exit code 2. Build might be incomplete.

17:32:25 Build Failed. 4 errors, 0 warnings. (took 572ms)
==============

元々のr_cg_dbsct.cの先頭行に #include "secaddr.h"が追加されていて、そのヘッダが見つからないようです。


【質問】
・CS+からe2studioへのインポートを行い、GCCでのビルドを行う手順として、上記のようなインポートのやり方で問題ないでしょうか?(新規プロジェクトにファイルを追加していく方法も試してみたのですが、よくわからず、上手くいかなかったという経緯はあります)
・インポートが問題ない場合、上記のsecaddr.hに関するエラーの対処法はどのように行えば解決できるでしょうか?

お手数をおかけしますが、対処法ご教授いただければ幸いです。

以上よろしくお願いいたします。

 

Parents
  • msatoさん、こんにちは。NoMaYです。

    > ・CS+からe2studioへのインポートを行い、GCCでのビルドを行う手順として、上記のようなインポートのやり方で問題ないでしょうか?(新規プロジェクトにファイルを追加していく方法も試してみたのですが、よくわからず、上手くいかなかったという経緯はあります)

    e2 studioのカタログ的な機能でのやり方としては、上記のとおり、CS+&CC-RXプロジェクト→e2 studio&CC-RXプロジェクト→e2 studio&GNURXプロジェクト、と変換していくので良いとは思うのですが、(表現はちょっとアレですが)いろいろとやらかしてくれるe2 studio、という点を考慮すると、手堅さ/堅実さ、といったポイントからは、新規プロジェクトにファイルを追加していく方法も無碍にすることは出来ないかと思うのです、というのが今回の手順に関する私の印象です。

    それで、今回の移植の件に関しては、以下のように私は考えました。(一般論での観点ですが。)

    (1) 元のプロジェクトがCS+&CC-RXでビルド出来ていたことを考えると、エラーの原因は以下の2点かと予想します。

    (1-1) 元のプロジェクトのどこかに必ずsecaddr.hがある筈なのでWindowsエクスプローラで検索して見つけ出し、そのフォルダをインクルードパスに追加する
    (1-2) あるいは、もし元のプロジェクトで条件コンパイルによりインクルードから除外されていたら、同じ除外される条件が成立するようにマクロ定義等を見直す

    (2) ただ、secaddr.hの内容がGNURXでコンパイル出来るものかどうかは現時点では不明ですので、出来なければ、また質問して下さい。

    (3) あと、e2 studioがいろいろとやらかしてくれているかもしれないリスクを考えると、GNURXのコンパイルオプションでワーニングレベルを上げると良いです。ただ、上げ過ぎますとワーニングが多くなり過ぎますので、以下の画面コピーあたりが落としどころかな、と私は思っています。

    画面コピー
    Other Flagsの設定文字列: -Wno-unused-function -Wno-unused-label -Wno-unused-variable -Wundef -Wno-main

     

  • NoMaY様

    早々のご回答ありがとうございます。
    >(1-1) 元のプロジェクトのどこかに必ずsecaddr.hがある筈なのでWindowsエクスプローラで検索して見つけ出し、そのフォルダをインクルードパスに追加する

    を確認してみたのですが、secaddr.h が見つかりません。最初の質問にも書いたのですが、インポート後にr_cg_dbsct.cの先頭行に #include "secaddr.h"が追加されています。

    お手数をおかけします。
  • msatoさん、こんにちは。NoMaYです。

    > 最初の質問にも書いたのですが、インポート後にr_cg_dbsct.cの先頭行に #include "secaddr.h"が追加されています。

    失礼しました。見落としておりました。そうなりますと、e2 studioがやらかした、のかなという気がしますね。私が思うに、この場合、#include "secaddr.h"をコメントアウトして様子を見てみるのが良いかな、という気がします。そうしておいて、r_cg_dbsct.cで発生するエラーに対して(もしエラーが発生するのであればですが)対処法を考えることになるかと思います。どのようなエラーが発生しますでしょうか?或いは、コメントアウトするとエラー無くコンパイル出来ますでしょうか?

  • NoMaY様

    ご回答ありがとうございます。

    >この場合、#include "secaddr.h"をコメントアウトして様子を見てみるのが良いかな、という気がします。

    やってみたところ、下記のようなエラーが出るようになりました。

    =====

    ../cg_src/r_cg_resetprg.c:1:10: fatal error: CCRXmachine.h: No such file or directory

    #include "CCRXmachine.h"

             ^~~~~~~~~~~~~~~

    compilation terminated.

    make: *** [cg_src/r_cg_resetprg.o] Error 1

    cg_src/subdir.mk:90: recipe for target 'cg_src/r_cg_resetprg.o' failed

    make: *** Waiting for unfinished jobs....

    ../cg_src/r_cg_dbsct.c:54:5: warning: '_DTBL' initialized and declared 'extern'

    }   _DTBL[]  __attribute((section("C$DSEC"))) = {

        ^~~~~

    ../cg_src/r_cg_dbsct.c:55:7: error: '__SECTOP_D' undeclared here (not in a function)

        { __SECTOP_D, __SECEND_D, __SECTOP_R },

          ^~~~~~~~~~=====

    以下省略しますが、上記のようなr_cg_dbsct.cに絡むエラーが多数発生

    =====

    エラーの出たr_cg_resetprg.cも確認したところ、そのファイルの先頭に

    #include "CCRXmachine.h"

    #include "secaddr.h"

    が追加されていました。


    度々の質問ですみませんが以下お答えいただけないでしょうか?

     

    【1】基本的な質問ですみません。e2studioのプロジェクトのロードの仕方が合っているかお教えください。

    ①プロジェクトエクスプローラーの現在のプロジェクトを、『右クリック→削除→OK』としてプロジェクトがない状態にする。

    ②『ファイル→ファイル・システムからプロジェクトを開く→インポート元の選択のところでディレクトリ→(所望のディレクトリを選択)→終了

    この手順でプロジェクトを呼び出しビルドしているのですがこの手順でよいのでしょうか?

    また、CS+ではエクスプローラーなどで****.mtpjファイルをダブルクリックすればCS+が起動しそのプロジェクトが立ち上がったのですが、

    e2studioでは、.mtpjファイルに相当するようなものはないのでしょうか?

     

    【2】CS+からe2studioへインポートし、CC-RXでビルド成功したr_cg_dbsct(ccrx).cとGCCでビルド失敗するr_cg_dbsct(GCC).cを添付させていただきます。

    ここから何か更なるヒントありますでしょうか?

     

    【3】NoMaY様投稿の、https://japan.renesasrulz.com/cafe_rene/f/forum5/4868/gunrx-cc-rx

    の記事を見ました。『machine.hおよびnop()やbrk()やwait()についてはr_cg_macrodriver.hで違いを吸収』という文言を見てr_cg_macrodriver.hについても確認したところ、記事のようなCCRXとGCCファイルの差異になっていないように思います。こちらもファイル添付させていただきますが、ここから何か更なるヒントありますでしょうか?

    確かにこちらで色々試してみると、machine.hに絡むエラーが出てくる状況もあり、この辺りがビルドできない原因かと思っているのですが…。

     

    【4】CC-RXからGCCにコンパイラーを変えるのは、インポート機能で変換しただけで簡単にはできないものなのでしょうか?

    当方ソフトに詳しくないこともあり、コンパイルにあたりインクルードやファイルパスなどの見直しを結構しないといけないとなるとGCC利用のハードルは高すぎるのかな?と思う次第です。

Reply
  • NoMaY様

    ご回答ありがとうございます。

    >この場合、#include "secaddr.h"をコメントアウトして様子を見てみるのが良いかな、という気がします。

    やってみたところ、下記のようなエラーが出るようになりました。

    =====

    ../cg_src/r_cg_resetprg.c:1:10: fatal error: CCRXmachine.h: No such file or directory

    #include "CCRXmachine.h"

             ^~~~~~~~~~~~~~~

    compilation terminated.

    make: *** [cg_src/r_cg_resetprg.o] Error 1

    cg_src/subdir.mk:90: recipe for target 'cg_src/r_cg_resetprg.o' failed

    make: *** Waiting for unfinished jobs....

    ../cg_src/r_cg_dbsct.c:54:5: warning: '_DTBL' initialized and declared 'extern'

    }   _DTBL[]  __attribute((section("C$DSEC"))) = {

        ^~~~~

    ../cg_src/r_cg_dbsct.c:55:7: error: '__SECTOP_D' undeclared here (not in a function)

        { __SECTOP_D, __SECEND_D, __SECTOP_R },

          ^~~~~~~~~~=====

    以下省略しますが、上記のようなr_cg_dbsct.cに絡むエラーが多数発生

    =====

    エラーの出たr_cg_resetprg.cも確認したところ、そのファイルの先頭に

    #include "CCRXmachine.h"

    #include "secaddr.h"

    が追加されていました。


    度々の質問ですみませんが以下お答えいただけないでしょうか?

     

    【1】基本的な質問ですみません。e2studioのプロジェクトのロードの仕方が合っているかお教えください。

    ①プロジェクトエクスプローラーの現在のプロジェクトを、『右クリック→削除→OK』としてプロジェクトがない状態にする。

    ②『ファイル→ファイル・システムからプロジェクトを開く→インポート元の選択のところでディレクトリ→(所望のディレクトリを選択)→終了

    この手順でプロジェクトを呼び出しビルドしているのですがこの手順でよいのでしょうか?

    また、CS+ではエクスプローラーなどで****.mtpjファイルをダブルクリックすればCS+が起動しそのプロジェクトが立ち上がったのですが、

    e2studioでは、.mtpjファイルに相当するようなものはないのでしょうか?

     

    【2】CS+からe2studioへインポートし、CC-RXでビルド成功したr_cg_dbsct(ccrx).cとGCCでビルド失敗するr_cg_dbsct(GCC).cを添付させていただきます。

    ここから何か更なるヒントありますでしょうか?

     

    【3】NoMaY様投稿の、https://japan.renesasrulz.com/cafe_rene/f/forum5/4868/gunrx-cc-rx

    の記事を見ました。『machine.hおよびnop()やbrk()やwait()についてはr_cg_macrodriver.hで違いを吸収』という文言を見てr_cg_macrodriver.hについても確認したところ、記事のようなCCRXとGCCファイルの差異になっていないように思います。こちらもファイル添付させていただきますが、ここから何か更なるヒントありますでしょうか?

    確かにこちらで色々試してみると、machine.hに絡むエラーが出てくる状況もあり、この辺りがビルドできない原因かと思っているのですが…。

     

    【4】CC-RXからGCCにコンパイラーを変えるのは、インポート機能で変換しただけで簡単にはできないものなのでしょうか?

    当方ソフトに詳しくないこともあり、コンパイルにあたりインクルードやファイルパスなどの見直しを結構しないといけないとなるとGCC利用のハードルは高すぎるのかな?と思う次第です。

Children
  • msatoさん、こんにちは。NoMaYです。

    頂いた情報と私の手元のe2 studio v7.8.0のインストールフォルダを覗いた結果から考えると、例えr_cg_dbsct.cをコンパイルが出来るようにしても、r_cg_dbsct.c内のセクションテーブルの情報を使うことになる筈の関数(下記)が今だに空のままですので、もうr_cg_dbsct.cを破棄した方が良いだろうと思います。更に、今回のe2 studioのプロジェクト変換機能が中途半端であったことを鑑みて、これはe2 studioのプロジェクト変換機能使うことを諦めた方が良いと思います。

    インストールフォルダ/internal/projectgen/rx/Generate/CCRXConversion/source/machine.c

    void _INITSCT(void)
    {
    }

    CC-RX(とCC-RLやCC-RH)は優秀なコンパイラですし、CS+も安心して使えて頼りになる開発環境ですので(バグや使い難さが皆無とまでは言いませんけれど)、何と言いますか、フラストレーションを感じながらGNURX+e2 studioを使う必要は無いかと私は思いますよ。

    それでもGNURXを使いたいのであれば、e2 studioのプロジェクトウィザードで新規プロジェクトを作成して、ファイルを追加していく方法を取るしかないかな、と私は思うのです。開発環境なんて、触っていれば、そのうちそこそこは使えるようになるもんですよ。(大抵、最初はうまくいかないものですが、それでも何とかなるようになりますよ。)

  • NoMaY様

    ご回答ありがとうございます。
    変換機能が万能ではないということのようですね。色々ご助言ありがとうございました。

    ちなみに昨日の質問でソースファイル(****.c)を4つほど添付したつもりでいたのですが、そちらって添付されていたでしょうか?うまく添付できていなかったように思います。rich formatでソースコードは添付することはできないのですかね?

    昨日、ルネサスのサイトにあるe2studioのRX231評価キットのCC-RXサンプルコードを試してみたところ、それをGCCへインポートしたらビルドがとりあえず通りました。出来上がったフォルダにはsrcフォルダ下にCCRXmachine.c、CCRXmachine.hというファイルが出来上がり、今までとは様子が変わりました。ただプログラムをダウンロードしてスタートさせてもプログラムカウンターが所望の動きをせず吹っ飛んでしまっているような状態です。ここを起点にもう少し粘ってみようかと思います。

    これまでのご助言大変参考になりました。ありがとうございます。

    また質問させていただくことあるかもしれませんが、その時もご教授いただければ幸いです。
  • msatoさん
    ほや です。亀レスで失礼します。

    > また、CS+ではエクスプローラーなどで****.mtpjファイルをダブルクリックすればCS+が起動しそのプロジェクトが立ち上がったのですが、
    > e2studioでは、.mtpjファイルに相当するようなものはないのでしょうか?

    ↑ これについてのコメントがなかったので一言。
    ファイルの関連付けで起動させる手段はありません。

    e² studioの起動時にワークスペースフォルダを指定しますが、
    ワークスペースにはプロジェクトの登録情報が入っているのでそれを読んで立ち上がるようになっています。
    ワークスペースなしでいきなりプロジェクトを読み込むことはできません。

    プロジェクトの設定内容のほとんどは .cproject ファイルに入っていて、
    その意味で内容的には .mtpjファイルに近いものですが、上記の理由で.cprojectに関連付けを設定しても起動はできません。

    この仕組みは一般のeclipse/CDT環境と同じです。

  • ほや様

    ご回答ありがとうございます。
    やはりフォルダの指定となるのですね。
    疑問が一つ解消しました。ありがとうございました。


    現在、新規プロジェクトをGCCで作り、スマートコンフィグレータで設定し、何とか簡単なプログラムが動くか試みております。

    また、以下の自己レスになりますが
    ======
    昨日、ルネサスのサイトにあるe2studioのRX231評価キットのCC-RXサンプルコードを試してみたところ、それをGCCへインポートしたらビルドがとりあえず通りました。出来上がったフォルダにはsrcフォルダ下にCCRXmachine.c、CCRXmachine.hというファイルが出来上がり、今までとは様子が変わりました。ただプログラムをダウンロードしてスタートさせてもプログラムカウンターが所望の動きをせず吹っ飛んでしまっているような状態です。ここを起点にもう少し粘ってみようかと思います。
    ======

    CCRXmachine.cの中身が、以下の様になっており、NoMaY様のご回答にあったようなINITSCTが空っぽの状況でした。ここが絡んでいると思うのですが、
    『"0xfff80000 の PowerON_Reset_PC()" に対して使用できるソースがありません 』
    というようなコメントが出て、プログラムが動いていないようです。ちなみに先の投稿では言い忘れたのですが、secaddr.hは同フォルダに存在しており、下記のような内容となっています。現在どう対処してよいか分からなくなったので、新規プロジェクト作成に移行してみたのですが、何かこれらの状況に少々手を加えれば、プログラムが動くようになりますでしょうか?
    (ちなみにそのサンプルプログラムは、RX231評価キットのサンプルコードのtutorial:スイッチを押すごとにボリュームの電圧レベルをADした結果がディスプレイに表示され、同時にスイッチを押すごとに4つのLED点灯がインクリメントするという動作の物です)


    CCRXmachine.cの中身
    ==========
    #include "CCRXmachine.h"

    void _CALL_INIT(void)
    {
    }

    void _CALL_END(void)
    {
    }

    void _INITSCT(void)
    {
    }
    ==========

    secaddr.hの中身
    ==========
    typedef void (*pfunc) ();
    extern pfunc __SECTOP_D[];
    extern pfunc __SECEND_D[];
    extern pfunc __SECTOP_R[];
    extern pfunc __SECTOP_D_2[];
    extern pfunc __SECEND_D_2[];
    extern pfunc __SECTOP_R_2[];
    extern pfunc __SECTOP_D_1[];
    extern pfunc __SECEND_D_1[];
    extern pfunc __SECTOP_R_1[];
    extern pfunc __SECTOP_B[];
    extern pfunc __SECEND_B[];
    extern pfunc __SECTOP_B_2[];
    extern pfunc __SECEND_B_2[];
    extern pfunc __SECTOP_B_1[];
    extern pfunc __SECEND_B_1[];
    extern pfunc __SECTOP_C_1[];
    extern pfunc __SECTOP_C_2[];
    extern pfunc __SECTOP_C[];
    extern pfunc __SECTOP_W_1[];
    extern pfunc __SECTOP_W_2[];
    extern pfunc __SECTOP_W[];
    extern pfunc __SECTOP_L[];
    extern pfunc __SECTOP_SU[];
    extern pfunc __SECTOP_CDSEC[];
    extern pfunc __SECTOP_CBSEC[];
    extern pfunc __SECTOP_CINIT[];
    extern pfunc __SECTOP_CVTBL[];
    extern pfunc __SECTOP_CVECT[];
    ==========

  • > INITSCTが空っぽの状況でした。ここが絡んでいると思うのですが、
    それはそうかもしれません。
    本来の_INITSCTでは初期値をROMからRAMにコピーしたりセクション内をクリアしたりする処理が記述されるはずで、そこに使われるセクションのアドレス参照にsecaddr.hがあるのだと思います。処理がないならいらないですね。
    自分なら新規作成したプロジェクトからスタートアップコードを持って来てくっつけちゃいます。面倒なので。

    > "0xfff80000 の PowerON_Reset_PC()" に対して使用できるソースがありません
    これは考えられる状況がいくつかあるので要因が絞れませんが、動くか動かないかとは直接関係ありません。
    このメッセージが出ても動くものは動きます。
    参考: FAQ 3000429 : ビルド済のプログラムをデバッグするとソースが表示されない
    https://ja-support.renesas.com/knowledgeBase/18459802

  • ほや様

    ご回答ありがとうございます。参考になります。

    >自分なら新規作成したプロジェクトからスタートアップコードを持って来てくっつけちゃいます。面倒なので。

    そうですね。このやり方が手っ取り早いような気がします。できるかは別にして、新規プロジェクトをまず作ってみて、そのフォルダを探ることもやってみます。