cc-rxでのプリプロセッサ指令

お世話になります。

RXコンパイラcc-rxにおいてプリプロセッサ命令には下記のような物はないと認識したので宜しいですよね?

これらはGCCの場合に有効なプリプロセッサ命令ですよね。

DTERMFCN=1 -DONESTEPFCN=1 -DMAT_FILE=0 -DMULTI_INSTANCE_CODE=0 -DINTEGER_CODE=0 -DMT=0 -DCLASSIC_INTERFACE=0 -DALLOCATIONFCN=0 -DTID01EQ=0 -DMODEL=NassFCM -DNUMST=1 -DNCSTATES=0 -DHAVESTDIO

 

マイコンの変更に伴うコード移植をしております。前マイコンはTIのRM46 ARM系出会ったため、GCCでした。

どうぞ宜しくお願いします。

  • とっさん さん、こんにちは。NoMaYです。

    > これらはGCCの場合に有効なプリプロセッサ命令ですよね。

    以下でGoogle検索して気付いたのですが、MATLAB/Simulinkの生成コードで使われているものではありませんか?つまり、GCCとかCC-RXとかとは関係が無いのではありませんか?

    Google検索: "-DONESTEPFCN"
    www.google.com/search?q=%22-DONESTEPFCN%22
     

  • ほや です。
    GCCの-Dオプションに対応するのは、CC-RXだと-defineなのですが、確かにシンボル名がMATLABっぽいですね...
    (参考) CC-RXコンパイラオプション -define
    http://tool-support.renesas.com/autoupdate/support/onlinehelp/ja-JP/csp/latest/CS+.chm/Compiler-CCRX.chm/Output/ccrx02c0501y0104.html

  • NoMaYさん、ほやさん

    コメント有難うございます。ご推察の通りMathworks社のSimulink,Matlab,EmbddedCorderを利用して、ブロックからC原語を出力し、Makeファイルを作製して実行ファイルを作成しようとしている段階です。これまでTIマイコンでしたが、ルネサス製マイコンへのリプレースを試みています。

    この過程においてmakeファイルを作成するのですが、EmbeddedCorderがーDではじまるオプションを呼び出すため、CC-RXがーDを認識できず、今回の質問?となりました。

    ただ、TIマイコンでのコンパイラは-Dオプションを認識していたのでした。

    どなたかMathworks社のEmbeddedCoderを利用してRXマイコンの実行ファイルを作製している方をご存知ないでしょうか。

    経験をお借りしたく。。。。

  • とっさん さん、こんにちは。NoMaYです。

    > EmbeddedCorderがーDではじまるオプションを呼び出す

    この部分の意味が分からないです。というか、コンパイラが異なればオプションの指定方法が異なるのは普通の事態ですので、どういう経緯で-Dオプション(GNUARM)とほやさん指摘の-defineオプション(CC-RX)の違いの件がクローズアップされているのか分からないのです。

    自分が想像出来るのは、MATLABでソースコードと一緒にmakefileも生成されるけれども、そのmakefileがGNUARM用になっているのをCC-RX用に書き換えようとしている、ところまでしか想像出来ないのです。すみません。

    それでも、一般的にはそのような場合は以下の何れかの対処をするものだと思うのです、、、

    (1) makefileを手作業で書き換える。もし、生成される度に差異が生じるのであれば、毎回書き換える
    (2) 毎回書き換えるのが煩雑で、且つ、スキルがあれば、何らかのスクリプト言語で書き換えを自動化する

    スクリプト言語としては、Linuxであれば古典的にはsed,awk,perlなどがあり現代的にはruby,pythonなどかと思いますし、WindowsであればVBSscript,JScript,PowerShellとかだと思うのです。

    [追記]

    Embedded Coder
    組込みシステム用に最適化された C コードと C++ コードの生成
    jp.mathworks.com/products/embedded-coder.html

    Google検索: Embedded Coder
    www.google.com/search?q=Embedded+Coder

    [追記2]

    こういうやり方をする人はあまりいないと思いますが、私は過去に以下のような芸当をしたこともありました。

    (A) Windows(あるいはDOS時代だったかも)のコンソールアプリケーションとして、渡された引数を、あるコンパイラのものから別のコンパイラのものへ変換して、変換後のオプションで最終的にコンパイラを起動するラッパーアプリケーションを自分で書く

    [追記3]

    そういえば、昔、HEW+KPIT GCC環境で、HEWが渡して来たコマンドオプションファイルを引数にベタに展開してコンパイラを起動するwrapperコマンドが使われていた、という記憶が蘇って来ました。それだったかも、、、

  • NoMaYさん

    リプライ大変有難う御座います。ARM用の物をCC-RX用に書き換えようとしております。ご推察のとおりです。ほやさんが記載して下さったように-Dを-defineに書き変えてトライしてみます。

    これまでは下記のピンクの部分をtool.setDirective( 'PreprocessorDefine', '-D);と記載しておりました。そうすると

    ーーーーーーーーーーーーーーーーーーーーーー

    tool = tc.getBuildTool('C Compiler');
    tool.setName( 'Renesas C Compiler'); % Descriptive name for you own identification
    tool.setCommand( 'ccrx'); % Compiler command name
    tool.setDirective( 'IncludeSearchPath', '-include');
    tool.setDirective( 'PreprocessorDefine', '-define');
    tool.setDirective( 'OutputFlag', '-output=obj=');
    ーーーーーーーーーーーーーーーーーーーーーー
    添付ファイルのようなエラーとなったのです。以下一部抜粋です。
    ーーーーーーーーーーーーーーーーーーーーーー
    ### Utilize toolchain : Renesas | gmake makefile (RX64M) ### 'C:\Users\59692\Desktop\20210222_Simulink Share\Main\NassFCM_ert_rtw\NassFCM.mk' is being made... ### 'NassFCM' is being build: "C:\PROGRA~1\MATLAB\R2017A~1\bin\win64\gmake" -f NassFCM.mk postbuild all ..."C:\Program Files (x86)\Renesas Electronics\CS+\CC\CC-RX\V3.03.00\Bin/ccrx" -isa=rxv2 -fpu -endian=big -dbl_size=8 -signed_char -signed_bitfield -auto_enum -bit_order=left -pack -lang=c99 -DTERMFCN=1 -DONESTEPFCN=1 -DMAT_FILE=0 -DMULTI_INSTANCE_CODE=0 -DINTEGER_CODE=0 -DMT=0 -DCLASSIC_INTERFACE=0 -DALLOCATIONFCN=0 -DTID01EQ=0 -DMODEL=NassFCM -DNUMST=1 -DNCSTATES=0 -DHAVESTDIO --include_path=C:/Users/59692/Desktop/202102~1/Main --include_path=C:/Users/59692/Desktop/202102~1/Main/NassFCM_ert_rtw --include_path=C:/Users/59692/Desktop/HA11test/src/smc_gen --include_path=C:/Users/59692/Desktop/202102~1/Main/AppInterface/Nass --include_path=C:/Users/59692/Desktop/202102~1/Main/AppInterface/Generic --include_path=C:/PROGRA~1/MATLAB/R2017A~1/extern/include --include_path=C:/PROGRA~1/MATLAB/R2017A~1/simulink/include --include_path=C:/PROGRA~1/MATLAB/R2017A~1/rtw/c/src --include_path=C:/PROGRA~1/MATLAB/R2017A~1/rtw/c/src/ext_mode/common --include_path=C:/PROGRA~1/MATLAB/R2017A~1/rtw/c/ert "AirByp.c" RX Family C/C++ Compiler V3.03.00 [20 Nov 2020] RX Family Assembler V3.03.00.02 [11 Nov 2020] Renesas Optimizing Linker V3.03.00 [01 Oct 2020] Copyright (C) 2011, 2020 Renesas Electronics Corporation Copyright (C) 2003-2020 University of Illinois at Urbana-Champaign. All rights reserved. E0511108:The "-dtermfcn" option is not recognized. E0511108:The "-donestepfcn" option is not recognized. E0511108:The "-dmat_file" option is not recognized. E0511108:The "-dmulti_instance_code" option is not recognized. E0511108:The "-dinteger_code" option is not recognized. E0511108:The "-dmt" option is not recognized. E0511108:The "-dclassic_interface" option is not recognized. E0511108:The "-dallocationfcn" option is not recognized. E0511108:The "-dtid01eq" option is not recognized. E0511108:The "-dmodel" option is not recognized. E0511108:The "-dnumst" option is not recognized. E0511108:The "-dncstates" option is not recognized. E0511108:The "-dhavestdio" option is not recognized. E0511108:The "--include_path" option is not recognized.
    ーーーーーーーーーーーーーーーーーーーーーー

    wrapperというかのは初めて聞きました。調べてみますLaughing

  • とっさん さん、こんにちは。NoMaYです。

    > これまでは下記のピンクの部分をtool.setDirective( 'PreprocessorDefine', '-D);と記載しておりました。

    そ、そ、、、それでは駄目でしょう、、、(単純素朴に設定漏れの範疇でしょうかね、、、)

    ちなみに、今CS+のヘルプを見たら、正確には -define= かも知れません。普段はCS+のGUI上で設定しますので、'=' の有無までは覚えていませんでした、、、

  • NoMaYさん、

    リプライありがとうございます。ですよね笑

    いつもCS+やCCSのような統合開発環境を使うため、こういう記述は、あまり慣れておらず、お恥ずかしい。。。

    改めて進めてみます。ありがとうございますBlush

  • NoMaYさん

    またご教示いただいてよろしいいでしょうか。

    cc-rxのドキュメントから下記を参照して

    「ccrx -isa=rxv1 -output=obj=tp.obj tp1.c tp2.c」まねてみたのですが、
    下記のエラーが出ました。
     
    理由としてどのようなことが挙げられるのでしょうか。
     
    どうぞよろしくお願いいたします。

    -------------------------

    ...### ツールチェーンの使用: Renesas | gmake makefile (RX64M)
    ### 'C:\Users\59692\Desktop\20210222_Simulink Share\Main\NassFCM_ert_rtw\NassFCM.mk' を作成しています...
    ### 'NassFCM' をビルドしています: "C:\PROGRA~1\MATLAB\R2017A~1\bin\win64\gmake"  -f NassFCM.mk postbuild all
    "C:\Program Files (x86)\Renesas Electronics\CS+\CC\CC-RX\V3.03.00\Bin/ccrx" -isa=rxv2 -fpu -endian=big -dbl_size=8 -signed_char -signed_bitfield -auto_enum -bit_order=left -pack -lang=c99 -output=obj -define=TERMFCN=1 -define=ONESTEPFCN=1 -define=MAT_FILE=0 -define=MULTI_INSTANCE_CODE=0 -define=INTEGER_CODE=0 -define=MT=0 -define=CLASSIC_INTERFACE=0 -define=ALLOCATIONFCN=0 -define=TID01EQ=0 -define=MODEL=NassFCM -define=NUMST=1 -define=NCSTATES=0 -define=HAVESTDIO -include=C:/Users/59692/Desktop/202102~1/Main -include=C:/Users/59692/Desktop/202102~1/Main/NassFCM_ert_rtw -include=C:/Users/59692/Desktop/HA11test/src/smc_gen -include=C:/Users/59692/Desktop/202102~1/Main/AppInterface/Nass -include=C:/Program -include=C:/Users/59692/Desktop/202102~1/Main/Files -include=C:/Users/59692/Desktop/202102~1/Main/(x86)/Renesas -include=C:/Users/59692/Desktop/202102~1/Main/Electronics/CS+/CC/CC-RX/V3.03.00/bin -include=C:/Users/59692/Desktop/202102~1/Main/AppInterface/Generic -include=C:/PROGRA~1/MATLAB/R2017A~1/extern/include -include=C:/PROGRA~1/MATLAB/R2017A~1/simulink/include -include=C:/PROGRA~1/MATLAB/R2017A~1/rtw/c/src -include=C:/PROGRA~1/MATLAB/R2017A~1/rtw/c/src/ext_mode/common -include=C:/PROGRA~1/MATLAB/R2017A~1/rtw/c/ert "AirByp.c"
    RX Family C/C++ Compiler V3.03.00 [20 Nov 2020]
    RX Family Assembler V3.03.00.02 [11 Nov 2020]
    Renesas Optimizing Linker V3.03.00  [01 Oct 2020]
    Copyright (C) 2011, 2020 Renesas Electronics Corporation
    Copyright (C) 2003-2020 University of Illinois at Urbana-Champaign.
    All rights reserved.
    AirByp.c:
    F0553200:Error occurred in executing 'macrx.exe'

  • macrx.exe はアセンブラソース(*.src)を入力に要求するコマンドなので、
    コンパイラが出力した中間のアセンブラソースをアセンブラに渡すために呼ばれたのかと。
    いずれにせよコマンドが実行できないと言っているので、実行環境がコンパイラの要件を満たしていないのかもしれません。
    CygWinとか使ってますか?

    同じものをビルドするプロジェクトをCS+で作り直した方が早そうに思えますが...

  • ほやさん

    リプライありがとうございます。

    CygWinは使っておりません。

    わたしも「コンパイラが出力した中間のアセンブラソースをアセンブラに渡すために呼ばれたのかと。」と同じ認識です。

    ccrxはできても、macrxが実行できない場合って、どんなケースがあるのでしょうか。

    どうぞよろしくお願いいたします。

  • とっさん さん、こんにちは。NoMaYです。

    > ccrxはできても、macrxが実行できない場合って、どんなケースがあるのでしょうか。

    それを探るために、私の場合、Windowsのコマンドプロンプトウィンドウを開いてMATLAB Embedded Coderが実行しようとしたコマンドを手入力してみると思います。

    "C:\Program Files (x86)\Renesas Electronics\CS+\CC\CC-RX\V3.03.00\Bin/ccrx" -isa=rxv2 -fpu -endian=big -dbl_size=8 
    -signed_char -signed_bitfield -auto_enum -bit_order=left -pack -lang=c99 -output=obj -define=TERMFCN=1 途中省略
    -include=C:/PROGRA~1/MATLAB/R2017A~1/rtw/c/ert "AirByp.c"


    咄嗟に思い浮かんだ可能性としては以下のものがあります。確度は不明ですが、、、

    ・環境変数PathにCC-RXのパスが追加がされていないといけない?
    ・環境変数Pathが削除されていてはいけない?(MATLABが環境変数Pathを子プロセスに引き継いでいない?)
    ・環境変数TEMPやTMPが削除されていてはいけない?(MATLABが環境変数TEMPやTMPを子プロセスに引き継いでいない?)
    ・(そもそも)AirByp.cが余りに巨大でコンパイル出来ない
    ・(MATLABを起動していると)メモリ不足でコンパイル出来ない

    など。

  • NoMaYさん

    御教示ありがとうございます。

     Windowsのコマンドプロンプトウィンドウの手法を試してみます。

     また、ご示唆頂いた可能性について、Matlab側にも確認してみます。

    どうも有難うございます。

  • とっさん さん、こんにちは。NoMaYです。

    > また、ご示唆頂いた可能性について、Matlab側にも確認してみます。

    むしろ、F0553200:Error occurred in executing 'macrx.exe'に関しては先にルネサスさんに問い合わせた方が見通しが良くなるかも知れません。(既に問い合わせているかも知れませんが、、) 私が挙げた可能性は、どちらかというと、CC-RX側に起因する可能性が主、ですので、、、