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
となると思います,
えーと、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に書き込んだ通り、カフェルネを見ている多くのユーザーがあります。全員とは言いませんが、なるべく多くのユーザーが参考にできる書き込みが要求されてます。そうでなければ、このフォーラムが公開されている価値がありません。
うーん、ここに限らず誰でも書ける系の掲示板の信頼性なんて、某知恵袋と変わらないと思います…。時々社員の方が変なのを訂正してくれてるっぽいので、それにお任せでいいんじゃないでしょうか?アクティブな方々が名指しでバトるのはハタから見ていて怖いのでホドホドがいいなぁと願ったり願わなかったり。
残念ながら、わたしはkijoさんに言っています。
あなたが理解できないからと言って、質問者に無駄な負荷をかけないでください。
多くの方に参考になると思っているのはあなたの頭の中だけです
>2016/10/7 21:15のosieteさんの回答にはセクションRが存在するように書かれてますが
これにあたる発言は以下だと思いますが、
>これには、リンカの設定で、DセクションのコピーをRセクションとして指定し、RセクションをRAMのエリアに配置します。
ここにはRセクションが「最初から」存在するものとしては書いてはいません。
Rセクションはあくまでプログラマが作成、指定するものです。
繰り返しになりますが、あなたの理解は間違っています
<<かふぇルネ事務局からのお願い>>
掲示板に書き込まれた文章は、不特定多数の方が閲覧されますので、他人が不快に感じる文章や表現は避けて下さい。
また、投稿された文章に反対意見や否定的な意見を述べる場合は、必ずその理由や根拠を明示し、お互いに敬意を持ち、
相手や場面に配慮して書込みをお願いします。