はじめて、投稿します。よろしくお願いいたします。
サンプルプロジェクト ADC_OneShotにてLCDに正常に表示がされません。(ADC_Repeatでも同じでした)。
環境は以下の通りです。OS:Windows 7 64bit
e2studio Version: 4.0.1.007
KPIT GNURL78-ELF ToolchainVersion:v15.01
現象として、・ビルド、デバッグは動作している(デバッグパースペクティブにて、変数の値参照や、ステップ実行などが可能)。
・関係があるかわかりませんが、デバッグに入る際、以下のメッセージが表示される。 Warning: the current language does not match this frame.
・実行中にLCDにアクセスはしようとしているらしく、LCDにノイズのようなものが出る。
・デバッグにて少し調べたところ、DisplayLCD()関数の2番目の引数に固定文字列が入る際、 固定文字列のアドレスと引数に手渡されてきたアドレスがずれている。 そのためか、まともな文字列が引数として渡されていない。
・ためしに、同プロジェクトでグローバル変数の初期化を追加し、 const char test_str[4] = "abc"; 等とした場合も、test_strには"abc"が入らず、よくわからない文字列がデバッグにて確認できる(ただし、タブDetailsには"abc"と出る)。 なぜか、 char test_str[4] = "abc"; の場合は、test_strは"abc"となる。
なお、・マルツエレック様HPの「演習1:スイッチでLEDを点灯する」は問題なく動作し、 追加で、グローバル変数の初期化を const char test_str[4] = "abc"; とした場合も、test_str[4] は "abc"とちゃんと代入ができている。・工場出荷デモプログラムは問題なく動作し、LCDの表示もできているので、 ハード的な故障ではなさそう。
以上です。環境がうまく整っていないのか、プロジェクトやデバッグの設定か、文字コードあたりにおかしなところがあるのではないかと思っておりますが、どなたかわかる方いらっしゃいますでしょうか?よろしくお願いいたします。
追記:
その後、いろいろ調べてみましたが、以下のような場合にconstのポインタ型に固定値のポインタを代入しようとすると、意図と違う値になってしまうようです。
例1:グローバル変数の初期化
const char * test_pt = "abcdef"; // *test_pt = 'a'にならない。
const int test_array[3] = {0x01, 0x02, 0x03}; // test_array[0]=1,test_array[1]=2,test_array[2]=3にならない。
例2:関数引数(constポインタ型)への固定値代入
void test_func((const char *)string){
// 略
}
void main(void){
test_func("ABC"); //このように固定文字列を関数の引数にすると、tet_func()のstringの値がおかしくなる。
結局、DisplayLCD()関数への固定文字列設定や、LCD用フォントの初期化がうまくいかずLCD表示ができていないようです。
以上、よろしくお願いいたします。
サンプルのコードに誤りがありました。
回避方法としては、リンカの設定変更があります。
e2 studioの、プロパティ>C/C++ビルド>設定>Linker>セクションで、.textの配置場所を.initや.rodataより上位のアドレス(設定画面下側)に変更します。
Rulzのメディアギャラリー(Files)に設定変更したファイルを置きましたので、お試しください。
(リンカ設定ファイル".HardwareDebuglinker"が変更されています。)
なお、「Warning: the current language does not match this frame.」のメッセージは動作に影響はありませんので無視していただいて結構です。
【原因】
MTKボード搭載のRL78/G14(104PJ)は、コードFlashの一部をミラー領域に投影してRAMのように参照させられますが、この機能が有効なのはFlashメモリ上のアドレス0x3000 - 0x9EFFの間にあるデータ(文字列などの固定値を含む)です。
問題のサンプルプログラムではコードやフォントデータのサイズが大きく、固定文字列がミラー領域で見える範囲よりも後ろのアドレスに配置されており、これが原因で値が正しく参照できていませんでした。
Takayuki Nakae様
ご回答ありがとうございました。
対処法だけでなく、原因の丁寧な解説もしていただき、まだ理解が浅い身として、大変ありがたく思います。
早速、確認したいのですが、
現在、および、今後しばらくの間、諸事情により、開発環境やサンプルプロジェクトが入っているPCに触れない状況が続いてしまいます。
スレッドを立てておいて申し訳ありません。
ただ、原因がはっきりしており、対策もいただいているため、本問題については、まずは解決とさせていただきたいと思います。
後日、確認ができる状況になったら、結果をご報告いたします。