こんにちわ。ojojと申します。
ループ内で宣言したローカル変数をウォッチウィンドウからチェックすると値などが'?'と表示され困っております。ループ外で宣言した場合は表示されるので、そうすればよいのですが出来ればスコープを短くしたいです。
対処法をご存じの方いらっしゃいましたらご教授いただけないでしょうか。
環境マイコン:RX23t仕様ソフトウェア:CS+ ver8.06.00コンパイラ:CC-RX V3.03.00エミュレータ:RENESAS E1エミュレータ
状況(ソースを出せないのでイメージです。スミマセン。)
パターン1main{ while(1){ static uint16_t test=0; test = 1; }//test がウォッチウィンドウで表示できない}
パターン2main{ static uint16_t test=0; while(1){ test = 1; }//test がウォッチウィンドウで表示できる。}
以上です
ojojさん、こんにちは。NoMaYです。#以前は3ヶ月前でしたね。これは第一印象としては最適化を掛けたままでデバッグしているのだ思われます。もしそうであれば、最適化無しに設定変更してみて下さい。そうでなければ、その旨リプライして頂けますか?
NoMaY様、リプライありがとうございます。
最適化はかけておりません。
ojojさん、こんにちは。NoMaYです。そうでしたか。こちらでもプログラムを書いて試してみます。
スコープ(関数名#変数名)を指定すれば良いのでは。http://tool-support.renesas.com/autoupdate/support/onlinehelp/ja-JP/csp/latest/CS+.chm/DebugTool-RX.chm/Output/db_P_watch.html
内部変数でもstaticならアドレスが一意に決まるのでスコープを指定すれば常時見えるようになるはずです。(関数内に同じ名前の変数を複数作った場合の区別の仕方は分かりませんでしたが、別名のシンボルが作られるのでそれも可能だとは思います)
ojojさん、こんにちは。NoMaYです。こちらでプログラムを書いて試してみると、以下の画面コピーの通り、期待したように表示されましたね。(ただ、CC-RXとCS+のバージョンがそちらと少し違っているのは申し訳無いですけれども。CC-RX V3.04 CS+ V8.07)何か別の要因が関係していそうです。(もともとイメージ的なコードとのことですし。) この場合の通常の対処は、なぜ困っているこちらがそんなことをしないといけないのだ、という理不尽感はあるでしょうけれども、ソースを切り貼り&関数名/変数名を変更して、開示可能で再現可能なものを作成して頂くことになってしまうと思います。以下、CS+の画面コピーです。以下、ソースコードです。
#include <stdint.h>#include <machine.h>void func1(void);void func2(void);void func1(void){ /**/while/**/(1){ static uint16_t test=0; test = 1; test = 0; test = 1; nop(); }//test がウォッチウィンドウで表示できない}void func2(void){ static uint16_t test=0; /*while(1)*/{ /* static */ test = 1; test = 0; test = 1; nop(); }//test がウォッチウィンドウで表示できる。}void main(void){ for(;;) { func1(); func2(); }}
ほや様
ご回答ありがとうございます。
今回はmain関数内なので
main#test
と登録し試しましたがうまくいきませんでした。
NoMaY様
ソースコードをコピーし、件のプロジェクトにソースコードを上書きしましたところ、私の環境でも正しく変数内容がウォッチウィンドウに表示されました。
NoMaY様のおっしゃるとおり、私が原因と思っていた部分とは別の部分に原因があるようです。再現性のあるコード作れましたらまた投稿します。ありがとうございました。
> うまくいきませんでした。が、「アドレスも含めて ? だった」という意味なら最適化の結果変数としての実体がなくなったのだと思います。宣言はstaticでもループを抜けないと分かっていれば参照される機会がないので不要と判断されたのでは。
ほや様 ご回答ありがとうございます
アドレス含めて?となっています。最適化レベルを0にしているのですが、そのような事態が発生するのでしょうか?
asmリスティングや逆アセンブル表示を見れば分かると思います。(初心者フォーラムとしては不適切な答えかもしれませんがここは逃げちゃダメだと思います)リスティングファイル(*.lst)で見ると内部変数は__$test$1のようなシンボルで生成され、アドレスの定義もされます。変数が実装されなければそれらもリスティングに出力されなくなるので何が起きたかはある程度推測できます。変数が固定値に置き換えられるような処理は、最適化が無効でも起こります。値を確認する必要があって消されたくないなら変数宣言にvolatileを付けてください。