MCU

JumpTableを作って使う


RAMの小さなMCUなどのデバッグは、モジュール単位でデバッグして、固まったものをROMへ書き込んで…

で、そのアドレスをMAPで調べて、以下の様にして呼んでみたりする。

#define  func  ((int (*)(int, int))0x00001234)


が、アドレスが移動したり、いちいち調べて書き直しとかは、メンドウであり非効率的です*1

で、いわゆる割り込みなどで使われているVectorテーブルを作ってしまい、それを参照して処理を行うようにすると良い。

extern int  a(int, long);
extern void b(short, short, long);
extern long c(char *, const char *, ...);
extern void d(char);
extern void e(void);

/* 登録する関数のプロトタイプを含む領域を宣言 */
struct bios_jump_table {
    int  ((*a)(int, long));
    void ((*b)(short, short, long));
    long ((*c)(char *, const char *, ...));
    void ((*d)(char));
    void ((*e)(void));
};

/* 実際のアドレスでテーブルを作成する */
const struct bios_jump_table bios_vector = {
    a,
    b,
    c,
    d,
    e
};

void main(void)
{
extern char *buf;

    /* 登録されている関数を使ってみる */
    bios_vector.c(buf, "Hello world %d\n", 245);
}


C++なんぞは、意識する/しないによらず、こんな処理のかたまりだろう…

*1 MAPから必要な関数のアドレスだけを抜き出すフィルタソフトを作ると良い?
最終更新のRSS
Last-modified: 2010-03-26 (金) 14:35:48 3012日前
HTML convert time: 0.010 sec.