お世話になります。
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さん、ほやさん
コメント有難うございます。ご推察の通り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.htmlGoogle検索: Embedded Coderwww.google.com/search?q=Embedded+Coder[追記2]こういうやり方をする人はあまりいないと思いますが、私は過去に以下のような芸当をしたこともありました。(A) Windows(あるいはDOS時代だったかも)のコンソールアプリケーションとして、渡された引数を、あるコンパイラのものから別のコンパイラのものへ変換して、変換後のオプションで最終的にコンパイラを起動するラッパーアプリケーションを自分で書く[追記3]そういえば、昔、HEW+KPIT GCC環境で、HEWが渡して来たコマンドオプションファイルを引数にベタに展開してコンパイラを起動するwrapperコマンドが使われていた、という記憶が蘇って来ました。それだったかも、、、
とっさん さん、こんにちは。NoMaYです。> オプションに-lang=c99を加えると「F0553200:Error occurred in executing 'macrx.exe' 」が出るたぶん、加えないと> E0520020:Identifier "_Bool" is undefinedですかね?_BoolはC99で新規追加された言語仕様ですね、、、これは、文法チェックがパスしない段階ではE0520020:Identifier "_Bool" is undefined文法チェックをパスするとF0553200:Error occurred in executing 'macrx.exe'ということなのではないかと、、、 ひょっとして、m: machinea: architecturec: compile とか code とかとかかも知れませんね、、、
NoMaYさん こんにちは。
症状はNoMaYさんの記載されたとおりです。こういう時って、E0520020:Identifier "_Bool" is undefinedのエラーを消して行けば、ゴールにたどり着けるものなのでしょうか???
m,
a,
c
とはmacrxの最初の3語のことですか?
とっさん さん、こんにちは。NoMaYです。> ゴールにたどり着けるものなのでしょうか???GNUARMでビルド出来ていたのですから、正しい対処をしていけば、ビルド出来るようになりますよ。ただし、間違った対処をしたら、遠回りすることになることもあるでしょうけれど、、、今回の_Boolは-c99を付けることが正しい対処だろうと、私は思います。それを、macrx.exeのエラーが出なくなったからといって、-c99を付けないで何かやろうとしたら、それは間違った対処だろうと思うのです、、、> macrxの最初の3語のことですか?そうです。
NoMaYさん
有難うございます。
勇気が出ました!
> それを、macrx.exeのエラーが出なくなったからといって、-c99を付けないで何かやろうとしたら、それは間違った対処だろうと思うのです、、、同じくそう思います。正常にコンパイルできたから、その先に進んでmacrx.exeが呼ばれるようになったと考えます。ちなみにmacrx.exeもccrx.exeみたいに-v (version) オプションがあるのかなーと思って試してみたら、Macro Processorと表示されました。やっぱり主要な原因は環境変数が足りていないことではないかと考えます。CS+(e² studioでもいいんですが)で、ビルド時に使われている環境変数の指定を極力真似してみるのが近道じゃないかと思います。
ほやさん
ありがとうございます。もしCS+にて特に環境変数を設定しない場合はデフォルトではどのような設定となるのでしょうか。これを確認できる術はないでしょうか?
CS+で「ビルドの前(後)に実行するコマンド」(共通オプションタブの下の方の「その他」の中にあります)に set コマンドを書いてビルドしてみると、コンソールに環境変数がズラズラ表示されます。
みえました。ありがとうございます。
とっさん さん、こんにちは。NoMaYです。別スレッドに質問を投げられていたことから気になったのですけれど、ひょっとして、先へ進めていないのでしょうか?気になった別スレッドへの質問コマンドラインからccrxコンパイラを実行すると、「F0553200:Error occurred in executing 'macrx.exe' 」が出るjapan.renesasrulz.com/cafe_rene/f/forum21/5213/ccrx-f0553200-error-occurred-in-executing-macrx-exe/37689#37689
こんにちは。
実はまだうまくいっていません。macrx.exeへのpathも正しく切れたと認識しています。
Pathの文字数限界があることをルネサスさんから伺いました。これは問題ないようです。
macrx.exeがうまく実行できない理由を探している状態です。
CS+に生成された.c,.hファイルをインクルードしてビルドすると.hフィアルが参照できないとのエラーがたすうでるため、
ヘッダファイルがうまく認識できていない場合には「F0553200:Error occurred in executing 'macrx.exe' 」が出ることがあるのか気にしている状態です。
「F0553200:Error occurred in executing 'macrx.exe' 」エラーの原因の詳細が分かればよいのですが。。。
とっさん さん、こんにちは。NoMaYです。敢えてくだけた言い回しをさせて貰えば、「最初に変なエラーに遭遇してしまったせいで、作業が迷走しているんじゃないかなぁ~?」という気がするのです。一般論的には、以下のようなコンパイラが内部で起動しているコマンドが起動出来ないなんてエラーはPath設定が足りない程度では出るものではなく、ヘッダが足りないとか、宣言がエラーになるとか、そういったエラーがごく普通に膨大に出たりして、それをひとつひとつ解決していくのが移植という作業なのです、、、そういった作業の一例として、かふぇルネでも気の遠くなるような以下のスレッドがあります、、、今どきPath設定が足りない程度で出るとは思わなかったエラー:F0553200:Error occurred in executing 'macrx.exe'かふぇルネでの気の遠くなるような移植にまつわるスレッド:Amazon FreeRTOSだそうです。ルネサスさんのRXは参加しないのかな?japan.renesasrulz.com/cafe_rene/f/forum21/4772/amazon-freertos-rx思ったのですが、移植に関する経験値が足らずに、ヘッダが足りないとか、宣言がエラーになるとか、そういったエラーがごく普通に膨大に出たりする、ということを受け入れることが出来ない状態なのかなぁ、という気がしました、、、だから、F0553200エラーが出ない代わりに、ヘッダが足りないとか、宣言がエラーになるとか、そういったエラーが出るのであれば、もしかすると膨大なエラーの量になるかも知れませんけど、地道に解決していくしかないよなぁ、と思うのです。(もちろん、経験値がアップすれば、いろんなテクニックが身に付けているんですけれどね、、、)ちなみに、確認ですけれど「(A)の状況では(B)は出ない」ですよね???出るとしたら私の認識が間違っていますね、、、(A) CS+に生成された.c,.hファイルをインクルードしてビルドすると.hフィアルが参照できないとのエラーが多数出る(B) 「F0553200:Error occurred in executing 'macrx.exe' 」が出る
とっさん さん、こんにちは。NoMaYです。そういえば、以前、移植(移行)は初めて、という人の投稿がありましたが、参考までにURLを書いておきます。H8/3694からRX130への移行japan.renesasrulz.com/cafe_rene/f/002-2095199602/6376/h8-3694-rx130
こんにちは。(A)の状況では(B)は出ない」←その通りです。
Matlab側のコマンドラインでも同様に.hファイルが参照出来ない。というエラーがでればよかったのですが。
CS+側にインクルードして初めてわかりました。
とっさん さん、こんにちは。NoMaYです。すみません、「Matlab側のコマンドライン」というのは初めて出てきた言い回しだと思いますが、GNUARMでビルドしていた時を指していますか?あと、CC-RXのエラーで見付からないヘッダファイルはどういう名前のヘッダファイルでしょか?コマンドラインオプションのインクルードパスが足りないことの他にも、組み込み用途では使われない筈だから、という理由からでしょうけど、単にCC-RXにそのヘッダファイルが無い、ということもあったりしますよ。
正確認はMatlabのコマンドウィンドウというものがあります。現在はMatlabのコマンドウィンドウにてビルドを試みている状態です。質問しておきながら私の情報の出し方が、不正確であったため混乱させてしまい、申し訳ないです。
「F0553200:Error occurred in executing 'macrx.exe'」に関してはクリアできました。これが出る原因はC:\Program Files (x86)\Renesas Electronics\CS+\CC\CC-RX\V3.03.00\Binへの検索pathが正しく認識されていなかったことが原因のようです。
Matlabの機能にある検索pathなるものに上記pathを追加すると「F0553200:Error occurred in executing 'macrx.exe'」の表示はなくなりました。
どうもありがとうございます。
立て続けに申し訳ないのですが、
今、「E0520040:Expected an identifier 」というものに困っています。下記のI=73にて判定されているようです。このエラーの要因をご教示いただけないでしょうか。
typedef enum { NotValid = 48, /* Default value */ A = 65, B = 66, C = 67, D = 68, E = 69, F = 70, G = 71, H = 72, I = 73, J = 74, K = 75, L = 76, M = 77, N = 78, O = 79, P = 80, Q = 81, R = 82, S = 83, T = 84, U = 85, V = 86, W = 87, X = 88, Y = 89, Z = 90} EnumstID;
とっさん さん、こんにちは。NoMaYです。> 下記のI=73にて判定されているようです。これはCC-RXのコマンドラインオプションに誤って -define=I= のようなものが混入していないでしょうか?例えば以下のように #undef I を記述してみるとどうなりますでしょうか?
#undef Itypedef enum { NotValid = 48, /* Default value */ A = 65, 略 I = 73, 略 Z = 90} EnumstID;
とっさん さん
"I"が何かの内部定義と被っている可能性はあります(CC-RXだったかは忘れましたがそれっぽい話は聞いたことがあります)。それだとすれば名前を変える以外に回避方法がありません。
> Matlabの機能にある検索pathなるものに上記pathを追加すると「F0553200:Error occurred in executing 'macrx.exe'」の表示はなくなりました。環境変数は実行される環境に設定されるものです。例えばバッチファイルの中で環境変数を変えてもバッチファイルが実行される環境(新しく起動されたWindowsシェル)の中だけに影響が及ぶのと一緒です。MATLABが起動するシェルに環境変数を与えたら動いた、ということなのでしょう。
こんにちは。#undefにて確認してみたところ、回避できました。よって、numstIDの部分を変更しました。
この部分を回避するといくつかワーニングが出るのですが、コンパイルが完了でき、おかげさまでリンカ起動までたどり着きました。
>例えばバッチファイルの中で環境変数を変えてもバッチファイルが実行される環境(新しく起動されたWindowsシェル)の>中だけに影響が及ぶのと一緒です。>MATLABが起動するシェルに環境変数を与えたら動いた、ということなのでしょう。
この部分についてははっきりさせておきたく、Mathworksに問い合わせします。
E0562310:Undefined external symbol "_write" referenced in "fflush"というエラーにつまづいています。_writeというと関数はlowsrc.cというファイル内に記述されているところまではわかりました。ただ、if defined(__CCRX__)ではなく、if defined(__GNUC__)の定義がある場合に記載されています。__GNUC__側に記載されている、_writeを__CCRX__側に移動させて利用するのはNGなのでしょうか?そもそも何故に__GNUC__側にあるのでしょうか?
とっさん さん、こんにちは。NoMaYです。GCCとそのライブラリは(GNU本家のものにしろNEWLIBと呼ばれるものにしろ)、そもそもの出自としては、ビルドしたプログラムをUNIXというOS上で動かすことを想定していました。そして、マイコン向けに移植されたものであっても、その名残が存在したりします。fflush()というC言語標準ライブラリはファイル操作関数のひとつですが、RX64Mにハードディスクが内蔵されているわけでは無いですので、まずfflush()が呼ばれていることを不審に思って、fflush()が呼ばれている理由を調べた方が良いと思います。(疑いの第一候補は、MATLAB/Simulinkに固有のライブラリの作成者さんが#if~#endifで除外するのを忘れた、というあたりです。出自による事情+諸々によりリンク出来てしまったので気付かなかった等ですね。)他方で、CC-RXとそのライブラリは、元々シングルチップマイコン向けのものですので、ファイル操作関数などは(RX64Mにハードディスクが内蔵されているわけでは無いですので)そもそも大して作り込まれていません。そのような事情を反映して、lowsrc.c においてCC-RXとGNURXではコードが異なっているのです。