static 変数のメモリ割当について

static変数を使用する場合に,実行時にソースコードで記載したstatic変数の内容と実行時のstatic変数の値が異なります.
例えば,A.cのソースコード内に
static unsigned char scif_baud[] = {233};
と書いてあります.
実行時にscif_baudのアドレスに書き込まれている
アドレス(0x1c036724)の値は126となります.

対応方法をご存知の方がいらっしゃいましたら
ご教示お願い致します.

開発環境は
SH7269評価ボード,
μITRONOS:HI7000\,HEW(Version 4.09.01.007)です.

セクションは以下のように設定しています.
[Hew Section Information]
Version=1.0
Entry=3
Group1=C_hivct\,C_hibase\,P_hireset\,P_hiknl\,C_hidef\,
C_hisysmt\,C_hicfg\,P_hisysdwn\,P_hiexpent\,P_hiintdwn\,
P_hicpuasm\,P_hicpuini\,P_hitmrdrv\,C_hitmrdrv\,
P\,C\,D(18040000)
Group2=B_hiwrk\,B_himpl\,B_hidystk\,B_hiirqstk\,
B\,R(1C000000)
Group3=B_hivct(FFF80000)

  • f_hashiさん

    1回目の実行時からscif_baudの値は変ですか?
    もし、そうだとすると、
    ROMに格納してある変数の初期値をRAMにあるstatic変数にコピーしないといけないんですげとも、スタートアップルーチンで、scif_baudの初期値コピーは行ってます?

    初期値付き変数が1個か2個なら、宣言と同時の代入するのをやめて、main()の先頭で初期値を代入するのが簡単かもしれません。
  • f_hashiさん

    7269でプロジェクトを作って試してみました。
    main.cに

    static unsigned char scif_baud[] = {233};

    と書き、ビルドしました。セクションは標準のままなのでDセクションに配置されます。
    ビルド結果のmain.mapを見ると

      START   END   SIZE ALIGN
    D 00001108 00001108 1   4

    となり、1バイト確保されていることが分かります。

    更に、main.motを見ると1108Hには(便宜上、空白でセパレートしています)

    S1 04 1108 E9 F9

    と0E9H(233)があることが分かります。


    実環境上で意図するデータが入っていない場合、_INITSCT()によって初期化されていない可能性もあります。dbsct.cに初期化するセクションが記載されていますが、scif_baud[]が属するセクションはDTBL[]に登録されていますでしょうか?

    ご確認ください。


    すと@embedded property
  • Kirinさん
    すとさん

    ご教示頂きありがとうございます.

    >1回目の実行時からscif_baudの値は変ですか?
    はい.

    >スタートアップルーチンで、scif_baudの初期値コピーは行ってます?
    >実環境上で意図するデータが入っていない場合、_INITSCT()によって初期化されていない可能性もあります。dbsct.cに初期化するセクションが記載されていますが、scif_baud[]が属するセクションはDTBL[]に登録されていますでしょうか?

    マニュアル(rjj10b0063_hi7000.pdf P.344)にはROM化支援機能を用いて行うことができるという記載がありましたので,添付ファイル(setting.png)の設定を行いました.
    この設定とは別にスタートアップルーチンに追加するする必要があるのでしょうか?

    Ke3NQnp1UYw2E3zv-0_A0428.jpg

  • f_hashiさん、エビスクラウンです。

     作成中のシステムはHI7000/4のμITRON仕様OSを使ったものですよね! HI7000/4の場合、デフォルトでは静的変数の初期化を行う_INITSCTライブラリ関数は呼び出されません。
     サンプルソースの中にxxx_cpuinit.cがあると思います。それがOSを利用した際のスタートアップルーチン(CPU初期化ルーチン)です。初期状態は_INITSCT関数の呼び出しがコメントアウトになっていると思いますのでコメントを解除してください。

     次に_INITSCTライブラリ関数の本体ですが、2つの選択肢があります。1つはHI7000/4のサンプルに付属されているxxx_initsct.cとxxx_sct.srcを使う方法です。その場合は両ファイルをプロジェクトに追加してください。
     もう1つはコンパイラのライブラリ関数を使う方法です。その場合はオプションでライブラリの生成を依頼し、HEWのプロジェクトジェネレータで生成できるdbsct.cをプロジェクトに追加してください。
     こららの操作により、静的変数の初期化が実施されるはずです。

     なお、SH7269だとFPU機能もあり、FPUを正しくシステムで利用する際の設定がかなり複雑です。宜しければ、ルネサス半導体トレーニングセンターのWebサイトからダウンロード可能な
     ・コントローラ系SuperHコンパイラコース
     ・SuperHリアルタイムOSコース
    の両テキストを参照されることをお奨めします。オプションの設定次第では簡単に性能が劣化したり、動作不良となりますのでご注意ください。
  • エビスクラウンさん,f_hashiです.

    セミナーの情報も併せてご教示いただき有り難うございました.
    教えて頂いた方法により,問題が解決しました.

    教えて頂いた「xxx_initsct.cとxxx_sct.srcを使う方法」と「コンパイラのライブラリ関数を使う方法」ですが,どちらか片方で設定したところ,xxx_initsct.c内のB_BGN\,B_ENDが0xffffffffとなり,結局のところ,2つの方法どちらも行った結果,問題が解決しました.





  • f_hashiさん、エビスクラウンです。

     それはちょっと不思議ですが、取り合えず良しとしますか?
    正確な原因を追究するには色々な情報が必要になりますからね!

     なお、SH2A-FPUのHI7000/4は、一番難しいです。正確に内容を理解していれば、間違えなく高機能なシステムが開発可能ですが、使い方を誤ると必要以上にスタックが必要となったり、簡単に効率低下を招いてしまいます。是非、セミナーテキストの内容をご理解ください。

     もっとも、このかふぇルネがありますから、不明点はいつでもお尋ねくだされば、可能な限りレスポンスをかえさせていただきます。これからもお気軽にどうぞ!
  • エビスクラウンさん,f_hashiです.

    確かにどちらの方法も行っているのが同じですが,現状,問題が起きていないので,この問題に対しては解決ということで.

    ありがとうございました.

    質問に対して皆様から早い回答を頂いて大変助かります.今後ともよろしくお願いします.