こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

HEW統合開発環境のリンカー設定で”BHEAPMEM”という設定の意味は?

今、H8S2368用のHEWで動かしていたサンプルプログラムをもらって、動かそうと思っていたときに、このマイコンには、FlashメモリとSRAMメモリが外部についていたので、どのようにアクセスしているのかなと思い調べていたのですが、

リンカーの設定でこの部分をどうやって使用しているのかというのがわかるということを教えてもらいました。

ちなみにFLASHメモリはサイプレス社の”CY62148EV30LL-45ZSX1TSOPII(32P3Y-H)”

SRAMはSPANSION社製の”S29GL032N(03,04)”というのがつながっていて、


0x200000~0x40000 これがFLAHSHメモリの領域

0x600000~0x800000 これがSRAMメモリの領域となっています。


このリンカーの設定で0x600000のセクションに”BHEAPMEM”という設定をしているのですが、これはどういう意味の設定になるのでしょうか。
この”BHEAPMEM”という設定をすれば、ローカル変数や、グローバル変数や、バリアブルの変数などはFlashメモリ領域ではなく、0x600000のSRAM領域に自動的にコンパイラはデータを置くようになってくれるのでしょうか?

投稿日時 - 2010-02-16 16:25:36

QNo.5681640

すぐに回答ほしいです

質問者が選んだベストアンサー

> として宣言しているという考え方でよいのでしょうか?
概ね間違いないと思います.

質問時の添付画像ではHEWのGUIを用いて,「リンカに与えるセクション定義ファイル」の設定を行う画像です.
ポイントはそれぞれのセクションの開始アドレスは指定してあっても, 終端アドレスは指定していない点です.(指定する必要がない)

リンカは記述順に指定セクションの頭から割付を行っていくので
実装してある2MBのSRAMに十分収まっています.
割り付けられたアドレスはリンカの出力ファイルで確認が可能です.
(拡張子は .lnkだったような・・・手元に環境が無いため失礼)

分かってしまえば難しい話ではなく, ただソースコードでセクションを指定し, リンク時にメモリアドレスへの割付が行われているだけの話です.

ソースコード上ではセクションを指定した以降に変数/定数/関数などなんでも記述が可能ですが, リンカにはそれぞれB***(D***)/C***/P***とした割付の指定を与えてあげなければなりません.

ソースコード上ではベースのセクション名(ex.HEAPMEM)を指定し,
リンカの入力ファイルにはそれぞれプリフィックスのついたセクション割付(ex.BHEAPMEM)を行っています.

投稿日時 - 2010-03-01 01:07:21

ANo.2

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

BHEAPMEM とは意味合いとして"B + HEAPMEM"です.
セクション名の頭には以下の接頭語を付けメモリ空間への割付を行っています.

P : プログラムコード(ROM上に配置)
C : 定数(ROM上に配置)
D : 変数の初期値(ROM上に配置)
R : 初期値付き変数(RAM上に配置)
B : 初期値なし変数(RAM上に配置、概ね値0でスタートアップ時に初期化)
S : スタック(RAM上に配置)

デフォルトのセクションは無名ですので, P/C/D/R/B/Sと名づけられた各Sectionが存在します。
BHEAPMEMと名づけられたエリアは,
#pragma section HEAPMEM
とディレクティブにてセクション指定した以降に記述される"初期値の無い変数"が自動的に配置されます.

> ローカル変数や、グローバル変数や・・・
ソースコード上でのスコープの問題なのでメモリ空間上の割付には関係がありません.

BHEAPMEMはライブラリか, もしくはそのプロジェクトでスクラッチで用意した
ヒープ管理のコードによって割り付け済みである「貸し出し用のメモリ領域」を示すものでしょう.

投稿日時 - 2010-02-16 23:28:20

お礼

詳細な回答頂きありがとうございます。返事遅れまして大変もしわけありません。

現在使用しているプログラムの複数のソースファイルで”HEAPMEM”という文字で検索をかけてみたところ、下のような記述がありました。


#pragma section HEAPMEM
INT8U memBuf[MEM_BLOCK_NUM][MEM_BLOCK_SIZE];
u32 memTbl[MEM_BLOCK_NUM];
#pragma section

typedef unsigned char INT8U;
typedef u32 u_long;
#define MEM_BLOCK_NUM 4816
#define MEM_BLOCK_SIZE 64


このような記述があるので、
この0x600000~0x800000のSRAM領域には、

INT8U memBuf[MEM_BLOCK_NUM][MEM_BLOCK_SIZE];
u32 memTbl[MEM_BLOCK_NUM];

この2つの宣言の配列変数を

”B : 初期値なし変数(RAM上に配置、概ね値0でスタートアップ時に初期化)”

として宣言しているという考え方でよいのでしょうか?

投稿日時 - 2010-02-26 13:50:23

あなたにオススメの質問