今年の初めから、大幅に遅延していたプロジェクトに係りきりになり、凄く忙しく、
立川から、兵庫の三田(さんだ)に毎週のように通い、最近ようやく、見通しがつき、
他の作業もようやく進みだした。
その中で、RL78を使った機器のプログラムを実装していたのだけど、その過程で
リンカースクリプトを改造していたので、覚書程度に紹介しておく。
RL78は、非常に沢山の種類があるのだけど、1つのグループでも、リソースが異
なるデバイスが沢山ある。
プログラム・フラッシュ・メモリーの容量が、異なるのは良くあるのだが、データ・
フラッシュの容量も色々ある。
以前は、Makefile から、容量を与えていたが、デバイス固有のリンカースクリプトに
記述した方がシンプルでスッキリするなぁーと思っていた。
ただ、リンカースクリプトは、イマイチ、記述方法が判らない部分もあり、敬遠してい
たのだが、色々実験して、ようやく方法を理解した。
多分、他に、より良い方法があるのかもしれないが、とりあえず、以下の方法で解決し
た。
まず、「メモリー」で、データフラッシュの領域を記述する。
MEMORY { VEC (r) : ORIGIN = 0x00000, LENGTH = 0x00002 IVEC (r) : ORIGIN = 0x00004, LENGTH = 0x0007C OPT (r) : ORIGIN = 0x000C0, LENGTH = 0x00004 SEC_ID (r): ORIGIN = 0x000C4, LENGTH = 0x0000A ROM (r) : ORIGIN = 0x000D8, LENGTH = 0x0FF28 RAM (w) : ORIGIN = 0xFDF00, LENGTH = 0x01F20 DATAF (W) : ORIGIN = 0xF1000, LENGTH = 0x02000 STACK (w) : ORIGIN = 0xFFE20, LENGTH = 0x00002 }
※「DATAF」が、データフラッシュの、アドレスと領域の設定。
続いて、rdata セクション内に、データフラッシュのサイズを置いて、アクセスできるよ
うに、シンボルを宣言しておく。
PROVIDE (__dataflashsize = .); SHORT(LENGTH(DATAF));
これだけだ・・
新しいのは、「LENGTH()」で、「DATAF」の「LENGTH」を参照している。
領域は、「uint16_t」サイズで置いてある。
※「uint32_t」サイズで欲しい場合は、「LONG()」を使う。
「C、C++」からは、
extern const uint16_t _dataflashsize;
で参照できる。
ただ、リンクしないと参照出来ないので、コンパイル時には参照はできない変数となって
いるので、プログラム起動後に参照するような構成にしなければならない。