11

07

コメント

HEWでRAM上にプログラムを転送して実行する

こんにちは。
ビーコンの菅原です。

ルネサスのHEWで RAM上にプログラムを転送するやりかたについて書きます。


この記事は SHやH8等の旧日立系のマイコンが対象となります。 M16,R8等は違うやり方となります。



その前にRAMの配置について・・


一般的なマイコンでは変数といっても、配置される記憶領域により三種類あります。

未初期化変数(BSSセクション)
RAM領域に配置する。不定値となるが、初期化で0クリアされるものもある。書き換え可能
【例】
short foo;


初期化変数
RAM領域に配置する。初期値がROM領域あり、初期化時にROMから初期値をRAM領域にコピーする。書き換え可能
【例】
short foo = 10;


定数
ROM領域に配置される。書き換え不可能。
【例】
const short foo = 10;

初期化変数というのは SHやH8でHewだと D領域からR領域にコピーするよというとで
リンカオプションとして
-rom=D=R,
をつけます。
これは DというのはRの初期値が入っているところですよ。
というリンカへの指示になります。これはプロジェクト作成時のウィザードで自動的に生成するので意識する必要はありません。

あとは 自動生成したプロジェクトで _INIT();をコールしますが、この中で初期化してくれます。


PCや組み込みでも組み込みLinuxなんかの場合は全部RAM上で実行すれるので初期化変数と定数というのはコンパイル上の制限、たとえばconst修飾子が付いているものに値を代入しようとするとエラーになるとかしますが、見た目は同じになります。(というかROM上では実行しないのでROM上に配置しないということ)



以上を踏まえて・・
プログラムの場合

これは変数ですがプログラムコードについても同じことができます。
RAMで実行したいプログラムがある場合は、当然ブログラム自体はROMに配置されて、実行時にROMにコピーして、普通の関数と同じように呼び出せばよいのです。
変数の場合は統合環境がある程度自動的にセクションを作ってくれたりしましたが、自分で領域の手配をしなくてはなりません。
プログラム中で、FRAMというセクションを作ったとして、これをRAM上に転送する場合
#pragma section FRAM
というように宣言します。

リンカのセクション指定で
PFRAM を ROM領域
RFRAM を RAM領域に配置します。

具体的なリンカオプションとして
-rom=D=R,PFRAM=RFRAM

PFRAMというのはRFRAMの初期値が入っているところですよ。
D=R はウィザードで勝手にできますが、
PFRAM=RFRAM はウィザードではできないので、自分で書かなければなりません。

また HEWだと

L1323 (W) Section attribute mismatch : "RFRAM"

というようなワーニングが出ます。コードなのに変数みたいなことしてまっせという注意なので問題ありません。


別にRAM実行用のプログラムを作っておいて、それをプログラムのデータとして埋め込むという方法もありますが、こちらの方がはるかに簡単だし、元プログラムの変数とかはそのままつかえるのでプログラムも簡単です。

実行前に PFRAMの領域のプログラムをRFRAMに転送するのを忘れないでくださいね。
管理者にだけ表示を許可する

この記事のトラックバックURL

http://kkbecon.blog8.fc2.com/tb.php/4-4f6bb1b7

プロフィール

ビーコン菅原

Author:ビーコン菅原
組み込み始めてそろそろ25年。マイコンとか電子回路が大好きなんですよー

メールフォーム

名前:
メール:
件名:
本文:

Twitter

カウンター(UV)

月別アーカイブ

10  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09  03  02  01  12  11  10  09  07  05  02  12  10  09  08  07  05  04  03  11  09  08  07  06  03  02  01  12  11  10  09  08  07  06  05  04  02  12  11  10  08  02  12 

QRコード

QRコード

Designed by

Ad