はじめまして。
よろしくお願いいたします。
c言語については理解できていると思っているのですが、
マイコンプログラミングがいまいち理解できていない状態です。
現在、ROM領域に入らない大きさのオブジェクトを外部フラッシュに格納する方法で困惑しております。
リンクディレクティブによって設定できるそうなのですが、リンクディレクティブ事態がよくわかりません。
CubeSuiteのヘルプからサンプルファイルを参照し、
内蔵ROM、内蔵RAMの設定があることは確認できました。
(この部分にどんなことが書いてあってどう設定するのかは理解できていません。)
その後、#pragma 指定で行うようなのですが
ここもどう指定してよいかが理解できません。
#pragma section で変数や関数を置くことはわかっているのですが、
オブジェクトやライブラリを置く方法がわかりません。
リンクディレクティブを設定し、
フラッシュ領域にオブジェクト、ライブラリを格納する方法を
ご教示いただけないでしょうか。
コンパイラが生成するセクションとリンカの働きが理解できていないようですね。
ヘルプでは断片的な情報になってしまうので、コンパイラのマニュアルを参照する事をお勧めします。
V850用はこれです↓
このマニュアルの「3. 4 セクション名一覧」「第 5 章 リンク・ディレクティブ仕様」「第 8 章 ROM 化」にセクション・リンカについて書かれています。
リンカの設定を変更した時は、リンカが出力するMAPファイルを必ず確認して下さい。
所望のオブジェクトが出来ても、デバッグ時に外部フラッシュに書込む手段が必要になりますが、それはIKUZOさん紹介のFAQに概要が書かれています。
さらに、デバッグ完了後はリリース方法についても考える必要があります。
内蔵フラッシュと外部フラッシュは別に書く必要がありますので、ROMイメージファイルも別々に生成する必用があるはずです。
windypon様
ありがとうございます。
まさにおっしゃる通りで、コンパイラ、セクション、リンクが理解できていません・・・
ご提示いただいたユーザーズマニュアルをダウンロードして勉強します。
そのうえでまた質問をさせていただきたく思いますので、
その時はまたご指導をおねがいできますでしょうか。
CubeSuite+ V2.00.00 統合開発環境 ユーザーズマニュアル コーディング編 (CX コンパイラ)
「3. 4 セクション名一覧」「第 5 章 リンク・ディレクティブ仕様」「第 8 章 ROM 化」
簡単に説明しますと(一般的な例ですV850そのものではありませんが似たようなものと思います)
C言語の実行される部分(code)
既知のデータが参照される部分(const)
データの内容が変わりうる部分(data)
というように区分けした領域(アドレス)をセクションと呼び
これを全てROMにすることは無理なので
C言語の実行される部分(code)->ROM
既知のデータが参照される部分(const) ->ROM
データの内容が変わりうる部分(data)->RAM
というような約束を指定しないとうまく動作しません
C言語の実行される部分(code)->ROM (0x0000~0x3FFF)
既知のデータが参照される部分(const) ->ROM(0x4000~0x7FFF)
データの内容が変わりうる部分(data)->RAM(0xF000~0xF800)
というようなアドレスの割り当てが必要になります
この上さらに外部ROMを増設する場合は
セクション名を xrom2とでもしてセクション属性とアドレス設定してプロジェクトに追加して
外部ROM部分(xrom2)->ROM(0x8000~0x8400)ここにデータを入れておけば
#pragma section で呼び出して使用できるようになります
長文になりましたが(マニュアルにあるので余分なことかもしれませんが)
チョコです。
「2. 6 リンク・ディレクティブ」も参考になるかと思います。
lKUZO様
>>長文になりましたが(マニュアルにあるので余分なことかもしれませんが)
とんでもございません。
わかりやすいご説明、感謝いたします。
基地のデータが参照される部分(const)でフラッシュ領域にアクセスするための
指示を書いて使用する形ということですね?
ユーザーズマニュアルを熟読して実行してみます。
チョコ様
この部分の理解に時間が掛かっています・・・
マニュアルをもっと読み込みます!
masa さん
http://www2u.biglobe.ne.jp/~tequila/electro_850es.html
にもセクション等わかりやすく説明しています。
返事が遅れて申し訳ありません。
拝見いたします。
最初は誰でも、セクション?、#pragma ?なんのこっちゃ!、なんでこんなのあるの面倒くさい、と思いますが使えるようになると「なかなか便利」と如何にもマイコンのプロになったような気がします、頑張ってください。
おかげさまで、該当のデータをフラッシュに格納することができたようです。
(メモリマップを出力し設定したセグメント部分のデータが増えていました)
ただ、容量オーバ的なメッセージは相変わらずでるのですが、これはリンクディレクティブでは解決できないものなのでしょうか。
romp850:CA850 error F8425:rompsec section overflowed highedt address of taget machine.
ヘルプやマニュアルからたどってみたのですが、容量超えています。
Rom化の部分で躓いているような状態です。
程度の情報しかなく、どうすればよいのか途方に暮れています・・・
ErrorでなくWarninngにする方法はあったのですが、デバッグしようとしたところ、マッピングされていないアドレスにアクセスしようとしました。 address:0x100000 E1212288 とでてしまいます。
そもそもが私の思い違いで、もともとこの症状はリンクディレクティブでは解決できないものだったのでしょうか・・・
リンカのマップ情報出力でマップリストを出力させて
エラーになっている箇所「address:0x100000 E1212288」の配置も確認してみてはいかがでしょうか