CS+でRX621をコンパイルしています。 次の3っつのメッセージの対処方法を教えて下さい。 放っておいても問題無いのですが、出来れば出ないようにしたい。
見難い所も有りますが、タブを半角スペースに変換しても投稿するとスペースが削除されて見難くなるようです。 (1)W0561017:Paid license of CC-RX V3 is not found, and the evaluation period has expired. Please consider purchasing the product. CS+の左のプロジェクト・ツリーから「CC-RXビルド・ツール」「>マクロ定義」で、「抑止するインフォメーションレベル・メッセージ番号」と「表示させないメッセージ」に「W0561017」や「0561017」を書いてみたのですがエラーになってしまいます。 「抑止するインフォメーションレベル・メッセージ番号」と「表示させないメッセージ」は、どのように使うのでしょうか? (2)M0560101:No stack information in "DefaultBuild\SYS_Section.obj" 次のようにスタック・ポインタを設定しています。このメッセージは、どのような条件で出るのでしょう。 set_isp((void*)0x00001000) ; // 2.2.2.1 割り込みスタックポインタ(ISP)set_usp((void*)0x00000C00) ; // /ユーザスタックポインタ(USP) 91/1977頁 (3)M0560400:Unused symbol "DefaultBuild\000_PowerON_Reset.obj"-"_Init_Port_C" 次のようにして、inline で使っています。どうして、このメッセージが出るのでしょう。 #pragma inline Init_Port_C // (Sマ)#pragma inline, #pragma noinline 278/869 頁Init_Port_C() ; // ポートCをLED出力用に設定
W0561017 は無償版 CC-RX を利用しているか、有償版を買ってあってもレジストリやライセンスデータを削除した等の普通には発生しない何かの障害により有償版のライセンスが無いとコンパイラないしはリンカが判断している場合。あなたが無償版を利用しているなら出て当然で、確かこの警告は抑制できなかったはずです。継続商用利用するなら金払えってことで、買ってください。
M0560101 でいう「スタック情報」はそっちの ISP/USP 絡みではなくて、コンパイラが生成する .STACK 擬似命令相当の「この関数のスタック使用量は 32 バイトです」情報のほうだと思われます。
https://tool-support.renesas.com/autoupdate/support/onlinehelp/ja-JP/csp/V8.02.00/CS+.chm/Compiler-CCRL.chm/Output/er_M_msglist.html
アセンブラ手書きした際に .STACK 擬似命令を生成したとか。 ccrx で c -> asm の後 asrx で asm -> obj しているとか。普通はしない変則的なコンパイル方法をしている様子。
M0560400 はもっと詳細なソースコードが無いと判断できないです。 ccrx は現状、翻訳単位を超えてまで関数のインライン展開を行わないので pragma inline を使う場合には当該関数の関数定義が同一翻訳単位内に存在する必要があります。その辺をうまく守れていないのでしょうが、いかんせん提示されているコード断片では何も判断できないです。
cacao99 さん、回答有難う御座います。
(1)>確かこの警告は抑制できなかったはずです。
(2)の 0560101 を書いてもエラーになります。 それで「表示させないメッセージ」をクリックしたときに表示される説明の中に有る 23043 を書き込むと、エラーになりません。 23043 は何なのか、次のマニュアルに載っていません。
・RX ファミリ C/C++コンパイラ、アセンブラ、最適化リンケージエディタ コンパイラパッケージ V.1.01 ユーザーズマニュアル
インターネットで、「23043 ルネサス」で探しても出て来ません。 「抑止するインフォメーションレベル・メッセージ番号」と「表示させないメッセージ」には何を書くのでしょう。 (2)>普通はしない変則的なコンパイル方法をしている様子。 そうかも知れません。新規にプロジェクトを作成すると、次のセクション設定の所にスタック領域の SUとSIが有ります。それらを使わないので、変則的なのかも知れません。 ・CS+の左のプロジェクト・ツリーから「CC-RXビルド・ツール」「共通オプション」「よく使うオプション(リンク)」「セクションの開始アドレス」 (3)> pragma inline を使う場合には当該関数の関数定義が同一翻訳単位内に存在する必要があります。その辺をうまく守れていないのでしょうが、 同じファイル内に有る函数です。1度しか使わないので、「#pragma inline」 を試してみました。 「#pragma inline」 が無ければ警告は出ません。 ●「M0560400:Unused symbol」は、「使われていない」 と言う意味ですね。 そこで 「#pragma inline」 を書く前に 「Init_Port_C()」 を書けば使用した事になるかと思い、次のように書いてみました。 しかし、「M0560400:Unused symbol」の警告は出ます。 Init_Port_C() ;#pragma inline Init_Port_CInit_Port_C() ; ●次のようにプロトタイプを書く前に置いて見ましたが変わりません。 #pragma inline Init_Port_Cvoid Init_Port_C(void) ; ●チェック機能が未熟なのか、逆に「M0560400:Unused symbol」が表示される事によって 「#pragma inline」 が適用されたと言う事が確認出来るのかな。
#pragma inline Init_Port_C
void Init_Port_C(void) ;
これは
static void Init_Port_C(void);
ってやってモージュル外から見えないようにする必要があるかも。一応、モジュール間のインライン対応も可能みたいだけどコンパイルオプションで指示する必要があるみたいですね。https://tool-support.renesas.com/autoupdate/support/onlinehelp/ja-JP/csp/V8.06.00/CS+.chm/Compiler-CCRX.chm/Output/ccrxaac0203y.html
私は製品版コンパイラの最適化で自動的に処理しているのでinline指定は移植性が下がるから使わないので試してみてください。マニュアルのコンパイラ言語仕様のところを見るとわざわざstatic修飾している。関数のstaticはそのCファイル内の大域変数および関数は他のモジュールからは参照されないものとなります。
CC-RX ヘルプ 「コンパイルオプション→ソースオプション→ nomessage 」によると-nomessage でインフォメーションメッセージ M0523009 を抑制したい場合 メッセージ番号メッセージ番号の末尾(右側)5桁を指定指定します -nomessage=23009
-nomessage でインフォメーションメッセージ M0523009 を抑制したい場合 メッセージ番号メッセージ番号の末尾(右側)5桁を指定指定します -nomessage=23009
とあるので M0560101 を抑制したかったら -nomessage=60101 とします。
/* hoge.c */ #pragma inline init_port_c static void init_port_c(void); void caller(void) { init_port_c(); } void init_port_c(void) { }
上記コードをコンパイルして、オイラのところでは何のエラーも警告も出ません。
$ ccrx -nologo -isa=rxv2 -message -listfile -show=source hoge.c $
そして期待通りインライン展開されています(最適化指定してないのに)
.glb _caller ;LineNo. C-SOURCE STATEMENT .SECTION P,CODE 00000000 _caller: .STACK _caller=4 ; 1 /* hoge.c */ ; 2 #pragma inline init_port_c ; 3 static void init_port_c(void); ; 4 void caller(void) { ; 5 init_port_c(); 00000000 02 RTS ; 6 } ; 7 void init_port_c(void) { } .END
M0560400 ですが、オイラのところでこれを見たことが一度もありません。というか、リカルドさんとこで表示されているメッセージ・インフォメーションがことごとく、オイラのところで一度も見たことないものばかりです。リカルドさんとこの CC-RX が壊れているとか、ウイルス対策ソフトが正常動作を害しているとか、ソッチ系の環境不具合を疑います。別 PC を用意して(仮想 PC で十分)CS+ の新規インストールからテストすることをお勧めします。
書き込みをしても、モデレータに引っ掛かります。 他にも書き込みをしています。 これ自身はどうなるかな? cacao99 さん、回答有難う御座います。
>#pragma inline Init_Port_Cstatic void Init_Port_C(void);ってやってモージュル外から見えないようにする必要があるかも。一応、モジュール間のインライン対応も可能みたいだけどコンパイルオプションで指示する必要があるみたいですね。
同じファイル内に有る関数です。関数の中で操作しているのは、I/O装置のレジスタだけです。 >とあるので M0560101 を抑制したかったら -nomessage=60101 とします。 5桁の数字にしたら、エラーは出なくなりました。しかし抑制効果は有りません。 >M0560400 ですが、オイラのところでこれを見たことが一度もありません。 「変数や関数を定義したけど使っていない」と言う意味だと思い、次の実験をしてみました。 確かに M0560400 は出ませんね。使用していない関数 ASD に警告が出ないのもおかしい。 void main (void){123 ; // M0520174:Expression has no effectchar ABC ; // W0520177:Variable "ABC" was declared but never referenced} void ASD(void){a: goto a;} // 警告無し
提示 ASD(void) は static ではないので、その翻訳単位内では使っていないが、別の翻訳単位から使うであろうことをプログラマ並びにコンパイラは期待している、と解釈できます。なのでこれに対してコンパイル時に警告を出すコンパイラがあったらそっちのほうがおかしいです。リンクした結果やはり使っていない変数や関数がある場合には、リンカが検出して削除し、マップファイルにその旨のログが残ります。が、これは警告ではなくて単なる情報。特に C++ のメンバ関数なんかだと、インライン展開したものと単純コンパイルしたものの両方がオブジェクトファイルに格納される場合があり、このときインライン展開されなかった関数がリンク時最適化で削除された、なんてのは普通です。オイラのところでもそういうのバンバンあります。
static void ASD(void) { }
の場合、文法解釈上他の翻訳単位からこの関数を使うことができません。当該翻訳単位内からも使っていないので、単なる無駄です。オイラんとこの ccrx v3.05.00 でこのソースをコンパイルすると
$ ccrx -nologo -isa=rxv2 -utf8 -message hoge.c hoge.c(1):W0520177:Function "ASD" was declared but never referenced
となります。警告レベルを上げても下げても W0520177 になって M0560400 は出ません。そういう意味でオイラは M0560400 なるメッセージをただの一度も見たことないです。
さてこの書き込みを 2025/05/09 08:35 JST 時点で行っていますがモデレートにひっかかるか?
cacao99 さん、回答有難う御座います。 良く見たら書いて有りました。 最初の2行は、行番号が書いて有ります。それで行番号で探したけれど見つからなかった。 しかし最後の行に書いて有りました。 ● ..\..\User_Files\C_Files\010_Temp\011_Temporary.C(7):M0520174:Expression has no effect..\..\User_Files\C_Files\010_Temp\011_Temporary.C(8):W0520177:Variable "ABC" was declared but never referenced>DefaultBuild\Study.abs DefaultBuild\Study.motW0561017:Paid license of CC-RX V3 is not found, and the evaluation period has expired. Please consider purchasing the product.M0560400:Unused symbol "DefaultBuild\1st\000_PowerON_Reset.obj"-"_ASD"
●void main (void){123 ; // M0520174:Expression has no effectchar ABC ; // W0520177:Variable "ABC" was declared but never referenced} void ASD(void){a: goto a;} // M0560400:Unused symbol "DefaultBuild\1st\000_PowerON_Reset.obj"-"_ASD"
リカルドさん、管理人です。上記のテスト書込みは私が解除したので一般公開されています。ですのでリカルドさんの問題はまだ解消されていません。私からリカルドさんにメールを送っていますので、そのメールに返信ください。
以上、よろしくお願いします。