私は現在、cs+ for cc にて rx130マイコンのプログラムを組んでいます。
変数を初期化宣言するとその変数の値が固定値となり変更することができません。
どなたか教えていただけないでしょうか?
初期化宣言をどのようにすると変数の値が固定値となるのでしょうか?
わわいです
初期化しない変数はBSSセクションに配置されます
それに対し、初期化している変数はDATAセクションに配置されます
ということで、おそらくセクションの配置がおかしいため、ということになりそうです
このDATAセクションというのは、変数の初期値が入るため、ROM領域に配置する必要がありますが、それだと変数の内容が変更できなくなります
で、どうするかというと、配置するアドレスをROM領域に、使用するアドレスをRAM領域として、プログラム開始時に初期値データをRAMに転送する処理が必要となります
サンプルプログラムなどを参考にして、実際にどう処理するか調べてみることをおすすめします
追記です。。
上のBSSとDATAというセクション名ですが、これはGCCのもので、RXコンパイラ上では別の名前になると思うので、そこらへんは読み替えてくださいませ。
#SHだとBとD、RAM上のデータエリアはRですねー
kcdです
問題の変数宣言は、どんな記述ですか?
まさかconst宣言で定義してないですよね?
IKUZOさん、わわいさん、kcdさん返信ありがとうございます。
IKUZOさん
グローバル変数の初期化宣言とstatic変数の初期化宣言のときになります。
わわいさん
アドバイスありがとうございます参考にさせていただきます。
kcdさん
const宣言で定義はしてないです。以下のような感じで記述してます。
型 変数名 = 値;
例えば下記のプログラムを
void hogera(int* n) { *n = *n + 1; } int hoge = 0x12345678; void main(void) { static int piyo = 0xabcdef; hogera(&hoge); hogera(&piyo); }
プロジェクトのCC-RX(ビルド・ツール)のプロパティ(P)、「リンク・オプション」タブの「リスト」→「シンボル情報を出力する」の項目を「はい(-SHow=SYmbol)」に設定してビルドすると、ビルド時に生成される .map ファイルにリンクした結果の情報として上記のプログラムの大域変数とstatic 変数について
SECTION=R FILE=DefaultBuild\main.obj 00000404 0000040b 8 _hoge 00000404 4 data ,g * _piyo$1 00000408 4 data ,l *
出力されます。
問題の変数の配置されるアドレス等に問題はないでしょうか?
fujita nozomuさん返信ありがとうございます。
.mapファイルを確認したところ、初期化宣言した変数はDセクションに配置されているのですが、Rセクションには配置されていませんでした。
なら、リンカの設定が抜けてるってことですね
わわいさん返信ありがとうございます。
無知なものでリンカの設定と言われてもぱっときません。
設定の仕方について教えていただけないでしょうか?
自分の方で設定の仕方を見つけられました、設定を変更しデバッグをしたら値が変わっていることも確認できました。
回答してくださった皆さんありがとうございました。