SuperH RISC engine family V.9.04 Release 03を使用しています。
C言語において、下記の変数の記述が、ROMに配置されて困っています。
static size_t xFreeBytesRemaining = 0U;
mapファイルの内容は下記になります。
_xFreeBytesRemaining 0001f550 4 data ,l * <-ROMのアドレス
期待値は、RAMに配置されて、初期値のみが、ROMとしたいです。
ご指導ください。
わわいです
初期値付きの変数はDセクションに配置されます。
このDセクションはROMに配置されますが、実行時にはRAMに移動する必要があります
これには、リンカの設定で、DセクションのコピーをRセクションとして指定し、RセクションをRAMのエリアに配置します。
ということで、お使いのコンパイラ(ツールチェイン)のマニュアルにそこら辺の解説が書いてありますので読んでみてください。
また、SuperHではHEWかE2Studioの統合開発環境を使うことになると思いますが、いずれも、新規プロジェクトを生成するとそこら辺のセクションのコピーを前提としたソースが自動生成されますんで、そゆのを見るのも参考になると思います
追記ですが、この話題は定期的にでてくるようで、以下のスレッドが参考になると思います
http://japan.renesasrulz.com/cafe_rene/f/69/t/3519.aspx
int value=0;
int data=1;
void main(void)
{
value=1;
data=2;
printf("結果=%d,%d \r",value,data);
}
結果=1,2
先の0,1がD(ROM)がvalueとdataがB(RAM),関数内指定ではスタックS、初期値付きではB
となると思います,
プログラム規模が小さいためにRAMに変数領域を取る必要が無いのでは?
コンパイルリストもチェックしてみるのが良いです。
static宣言していても汎用レジスタで事が済んでいる可能性もあり得ます。
アドバイス頂きました皆様、有難う御座います。
基本的に、初期化している変数はDATAセクションに配置されるのですね。
LINKオプションにて次の様にすると、良いことが分かりました。
-ROM=D=R
セクション設定にて B,R とする。
ここからは、余談です。
実は、修正前は、そのようになっていました。
この状態で、割込みベクタがRAMに配置されておりました。
私は、割込みベクタをROMに配置したかったので、上記の指定を削除してしまいました。
無事ROMに配置されて、OKと思っていたのですが、別の弊害が発生しいたのですね。
浅はかでした。
そういう場合は、割り込みベクタに別のセクション名をつけて、それをROMのエリアに配置するようにします。
まあ、そこらへんはコンパイラ/リンカのマニュアルを見てください。
本当に大丈夫ですか?カフェルネを見ている多くのユーザーがあります。納得できる結論が必要です。
例えば、SH7147ならROM(フラッシュ)はアドレスH'00000000からH'003FFFFで割り込み(例外)ベクターは H'00000000から配置されるのでは?「私は、割込みベクタをROMに配置したかった」で「セクション設定を変更して、xFreeBytesRemainingに配置してしまった」、は少し理解に苦しみます。
SHコンパイラはアンインストールしてしまったので確認ができませんが、全体的な話の流れが理解できません。セクションDやBなどIKUZO さんとわわいさん・osieteさんの書き込みで不一致のように感じます。
メモリーの具体的な構成と具体的なマイコン名をお教えください。SH4ですか?
混乱を招いてしまった様です。
CPUは、SH7147です。
経緯を変更前と変更後で記載します。
[変更前]
ベクタの記述部
#pragma section ←セクション名無し
void* INT_Vectors[] = {
変数の記述
LINKオプション
セクション B,R/0FFFF8000
この状態ですと、下記のセクション配置でした。
INT_Vectors →Rセクション
xFreeBytesRemaining →Rセクション
私は、INT_Vectors をROMに配置したかったので、次の様に変更をした。
[変更後]
#pragma section INTTBL ←セクション名を設定
変数の記述(変更無し)
-start=DVECTTBL,DINTTBL,PIntPRG/00 ←VECTTBLの後にINTTBLを配置
下記の2項目は、削除しました。
セクション R (B/0FFFF8000のみの設定)
この状態で、INT_VectorsがROMに配置されたので、安心した次第です。
xFreeBytesRemaining = 0U;の様な初期値有りの変数の配置を確認しなかった。
影響が出ると考えていなかったのです。
--------------------------------------------------------------------------------
いざ、プログラムを動作する段階になって、xFreeBytesRemainingがROMに配置されている事に気がついた訳です。
そこで再変更です。
[再変更]
下記の2項目は、復活させた。
セクションR
これで、下記の配置と成りました。
INT_Vectors →ROM
xFreeBytesRemaining →(RAM)Rセクション
以上が経緯と成ります。
割り込みベクタをROMに配置したいなら
const void* INT_Vectors[] = {
では?
えーと、SHコンパイラ、リンカの世界では、デフォルトではプログラムコードはP、定数はC、初期値付きの変数はD、初期値なし変数はBというセクション名に割り当てられます。
これが理解できないというなら、マニュアルをDLしてきて読んでみましょう。
#解決済みのものをまぜっかえしてもどーしよーもないとおもいますが。。
んで、constというキーワードは、あくまで変更できない変数、というだけのはなしで(Cコンパイラの規定)、それを付けたからと言って自動的にROMに割り当てられるというものではありませんです(リンカの設定の問題)。
#まあ、デフォルトのセクション構成では、constつければたしかにROM に配置されることになりますが(Cセクションになるので)
何かアサッテの方向のレスがされてますが、ROMに配置するデータにconstを付けない理由はないと思います。
ああ、すみません。さきの発言の前半部分は kijo さんに宛てたものです。
んで後半部分は、、読み返してみるとたしかにアサッテですね。。
あなたの言を借りると、確かにconstを付けない理由はないのですが、付けなくちゃいけないものでもないよね、ってはなしですねー
実際、付けてもつけなくてもセクション名がちょと違うだけで、結果は同じとなります。
まー、この場合、const付けた方がいいよねー、ってのには私も同意しますです。
わわいです。
言及がありましたんで、先のIKUZOさんの発言の答え合わせをしておきます
>先の0,1がD(ROM)がvalueとdataがB(RAM),関数内指定ではスタックS、初期値付きではB
>となると思います,
残念ながら、不正解です
この例では、valueもdataも初期値付き変数ですんでDセクションに配置されます。
んで、AUTO変数(関数内で定義されるstaticのつかない変数)は、スタックエリアに配置されますが、スタックはSセクションに配置されるというわけではありません。
それから、Bセクションに配置されるのは、初期値のない変数となります
SHのコンパイラでは、ソースにあるおまじないを記述しておけば、Sセクションを生成してスタックをそこの値にしてくれる、という機能があります。これは、アセンブラを使わないですべてをCで記述するためのお便利機能なんですが、すべての場合でこれが適用されるというものではありません
初期化つき変数は、ROM上のセクションDに初期値が置かれて、RAM上のセクションRに変数エリアが確保され、プログラムの初期化でセクションDからRにデータのコピーがされる。今回の問題は、リンカのオプションから-ROM=D=Rとセクションの設定でRを削除したので、リンク時にセクションRが確保されず、かつ、シンボルがリロケーションがされなかった。で、全体的にまとまった答えになったと思います。
個人的な疑問としては、
1.最初にxFreeBytesRemainingがRAMに無いと判断された根拠が書かれてますが、修正後にどのようにRAM上にxFreeBytesRemainingが確保されたことを確認されたのですか?
2.>#pragma section ←セクション名無し
になってしまった理由はなんでしょうか?コンパイラーオプションで設定していたとか?
3.INT_VectorsをROMに配置するために
>-ROM=D=R
>セクションR
のリンカのオプションを削除しようと思われたのはなぜですか?
4.「DATAセクション」は何を指しているんですか?
私には思いつかない事なのでぜひお教えください。
>初期化つき変数は、ROM上のセクションDに初期値が置かれて、RAM上のセクションRに変数エリアが確保され、
>プログラムの初期化でセクションDからRにデータのコピーがされる。
SHのコンパイラ、リンカではRセクションなど作りません。またDからRに勝手にコピーなぞされません。
で、個人的な疑問を持つのは個人の勝手ですが、すでに解決した事柄において、問題とは全く関係のないあなたの疑問を質問者にぶつけるのはやめていただきたいです。
質問者が混乱しますし、なにより回答者やこれにかかわる人たちに失礼です
あなたが理解できていないのは私の責任でもありませんし、ましてや質問者の責任ではありえません。
わわいさん、あなたに質問してません。
私の2016/10/7 20:25と2016/10/8 16:18の書き込みはosieteさんに質問してます。特に、2016/10/8 16:18の質問は多くの方に参考になると思われます。
osieteさん、
2016/10/7 21:15のosieteさんの回答にはセクションRが存在するように書かれてますが、「SHのコンパイラ、リンカではRセクションなど作りません。またDからRに勝手にコピーなぞされません。」も理解できてますか?
キーポイントは「xFreeBytesRemainingがどこに取られているか?」だと思うのですが、それは大丈夫ですか?
2016/10/7 20:25に書き込んだ通り、カフェルネを見ている多くのユーザーがあります。全員とは言いませんが、なるべく多くのユーザーが参考にできる書き込みが要求されてます。そうでなければ、このフォーラムが公開されている価値がありません。
うーん、ここに限らず誰でも書ける系の掲示板の信頼性なんて、某知恵袋と変わらないと思います…。時々社員の方が変なのを訂正してくれてるっぽいので、それにお任せでいいんじゃないでしょうか?アクティブな方々が名指しでバトるのはハタから見ていて怖いのでホドホドがいいなぁと願ったり願わなかったり。