こんにちは。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 LinkServermcuoneclipse.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です。すみません。見落としていました。ほやさん、リプライありがとうございます。