saddr領域について質問があります。
連投ですみません。
構成としてROMがBoot領域とFlash領域にわかれており、
Boot側のリンクディレクディブでsaddr領域を0xFE20 - 0xFEE0 と定義しています。
この状況でコンパイルするとsaddrに領域に割り当てられる変数がいくつかあります。
まだBootとFlashが分かれていない状態ではsaddrに変数は割りついていませんでした。
なぜsaddr領域に変数が割り当てられてしまうのか、わからないので、その条件があれば
ご教示願います。
また変数をsaddr領域に割り当てたくない場合、コンパイラオプション等で方法があれば
そちらについてもお願いします。
というのもsaddr領域に本来割り当ててならない変数が含まれており、
対策として、saddr領域を使用しないようにしたいと思っています。
追加で質問させていただきます。
RL78/G14中3.1.3章に、下記の注意事項がありますが、その中の「データ・バッファ」とは具体的に何を指しますか。
「すべての変数」という解釈でよろしいでしょうか?
もしそうであれば、セルフ・プログラミング時およびデータ・フラッシュ書き換え時は、FFE20H~FFEDFHの領域は使用不可 という認識でよろしいでしょうか?
-------------------------
注意2. セルフ・プログラミング時およびデータ・フラッシュ書き換え時は,スタック,データ・バッファ,
ベクタ割り込み処理の分岐先やDTC による転送先/転送元で利用するRAM アドレスをFFE20H~FFEDFH
の領域に配置しないでください。
しかしながら、初期値付変数は、自動的にFFE20H~FFEDFHの領域に割り当てられてしまいます。
初期化付変数を、FFE20H~FFEDFH以外の領域に割り当てるには、どのようにすればよろしいでしょうか?
よろしくお願いします。
チョコです。
担当者に確認した内容を示します。
> なぜsaddr領域に変数が割り当てられてしまうのか、わからないので、その条件があれば
具体的な情報がないので,想像するに,2つの領域を分けたことで,相互参照している部分のアドレス計算が複雑になり,ランタイムライブラリが必要になり,ランタイムライブラリがsaddr領域を使用したのではないかと考えられます。
> また変数をsaddr領域に割り当てたくない場合、コンパイラオプション等で方法があれば
saddr領域に割り当てたくない変数を含むセクションをリンクディレクティブでアドレスを指定してみてください。
> 下記の注意事項がありますが、その中の「データ・バッファ」とは具体的に何を指しますか。
フラッシュに書き込むためのデータを格納している領域のことです。決して,「すべての変数」を意味している訳ではありません。
ここの記述内容は,セルフ・プログラミング・ライブラリで使用するスタック領域や書き込むデータが格納されたバッファをsaddr領域に設定しないこと及び,セルフ・プログラミング・ライブラリ動作中に発生する可能性のある割り込みやDTCでsaddr領域を使用しないようにということです。その他の(お客様の)プログラムで使用するデータ等がsaddr領域にあっても問題ございません。
なお,変数は順番に確保されていきますので,たまたまsaddr領域に入ってしまったか,sreg宣言している場合が考えられます。
どちらにしても,上に書きましたように,saddr領域に配置されても問題にはなりません。
チョコ様
回答ありがとうございました。
セルフプログラミングのため再リンク機能を使用したところ、データフラッシュ時に、うまくDTCが働かないことがわかりました。
さらにDTCの転送元がsaddr領域に配置されていることがわかり、cファイルでsreg宣言していないのにもかかわらず、配置されてしまったので、今回の質問に至りました。
結果、vfiファイルの中身を確認したところ、この中でsreg宣言がなされていたので、
これをはずすことにより通常のRAM領域に以降し、データフラッシュ中でもDTCが正常に動作させることができました。