IAR RL78 C/C++ Compilerのinterrupt関数生成コードがおかしな気がします(BUGがあると思います)

こんにちは。NoMaYです。

最近、RL78のFreeRTOSの作業を再開したのですが、IAR RL78 C/C++コンパイラの割り込み関数生成コードがおかしな気がするのです。RL78/G14、CODE=FAR、DATA=FAR、最適化=無、で以下のソースをコンパイルすると以下のコードが生成されました。リストファイル上の赤文字の箇所は、CSとESの退避や復帰の部分だと思われるのですが、CSとESの2つ並んだ8ビットレジスタをMOVWで16ビットでリードやライトをしています。初めて見た時は、おお、賢い、と思ったのですが、デバッガでGo/Breakさせてみると、期待した動作になっていません。CSとESは、8ビットレジスタとしてアクセスしないといけないレジスタなのだと再確認出来ましたが、逆に言うと、この生成コードは間違っている、ということです。今回、EWRL78 V4.20.1の16Kバイトサイズ制限無償評価版をe2 studio上で使ったのですが、無償評価版なのでユーザーサポート対象外で、IAR社に問い合わせるのもどうかと思いましたので、かふぇルネに投稿しました。EWRL78のユーザーさんは留意した方が良さそうです。

ソース

extern void foo(void);

#pragma vector = INTP0_vect
__interrupt static void r_intc0_interrupt(void)
{
    /* Start user code. Do not edit comment generated here */

    foo();

    /* End user code. Do not edit comment generated here */
}

リスト

     56          #pragma vector = INTP0_vect
   \                                 In section .text, align 1, keep-with-next
     57          __interrupt static void r_intc0_interrupt(void)
     58          {
   \                     ___interrupt_0x08:
   \   000000              ; * Stack frame (at entry) *
   \   000000              ; Param size: 0
   \   000000 C1           PUSH      AX                 ;; 1 cycle
   \   000001 C3           PUSH      BC                 ;; 1 cycle
   \   000002 C5           PUSH      DE                 ;; 1 cycle
   \   000003 C7           PUSH      HL                 ;; 1 cycle
   \   000004 AE FC        MOVW      AX, 0xFFFFC        ;; 1 cycle
   \   000006 C1           PUSH      AX                 ;; 1 cycle
   \   000007              ; Auto size: 0
     59              /* Start user code. Do not edit comment generated here */
     60          
     61              foo();
   \   000007 FC ..'....   CALL      F:_foo             ;; 3 cycles
     62          
     63              /* End user code. Do not edit comment generated here */
     64          }
   \   00000B C0           POP       AX                 ;; 1 cycle
   \   00000C BE FC        MOVW      0xFFFFC, AX        ;; 1 cycle
   \   00000E C6           POP       HL                 ;; 1 cycle
   \   00000F C4           POP       DE                 ;; 1 cycle
   \   000010 C2           POP       BC                 ;; 1 cycle
   \   000011 C0           POP       AX                 ;; 1 cycle
   \   000012 FC61         RETI                         ;; 6 cycles
   \   000014              ; ------------------------------------- Block: 21 cycles
   \   000014              ; ------------------------------------- Total: 21 cycles
   \   000014              REQUIRE ___interrupt_tab_0x08

 

  • ほや です。こんにちは。

    ES/CSレジスタが見えない件、
    ”Debugger Console” のタブにGDBコマンドを打ってみるとGDB的にどう認識されているかが分かるので、
    画面表示の問題なのか、MCUの動作やGDB(画面側)とGDBサーバ(MCU側)とのやり取りで起きている問題なのかの
    大まかな切り分けができます。

    例えば
    info reg
    (または info reg レジスタ名)
    でレジスタ値が見えているのに画面に表示されないなら、表示だけの問題だろうと推測できます。

    その先はデバッガの内部仕様の世界なので、この場ではなくRenesasの技術サポート窓口に聞いた方が良いと思います。

    ちなみにnon-stop モードかは
    show non-stop
    で表示されます。

  • こんにちは。NoMaYです。

    ほやさん、情報ありがとうございます。

  • こんにちは。NoMaYです。

    このnon-stop modeというのはマルチスレッドプログラミングに関するものなのですね。実は今まで、e2 studioでデバッガを起動しようとした際、たびたび、"Error: Target not in non-stop mode."のようなエラーメッセージボックスが表示されて(注:Reistersウィンドウとは全く無関係にメッセージボックスとして表示されていました)、うっとうしく感じていたのですが、ひょっとして、FreeRTOSを使っているせいで、e2 studio or e2 gdbserverの作りかけの(?)/事前の仕込みの(?)のRTOSサポート処理が動作してしまって、あっちこっち誤動作してしまっているとか?、、、

    GDB All-Stop and Non-Stop Mode with LinkServer
    mcuoneclipse.com/2019/01/13/gdb-all-stop-and-non-stop-mode-with-linkserver/
     

  • こんにちは。NoMaYです。

    これまでのことは32bit版のことですが、64bit版をインストールしようとして再認識したのですが、IAR Plugin Managerは強制インストールされるので使っても構わないものなのですよねぇ、と、、、

    e2 studio v202101インストール時の画面コピー

     
    [追記]

    私はEZエミュレータを持っていませんのでUSBドライバのインストールをスキップしようとしたら、e2 studio自体のインストールを強制的に打ち切られてしまいました、、、トホホ、、、

    e2 studio v202101インストール時の強制打ち切り時の画面コピー


     

  • 後からプラグイン単位でアンインストールする方が確実です。
    もしくは、素のeclipseにe² studioのプラグインを被せるか、どちらかでしょう。

  • こんにちは。NoMaYです。

    すみません。見落としていました。ほやさん、リプライありがとうございます。