自作関数のリエントラント性について

RL78/G14(R5F104LLAFB#V0)で、C言語の自作関数を使用しておりますが、この関数をメインルーチンと割り込みルーチンの両方で使用しております。

関数内ではグローバル変数を使用しておらず、リエントラントになっていると考えております。

 

void mmcopy( _UBYTE *d5, _UBYTE *s5, _UWORD n)
{ _UWORD i;
for(i=0;i<n;i++)
*(d5+i) = *(s5+i);
}

 

この関数がメインと割り込みで競合した場合、カウンタiはスタック退避されて戻れると認識しておりますが、E1エミュレータを接続し、連続運転していると

RESF=10hのリセットが発生します。OCDトレースを見るとこの関数で無限ループに陥っているように見えます。

RL78では上記のような関数はリエントラントにはならないのでしょうか?

Parents
  • > この関数がメインと割り込みで競合した場合、

    割り込み処理が正しく実装されてるかも疑われるべきでしょう。
  • fujita nozomuさん

    返信ありがとうございます。
    統合開発環境はCS+V8.02、コンパイラ(CC-RL)はV1.08を使用しております。
    コンパイラオプションは
    ------ ビルド・オプション一覧開始(VCD-30G14, DefaultBuild) ------
    [共通オプションの設定状況]
    iodefine.h : C:\Program Files\Renesas Electronics\CS+\CC\Utilities\IOHeaderGenerator\df2iodef.exe "-df=C:\Program Files\Renesas Electronics\CS+\CC\Device\RL78\Devicefile\DR5F104LL.DVF" -o=C:\Users\user\Documents\VCD-30\20190910A_VCD-30G14\VCD-30G14\iodefine.h -f
    r_main.c r_systeminit.c r_cg_cgc.c N_LIB.C r_cg_cgc_user.c r_cg_port.c r_cg_port_user.c r_cg_serial.c r_cg_serial_user.c r_cg_adc.c r_cg_adc_user.c r_cg_it.c r_cg_it_user.c r_cg_timer.c r_cg_timer_user.c r_cg_wdt.c r_cg_wdt_user.c : C:\Program Files\Renesas Electronics\CS+\CC\CC-RL\V1.08.00\Bin\ccrl.exe r_main.c r_systeminit.c r_cg_cgc.c N_LIB.C r_cg_cgc_user.c r_cg_port.c r_cg_port_user.c r_cg_serial.c r_cg_serial_user.c r_cg_adc.c r_cg_adc_user.c r_cg_it.c r_cg_it_user.c r_cg_timer.c r_cg_timer_user.c r_cg_wdt.c r_cg_wdt_user.c -cpu=S3 -obj_path=DefaultBuild "-dev=C:\Program Files\Renesas Electronics\CS+\CC\Device\RL78\Devicefile\DR5F104LL.DVF" -g -g_line -Onothing -I . -memory_model=medium -refs_without_declaration -pack -volatile -switch=ifelse -c -exec_time=C:\Users\user\AppData\Local\Temp\CSPlusBuildTool_ea78e13467b14c2d895258da58960d06oru2tent.jak -msg_lang=japanese
    cstart.asm stkinit.asm : C:\Program Files\Renesas Electronics\CS+\CC\CC-RL\V1.08.00\Bin\ccrl.exe cstart.asm stkinit.asm -cpu=S3 -obj_path=DefaultBuild "-dev=C:\Program Files\Renesas Electronics\CS+\CC\Device\RL78\Devicefile\DR5F104LL.DVF" -g -c -exec_time=C:\Users\user\AppData\Local\Temp\CSPlusBuildTool_2994b33ca58d418c8e27e914d2fca88agu14jvhc.iw4 -msg_lang=japanese
    DefaultBuild\VCD-30G14.abs ..\ROM\VCD-30G14.mot : C:\Program Files\Renesas Electronics\CS+\CC\CC-RL\V1.08.00\Bin\rlink.exe -subcommand=DefaultBuild\VCD-30G14.clnk
    ------ ビルド・オプション一覧終了(エラー:0個, 警告:0個)(VCD-30G14, DefaultBuild) ------
    ========== 終了しました(成功:1プロジェクト, 失敗:0プロジェクト)(2020年4月1日 13:24:03) ==========


    逆アセンブルリストは

    void mmcopy( _UBYTE *d5, _UBYTE *s5, _UWORD n)

    _mmcopy:
    2008 SUBW SP,#8H
    b802 MOVW [SP+2H],AX
    13 MOVW AX,BC
    b806 MOVW [SP+6H],AX
    15 MOVW AX,DE
    b804 MOVW [SP+4H],AX
    f6 CLRW AX
    for(i=0;i<n;i++)

    b800 MOVW [SP+0H],AX
    ef12 BR $_mmcopy+0x21
    *(d5+i) = *(s5+i);

    a800 MOVW AX,[SP+0H]
    12 MOVW BC,AX
    a802 MOVW AX,[SP+2H]
    03 ADDW AX,BC
    16 MOVW HL,AX
    a806 MOVW AX,[SP+6H]
    03 ADDW AX,BC
    14 MOVW DE,AX
    89 MOV A,[DE]
    9b MOV [HL],A
    a800 MOVW AX,[SP+0H]
    a1 INCW AX
    b800 MOVW [SP+0H],AX
    for(i=0;i<n;i++)

    a804 MOVW AX,[SP+4H]
    12 MOVW BC,AX
    a800 MOVW AX,[SP+0H]
    43 CMPW AX,BC
    dce6 BC $_mmcopy+0xf
    }

    1008 ADDW SP,#8H
    d7 RET

    となります。

    _UBYTEの定義は

    typedef unsigned char _UBYTE;

    です。
  • _UWORDの定義は

    typedef unsigned short _UWORD;

    です。
Reply Children
No Data