- ベストアンサー
HEWリンカー設定でのBHEAPMEMの意味とは?
- HEW統合開発環境のリンカー設定で使用される”BHEAPMEM”とは、マイコンのメモリアクセスに関する設定である。
- 具体的には、リンカーの設定で0x600000のセクションに”BHEAPMEM”という設定をすることで、ローカル変数やグローバル変数、バリアブルの変数がFlashメモリ領域ではなく、0x600000のSRAM領域に置かれるようになる。
- これにより、マイコンに外部のFlashメモリとSRAMメモリが付いている場合でも、リンカーの設定を適切に行うことで、メモリ領域の使い分けが可能となり、効率的なメモリの利用が実現できる。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> として宣言しているという考え方でよいのでしょうか? 概ね間違いないと思います. 質問時の添付画像ではHEWのGUIを用いて,「リンカに与えるセクション定義ファイル」の設定を行う画像です. ポイントはそれぞれのセクションの開始アドレスは指定してあっても, 終端アドレスは指定していない点です.(指定する必要がない) リンカは記述順に指定セクションの頭から割付を行っていくので 実装してある2MBのSRAMに十分収まっています. 割り付けられたアドレスはリンカの出力ファイルで確認が可能です. (拡張子は .lnkだったような・・・手元に環境が無いため失礼) 分かってしまえば難しい話ではなく, ただソースコードでセクションを指定し, リンク時にメモリアドレスへの割付が行われているだけの話です. ソースコード上ではセクションを指定した以降に変数/定数/関数などなんでも記述が可能ですが, リンカにはそれぞれB***(D***)/C***/P***とした割付の指定を与えてあげなければなりません. ソースコード上ではベースのセクション名(ex.HEAPMEM)を指定し, リンカの入力ファイルにはそれぞれプリフィックスのついたセクション割付(ex.BHEAPMEM)を行っています.
その他の回答 (1)
- bug_bug
- ベストアンサー率78% (36/46)
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はライブラリか, もしくはそのプロジェクトでスクラッチで用意した ヒープ管理のコードによって割り付け済みである「貸し出し用のメモリ領域」を示すものでしょう.
お礼
詳細な回答頂きありがとうございます。返事遅れまして大変もしわけありません。 現在使用しているプログラムの複数のソースファイルで”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でスタートアップ時に初期化)” として宣言しているという考え方でよいのでしょうか?