Renesas Community
Search Community
User
Join or sign in
Site
Search Community
User
Renesas Engineering Community
FAQ
HELP
More
Cancel
Forums & Groups
English Community
中文社区(Chinese Community)
More
Cancel
かふぇルネ
forums-groups
Microcontrollers and Microprocessors
Other MCU/MPU Products
SH Family
More
Cancel
SH Family
SH Family Forum
static 変数のメモリ割当について
Home
Forum
Tags
More
Cancel
New
Replies
7 replies
Subscribers
447 subscribers
Views
6449 views
Users
0 members are here
hew
static
char
static変数
unsigned
scif_baud
information
4.09.01.007
Version
section
実行時
beginner
Options
Share
More
Cancel
Related
static 変数のメモリ割当について
f_hashi
over 10 years ago
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)
Kirin
over 10 years ago
f_hashiさん
1回目の実行時からscif_baudの値は変ですか?
もし、そうだとすると、
ROMに格納してある変数の初期値をRAMにあるstatic変数にコピーしないといけないんですげとも、スタートアップルーチンで、scif_baudの初期値コピーは行ってます?
初期値付き変数が1個か2個なら、宣言と同時の代入するのをやめて、main()の先頭で初期値を代入するのが簡単かもしれません。
Cancel
Up
0
Down
Reply
Cancel
Kon Nozomu(すと)
over 10 years ago
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
Cancel
Up
0
Down
Reply
Cancel
f_hashi
over 10 years ago
Kirinさん
すとさん
ご教示頂きありがとうございます.
>1回目の実行時からscif_baudの値は変ですか?
はい.
>スタートアップルーチンで、scif_baudの初期値コピーは行ってます?
>実環境上で意図するデータが入っていない場合、_INITSCT()によって初期化されていない可能性もあります。dbsct.cに初期化するセクションが記載されていますが、scif_baud[]が属するセクションはDTBL[]に登録されていますでしょうか?
マニュアル(rjj10b0063_hi7000.pdf P.344)にはROM化支援機能を用いて行うことができるという記載がありましたので,添付ファイル(setting.png)の設定を行いました.
この設定とは別にスタートアップルーチンに追加するする必要があるのでしょうか?
Ke3NQnp1UYw2E3zv-0_A0428.jpg
Cancel
Up
0
Down
Reply
Cancel
エビスクラウン
over 10 years ago
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コース
の両テキストを参照されることをお奨めします。オプションの設定次第では簡単に性能が劣化したり、動作不良となりますのでご注意ください。
Cancel
Up
0
Down
Reply
Cancel
f_hashi
over 10 years ago
エビスクラウンさん,f_hashiです.
セミナーの情報も併せてご教示いただき有り難うございました.
教えて頂いた方法により,問題が解決しました.
教えて頂いた「xxx_initsct.cとxxx_sct.srcを使う方法」と「コンパイラのライブラリ関数を使う方法」ですが,どちらか片方で設定したところ,xxx_initsct.c内のB_BGN\,B_ENDが0xffffffffとなり,結局のところ,2つの方法どちらも行った結果,問題が解決しました.
Cancel
Up
0
Down
Reply
Cancel
エビスクラウン
over 10 years ago
f_hashiさん、エビスクラウンです。
それはちょっと不思議ですが、取り合えず良しとしますか?
正確な原因を追究するには色々な情報が必要になりますからね!
なお、SH2A-FPUのHI7000/4は、一番難しいです。正確に内容を理解していれば、間違えなく高機能なシステムが開発可能ですが、使い方を誤ると必要以上にスタックが必要となったり、簡単に効率低下を招いてしまいます。是非、セミナーテキストの内容をご理解ください。
もっとも、このかふぇルネがありますから、不明点はいつでもお尋ねくだされば、可能な限りレスポンスをかえさせていただきます。これからもお気軽にどうぞ!
Cancel
Up
0
Down
Reply
Cancel
f_hashi
over 10 years ago
エビスクラウンさん,f_hashiです.
確かにどちらの方法も行っているのが同じですが,現状,問題が起きていないので,この問題に対しては解決ということで.
ありがとうございました.
質問に対して皆様から早い回答を頂いて大変助かります.今後ともよろしくお願いします.
Cancel
Up
0
Down
Reply
Cancel