sizeof()で関数サイズを取得したい

sizeofに関数ポインタを渡すとコンパイルエラーとなってしまします。
これができるとRAM実行がC言語で簡単に書けて嬉しいです♡

sizeof(ramexec)と書いてもsizeof(&ramexec)と書いてもエラーになってしまうんでよすね。
ANSI C的には問題ない記述な気もしますけど。

> ram.c(10) : CC78K0R error E0530: Illegal sizeof operand

C言語でフラッシュセルフの FSL_ChangeInterruptTable()関数に対応したいなーと思っていますけど
つれないですねー、CC-78K0Rは。


-------------------------------------------------------
//RAMに関数をコピーして実行するサンプル
//mallocを使うのでcstart.asmの”_@MEMTOP”を”1024”にする
//コードをリロケータブルにするためメモリモデルはラージ・モデル
#pragma sfr
#pragma ei
#include <string.h> //memcpy用
#include <stdlib.h> //malloc用
__interrupt void ramexec(); //割り込みでRAM実行したい関数
void main(void){
    memcpy(malloc(sizeof(ramexec)),ramexec,sizeof(ramexec));    //関数ramexecをRAMにコピー
    //このあたりでフラッシュ・セルフ・プログラミング・ライブラリの設定を行う(割り込み発生時の飛び先をRAMEXECADRに設定)
    EI();
    ADMK=0;
    //フラッシュの消去、書き込み等の処理開始
    while(1);
}
__interrupt void ramexec() {
    do { //セルフ書き込み中に発生した。割り込みフラグを確認する。
        if(1==ADIF){
            ADIF=0;
            //ここに処理を書く ※間違ってもROMに配置された割り込み関数を呼んではいけない。
            break;
        }
        if(1==TMIF00){
            TMIF00=0;
            //ここに処理を書く
            break;
        }
        while(1);/*ここに来てはいけない。必ず割り込み発生元を特定して処理すること。もしくは不要な割り込みはマスクすること。*/
    } while(0);
}

  • スタッフのチョコです。

    Kirin様のスレッドにコメントさせていただきます。

    ツール担当部門に確認しましたが,sizeof関数で関数のサイズを得ることはできないとのことでした。

    スレッドの内容を拝見しますと,RAM上でプログラムを動作させるのが本来の目的のようです。
    このような場合には,CubeSuite+の「ROM化」を検討されることをお勧めいたします。
    ROM化については,「RL78\,78K0Rコーディング編」マニュアルの「付録A ROM 化プロセッサ」をご覧ください。

    http://documentation.renesas.com/doc/products/tool/doc/r20ut2140jj0100_qscd78.pdf

    また,過去のスレッドに「RAMにCodeを入れる方法」がございますので,これも参考になるのではないでしょうか。以下のURLを参照ください。

    http://bbs.ednjapan.com/renesas/index.php?bid=6&u=on&v=1363092825JUgaXc
  • チョコさん調べていただいてありがとうごさいます。
    ROM化なんて便利な機能があったんですね。

    他にも、マイコンのプログラムでは初期値付きのスタティック変数は使っちゃダメだと思っていたんですけど、ROM化で一気に解決でした。

    さらに、ROM化すると常時RAMを占有してしまうのかと思いきや
    ちゃんと_rcopy(n)でRAMに展開したいセグメント番号nを選択できるんですね。素晴らしいです!

    ROM化の設定方法をよーく見ながら勉強したいと思います。(今まで難しそうなので、視界の中に入ってこなかったのかもしれません/汗)