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

 

Parents
  • NoMaYさん

    こんにちは、シェルティです。

    ご連絡ありがとうございます。本件対処方法考えたいと思います。

    RL78の活動でもAWSと話をしておりまして、FreeRTOS Kernelのportを2021年度は整備していく計画を考えています。

    IAR版も整備します。AWS本家のGitHubのリポジトリにも反映していく予定です。

    引き続きいろいろと情報交換させてください。

    以上です

Reply
  • NoMaYさん

    こんにちは、シェルティです。

    ご連絡ありがとうございます。本件対処方法考えたいと思います。

    RL78の活動でもAWSと話をしておりまして、FreeRTOS Kernelのportを2021年度は整備していく計画を考えています。

    IAR版も整備します。AWS本家のGitHubのリポジトリにも反映していく予定です。

    引き続きいろいろと情報交換させてください。

    以上です

Children