ブログ - ROM API

ROM API

カテゴリ : 
雑記
2014-12-26 18:00
NXPのMCUにはROM APIなる機能が備わっている物がある。内蔵ROM上にいろいろなルーチンが予め書き込まれているので、そのルーチンを使えばFLASHメモリ上にそれらの機能を別途作り込む必要が無いという事の様だ。

トラ技の付録だったLPC810の様に、FLASHの容量が少ないデバイスではこのROM APIの恩恵に与る事も多いはず。UART・I2C・SPI・ADCといったペリフェラルは、ROMに用意されたルーチンに任せる事でFLASHの容量を消費せずに利用できるという物。

特にROM APIの中でありがたいのが割り算で、ソースに「/」や「%」を使ったとたんに数キロバイトしかないFLASHの大半をライブラリが占めてしまうのを解消してくれる。
使い方はマニュアルに書いてあるが、何やら特定の環境を前提としている様でよく分からないので、今回はたぶん公知の情報でしょうがLPC82xを前提としてちょっとだけ簡単に使える方法を備忘録として書いておく。
概ねAPIの名称はマニュアルの記述を踏襲しつつ、まずはAPIへの入り口を作る。APIの呼び出しにいちいち変数なんぞ作って初期化して使うのは野暮ったいので直接アドレッシングで。
typedef struct { int quot; int rem; } idiv_return;
typedef struct { unsigned quot; unsigned rem; } uidiv_return;

typedef struct {
  int (*sidiv) (int numerator, int denominator);
  unsigned (*uidiv) (unsigned numerator, unsigned denominator);
  idiv_return (*sidivmod) (int numerator, int denominator);
  uidiv_return (*uidivmod) (unsigned numerator, unsigned denominator);
} TLPC_ROM_DIV_STRUCT;

typedef TLPC_ROM_DIV_STRUCT *pTLPC_ROM_DIV_STRUCT;

typedef struct {
  const uint32_t p_dev1;
  const uint32_t p_dev2;
  const uint32_t p_dev3;
  const uint32_t p_dev4;
  pTLPC_ROM_DIV_STRUCT pROMDiv;
  const uint32_t p_dev6;
  const uint32_t p_dev7;
  const uint32_t p_dev8;
} TROMAPIs;

#define LPCAPI (*(TROMAPIs **)(0x1FFF1FF8UL))
#define LPC_DIV_API ((LPCAPI)->pROMDiv)
これらの宣言をしておけば後は使うだけ。
割り算をしたければ、
int ans, numerator, denominator;
ans = LPC_DIV_API->sidiv (numerator, denominator);
// ans = numerator / denominator;
余りが欲しければ、
int ans, numerator, denominator;
ans = LPC_DIV_API->sidivmod (numerator, denominator).rem;
// ans = numerator % denominator;
それすらも野暮ったかったら、gccであれば
int __aeabi_idiv (int numerator, int denominator) {
return LPC_DIV_API->sidiv (numerator, denominator);
}

unsigned __aeabi_uidiv (unsigned numerator, unsigned denominator) {
return LPC_DIV_API->uidiv (numerator, denominator);
}

idiv_return __aeabi_idivmod (int numerator, int denominator) {
return LPC_DIV_API->sidivmod (numerator, denominator);
}

uidiv_return __aeabi_uidivmod (unsigned numerator, unsigned denominator) {
return LPC_DIV_API->uidivmod (numerator, denominator);
}
としておけば、「/」やら「%」を使用するとリンクされる除算のライブラリ自体を置き換える素地となる。

割り算に限らずペリフェラルを扱うAPIもこの様なマクロを介して呼び出せるので、お気楽感が増すでしょう。

トラックバック

トラックバックpingアドレス http://www.besttechnology.co.jp/modules/d3blog/tb.php/169