こんにちは。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のリポジトリにも反映していく予定です。
引き続きいろいろと情報交換させてください。
以上です
すみませんportではなくてコンパイラ生成コードの話ですね。
ルネサスのツールの人経由でIARの人とも相談できないか考えてみます。