こんにちは。SUZUKIです。
RL78/G14用のプログラムをCS+で開発中に良く分からない現象に遭遇しました。
プログラムは
void test(char a){
char b = 0;
b = a+10;
}
という簡単なものです。
この時に変数a,bをウォッチするとアドレスがそれぞれ[L:REG][H:REG]となっており、変数bの値は0のままでした。
動作する条件としては下記3つありました。
1.変数bの宣言をグローバルで行った場合
2.別の変数(使用しない)を関数内で宣言した場合
3.変数bの型をint型にした場合
これらの時は変数a,b共にアドレスが割り当てられ正常に動作しました。
これはどのような事が起きているのでしょうか。
宜しくお願い致します。
SUZUKIさん、こんにちは。NoMaYと申します。もし宜しければ、以下の点について教えて頂けないでしょうか?わわいさん同様、簡略化する前の実際のコードで別関数呼び出しの引数として変数bを使用していたのであれば、volatileは必要無い筈なのだけれども、と思うからです。(1) コンパイラの種類(CC-RLかCA78K0Rか)とバージョン、CS+のバージョン、コンパイル時の最適化レベル(2) 簡略化する前の実際のコードですが、CS+でウォッチした変数のアドレス/内容に関してを一旦脇に置けば、プログラムの動作そのものはvolatileを付けなくても期待した通りに動作していた、のでしょうか?(それとも、実際のコードでプログラム自体が動作していなかったので、CS+でウォッチして変数を確認していたという状況であり、実際のコードでvolatileを付けたらプログラム自体が動作するようになった、という状況でしょうか?)状況によっては、以下も教えて頂けないかどうか、尋ねさせて頂くことになるかも知れません。(3) 簡略化する前の実際のコードで呼び出されていた別関数に引き渡された変数bの値は、その別関数の中に入ってから、その関数の引数(仮にarg_b)をvolatile宣言したグローバル変数(仮にdebug_b)に代入してdebug_bの値をCS+のウォッチで確認してみた時は、期待した通りの値になるでしょうか?(何のことだか分かり難いですね。その時には、もっと分かり易く書いてみます。)(4) 簡略化する前の実際の関数の全体、そこで呼び出されている関数のプロトタイプ宣言すべて、そこで使用されているマクロ定義すべて、簡略化する前の実際の関数のコンパイルリスト(CS+の設定でコンパイルされた結果のアセンブラコードをlstファイルに出力することが出来ますので、それからの抜粋となります)、をzipファイルに固めて添付して投稿して頂く事は出来ますか?(4') 或いは、CS+のmtpjファイル、簡略化する前の実際の関数が含まれるCソース、そのソースをコンパイルするのに必要なヘッダファイル全て、をzipファイルに固めて添付して投稿して頂く事は出来ますか?(4'') 更に或いは、いっそのこと、CS+のプロジェクト全体(つまり全てのソースファイルとmtpjファイル)をzipファイルに固めて添付して投稿して頂く事は出来ますか?(もちろん、上司の許可というか会社の許可が必要になるとは思いますが。)