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

 

  • NoMaYさん

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

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

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

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

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

    以上です

  • NoMaYさん

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

    すみませんportではなくてコンパイラ生成コードの話ですね。

    ルネサスのツールの人経由でIARの人とも相談できないか考えてみます。

    以上です

  • こんにちは。NoMaYです。

    あれっ、今デバッグしていたら、このコードでも動きますね。何か狐につままれた気分です、、、

  • こんにちは。NoMaYです。

    e2 studioのRegistersウィンドウのUpdate動作がおかしいのかな?Updateされたりされなかったり?

  • NoMaYさん、こんにちは。Dartsmanと申します。

    デバッグにエミュレータを使用されていますかね?

    E1/E20/E2エミュレータ, E2エミュレータLite ユーザーズマニュアル別冊 (RL78接続時の注意事項) (renesas.com)

    こちらのドキュメントのP45にあるステップ実行の注意事項(1)に該当すると、ご指摘のような現象に見えるのかなとも思いました。

    的外れなコメントになってしまっていたら申し訳ありませんが、ご参考まで。

  • dartsmanさん、こんにちは。NoMaYです。

    リプライありがとうございます。今回、RL78/G14 Fast Prototyping Boardを使用していますので、エミュレータはオンボードE2 Liteエミュレータということになります。それで、IAR RL78 C/C++ Compilerのこのコードは、デバイス動作のグレーゾーン仕様を利用しているものだと認識しましたので、大事をとってステップ実行では無くてGo/Breakで確認していたので、教えて頂いたステップ実行の注意事項には該当していないですね。

    昨夜のことを思い起こすと、私の手元のe2 studioのRegistersウィンドウのUpdate動作は、やはり、動作が不安定である(Updateされたりされなかったり)ということです。実は、既にe2 studioを一度再インストールしているのですが、来月には、e2 studio バージョン 2021-01 が出ると思うので、それまで気をつけながら使うつもりです。(もっとも、バージョンアップ(目的は再インストール)で状況が変わるかどうかは分からないですけれども。)

  • NoMaYさん、こんにちは。dartsmanです。

    回答遅くなり申し訳ありません。

    お問い合わせの件、ルネサスのデバッガ担当者と相談しました。

    まずはルネサス内でもデバッグ時の動作を確認したいということでしたので、

    以下の情報をこちらのページから「新規お問い合わせ」としてご登録をお願いできないでしょうか?

    [お問い合わせの登録ページ]

    Dashboard | Renesas Customer Hub

    ※ページ上側の「新規お問い合わせ」をクリックしてご登録をお願いします。

    [ご共有いただきたい情報]

    ・NoMaYさんが動作確認されたe2 studioのプロジェクト

    ・現在お使いのe2 studioのバージョン

    ・動作確認された際の手順

     ※動作するケースと動作しないケースで何か手順が異なるなど情報あればで結構です。

    以上、よろしくお願いいたします。

  • dartsmanさん、こんにちは。NoMaYです。

    ソースはGitHubで公開しているソース(FreeRTOS, FreeRTOS-KernelのFork)ですので、このまま、このスレッドに貼り付けようかと思います。ただ、Forkそのものですと、他社のCPUコアのものも大量に含まれていて馴染みのない人には取り扱い難いと思いますので、不要なものを取り除いたものを作成して貼り付けようかと思います。(ビルド済みロードモジュールも含めようと思っています。)

    環境は以下の通りです。

    e2 studio: v7.8.0 (私はRL78では過去の.cprojectとの比較をしたく32bit版を使い続けてます(過去の投稿では勘違いしてました))
    IARコンパイラ: EWRL78 V4.20.1に含まれているもの
    e2 studio上でIARコンパイラを使えるようにするプラグイン: e2 studioのHelp→IAR Embedded Workbench plugin manager...で1~2ヶ月程前にインストールしたもの(1.1.0.201906261345)
    Windows10: 昨日か一昨日にWindows Updateが自動的に行われていました(バージョン20H2は未インストールです)
    評価ボード: RL78/G14 Fast Prototyping Board

    再現手順は以下の通りです。

    (0) zipファイルを解凍してFreeRTOS/Demo/RL78_RL78G14_FPB_IAR_e2studio_EWRL78のプロジェクトをインポートする
    (1) 逆アセンブルウィンドウでソフトウェアブレークポイントを2つ設定する(アドレスは0x3250と0x3256です)
    (2) Go
    (3) RL78/G14 Fast Prototyping BoardでSW_USRプッシュボタンを押す
    (4) ブレークする
    (5) RegistersウィンドウでESとCSの値を書き換える(デバッガで確認し易くするため)
    (なお、今日は(思い返せば先日もそんなことがあったようななかったような)、この時点で、書いた値が表示されない(リフレッシュボタンを押さないと表示が更新されない)現象あり
    (6) Go
    (7) ブレークする
    (8) RegistersウィンドウでAとXの値を確認する(期待値はA=ES,X=CSだがそうなっていない(というより表示が更新されていない)ことがある)

    ただ、今日やってみたところ、すぐに(7)の現象が出る訳ではなく、暫く繰り返しているうちに出るようになったり(出ても先日とは挙動がちょっと違うかもという気もします)、一旦出るようになったとしても、また暫くすると出なくなったり、という状況でした。

    それで、今日やっていたら、以下の画面コピーのような症状が出ました。何かRegistersウィンドウに数値以外の文字列が表示されていました。

    RegistersウィンドウでCSレジスタのValueの表示が"Error: Target not in non-stop mode."になっています


    CSレジスタの次のレジスタや他のレジスタの表示は以下の通りでした(なお、bank0_r1レジスタをBinary表示にした記憶は無いです、、、)



    リスタートボタンを押してmain()相当の関数の先頭に設定したブレークポイントでブレークするもESやCSの表示がおかしい
    (きっと他のものも?) 期待値はES=0x0,CS=0x0です
    (なお、一連の画面コピーは必ずしも時系列通りではなくて何度かやり直していて実際にコピーを取った順番は異なります。なので、後で気付いてみると、他にもおかしい箇所があったことに気付いたりします。この画面コピーでは逆アセンブルウィンドウが空欄です。あと、上の画面コピーですが、PCが先へ進んでしまっていますね。うっかり何かの操作をして少し進めてしまったようです。)


    そこでリフレッシュボタンを押すと期待値通り(ES=0x0,CS=0x0)になる


    ちなみにUpdate PolicyはAutomaticにしています


    なお、ESやCSで書いた値が表示されなくなる(リフレッシュボタンを押さないと表示が更新されない)現象の画面コピーは以下の通りです。(この状態になると他のレジスタも同様です。)

    上記(4)でブレークした時の表示はES=0x0でした(実は、この時点で、表示内容は既におかしい(期待値はES=0xfです))


    ESの値を書き換えようとマウスでValue欄をクリックすると突然0xfが表示される


    ESの値のValue欄に0x5を入力する(まだリターンキーは押していない)


    リターンキーを押すとES=0x0に戻ってしまう


    しかしリフレッシュボタンを押すと書き込んだ値のES=0x5になる

     

  • dartsmanさん、こんにちは。NoMaYです。

    本日は午前中から、現象再現確認、画面コピー採取、投稿文作成、と6時間近くやってて、気付けば金曜日も午後4時を回ろうかという時刻なのですが、今回は発端がIAR RL78コンパイラの生成コードでしたのでIAR RL78コンパイラで先程の投稿文を書いていたのですが、なんとなく、CC-RLの場合も同じようなことは起こりそうな気はしています。それで、この時刻になったのなら、CC-RLの場合も起きるかどうか調べてみようかと思います。(この際ですので、、、)

    先程の投稿文の内容からすると、自分がユーザーサポート担当ならばe2 studioの再インストールをお願いするような内容かとも思います。(数日前にchkdskを掛けた時はエラーは検出されてなかったのですが、Windows10は自動的に(勝手に)ディスクを修復したりすることがあるのかな、、、) また、頓珍漢な文字列が表示されたり、ウィンドウが空欄になってしまったり、といった現象はメモリが不足していてe2 studioの文字列処理がエラーを起こしているのかも、、、とも思わせるものです。ゆえに、CC-RLの場合も起きるのではないか、という気がするのです。

  • dartsmanさん、こんにちは。NoMaYです。

    現象再現プログラムを以下に添付します。昨日の夕方からCC-RLでも確認しようとしましたが、一旦e2 studioを終了させてしまったせいか、CC-RLに限らずICCRL78でも再現しなくなってしまいましたので、ともかく昨日は現象が起きていたICCRL78版のみのプロジェクトのファイル一式です。(なお、2つ前の投稿の再現手順にブレークポイントアドレスとプロジェクトの場所を補足しました。)

    issue_20210115_e2_reg_win_no_update_problem.zip

    ちなみに、Registersウィンドウに表示された謎の文字列"Error: Target not in non-stop mode."の出所ですが、ICCRLではリスタートボタンを押した時に毎回以下のように表示されていました。(今まで気付かなかったのが我ながら不思議なくらいです。) これが一箇所だけ残ったのだと思います。それに対し、CC-RLではそのような文字列がRegistersウィンドウに表示されることは無かったです。また、同じく、逆アセンブルウィンドウが空欄になっていたのも、ICCRLではリスタートボタンを押した時に一瞬空欄になってしまうのですが、それがそのまま残ったのだと思います。こちらも、CC-RLでは空欄になることは無かったです。