LLVMにRenesas RL78をPortingしようとしているのかな?

こんにちは。NoMaYです。

ウェブで調べ物をしていて気付いたのですが、RenesasさんはLLVM(今はGCCと並ぶ著名なフリーコンパイラ)にRL78をPortingしようとしているのかも、、、

[llvm-dev] New LLVM backend for Renesas RL78 MCU
Sebastian Perta via llvm-dev llvm-dev at lists.llvm.org
Wed Apr 1 10:26:05 PDT 2020
lists.llvm.org/pipermail/llvm-dev/2020-April/140546.html
 

Parents
  • こんにちは。NoMaYです。

    以前に別スレッドのBlinkyサンプルプログラムでLLVM-RL78は内蔵周辺レジスタアクセスのコードが随分悪いことに気付いた時に既に気になっていたことなのですが、LLVM-RL78は生成コードでビット操作命令を使っていないのですよ。

    ところが、RL78スマートコンフィグレータはビット操作命令が使われることを前提にして以下のようなAPIを生成しています。Start関数とStop関数は、いつ何時呼び出しても構わない(ドキュメントには何の注意事項も記載されていない)ですので、以下のような問題が発生する可能性があります。(今ちゃんと認識しました。)

    (1) 非常に微妙なタイミングで立った他のIFフラグを勝手にクリアしてしまう
    (2) IFフラグ操作中に割り込み処理へ飛んでいたら、その期間中に立った他のIFフラグを勝手にクリアしてしまう
    (3) MKフラグ操作中に割り込み処理へ飛んでいたら、その期間中に変更された他のMKフラグを勝手に元の値に戻してしまう

    void R_Config_INTC_INTP0_Start(void)
    {
        PIF0 = 0U;    /* clear INTP0 interrupt flag */
        PMK0 = 0U;    /* enable INTP0 interrupt */
    }

     

    void R_Config_INTC_INTP0_Stop(void)
    {
        PMK0 = 1U;    /* disable INTP0 interrupt */
        PIF0 = 0U;    /* clear INTP0 interrupt flag */
    }

     

    0000373a _R_Config_INTC_INTP0_Start:
    ;     PIF0 = 0U;    /* clear INTP0 interrupt flag */
        373a: 36 e0 ff                      movw hl, #65504
        373d: ab                            movw ax, [hl]
        373e: 5a f8 fb                      and 0xffef8, #251
        3741: 36 e0 ff                      movw hl, #65504
        3744: bb                            movw [hl], ax
    ;     PMK0 = 0U;    /* enable INTP0 interrupt */
        3745: 36 e4 ff                      movw hl, #65508
        3748: ab                            movw ax, [hl]
        3749: 5a f8 fb                      and 0xffef8, #251
        374c: 36 e4 ff                      movw hl, #65508
        374f: bb                            movw [hl], ax
    ; }
        3750: d7                            ret

     

    00003751 _R_Config_INTC_INTP0_Stop:
    ; {
        3751: fd 65 37                      call !0x3765
    ; }
        3754: d7                            ret
    ...
    00003765 _OUTLINED_FUNCTION_0:
        3765: 36 e4 ff                      movw hl, #65508
        3768: ab                            movw ax, [hl]
        3769: 6a f8 04                      or 0xffef8, #4
        376c: 36 e4 ff                      movw hl, #65508
        376f: bb                            movw [hl], ax
        3770: 36 e0 ff                      movw hl, #65504
        3773: ab                            movw ax, [hl]
        3774: 5a f8 fb                      and 0xffef8, #251
        3777: 36 e0 ff                      movw hl, #65504
        377a: bb                            movw [hl], ax
        377b: d7                            ret

     

Reply
  • こんにちは。NoMaYです。

    以前に別スレッドのBlinkyサンプルプログラムでLLVM-RL78は内蔵周辺レジスタアクセスのコードが随分悪いことに気付いた時に既に気になっていたことなのですが、LLVM-RL78は生成コードでビット操作命令を使っていないのですよ。

    ところが、RL78スマートコンフィグレータはビット操作命令が使われることを前提にして以下のようなAPIを生成しています。Start関数とStop関数は、いつ何時呼び出しても構わない(ドキュメントには何の注意事項も記載されていない)ですので、以下のような問題が発生する可能性があります。(今ちゃんと認識しました。)

    (1) 非常に微妙なタイミングで立った他のIFフラグを勝手にクリアしてしまう
    (2) IFフラグ操作中に割り込み処理へ飛んでいたら、その期間中に立った他のIFフラグを勝手にクリアしてしまう
    (3) MKフラグ操作中に割り込み処理へ飛んでいたら、その期間中に変更された他のMKフラグを勝手に元の値に戻してしまう

    void R_Config_INTC_INTP0_Start(void)
    {
        PIF0 = 0U;    /* clear INTP0 interrupt flag */
        PMK0 = 0U;    /* enable INTP0 interrupt */
    }

     

    void R_Config_INTC_INTP0_Stop(void)
    {
        PMK0 = 1U;    /* disable INTP0 interrupt */
        PIF0 = 0U;    /* clear INTP0 interrupt flag */
    }

     

    0000373a _R_Config_INTC_INTP0_Start:
    ;     PIF0 = 0U;    /* clear INTP0 interrupt flag */
        373a: 36 e0 ff                      movw hl, #65504
        373d: ab                            movw ax, [hl]
        373e: 5a f8 fb                      and 0xffef8, #251
        3741: 36 e0 ff                      movw hl, #65504
        3744: bb                            movw [hl], ax
    ;     PMK0 = 0U;    /* enable INTP0 interrupt */
        3745: 36 e4 ff                      movw hl, #65508
        3748: ab                            movw ax, [hl]
        3749: 5a f8 fb                      and 0xffef8, #251
        374c: 36 e4 ff                      movw hl, #65508
        374f: bb                            movw [hl], ax
    ; }
        3750: d7                            ret

     

    00003751 _R_Config_INTC_INTP0_Stop:
    ; {
        3751: fd 65 37                      call !0x3765
    ; }
        3754: d7                            ret
    ...
    00003765 _OUTLINED_FUNCTION_0:
        3765: 36 e4 ff                      movw hl, #65508
        3768: ab                            movw ax, [hl]
        3769: 6a f8 04                      or 0xffef8, #4
        376c: 36 e4 ff                      movw hl, #65508
        376f: bb                            movw [hl], ax
        3770: 36 e0 ff                      movw hl, #65504
        3773: ab                            movw ax, [hl]
        3774: 5a f8 fb                      and 0xffef8, #251
        3777: 36 e0 ff                      movw hl, #65504
        377a: bb                            movw [hl], ax
        377b: d7                            ret

     

Children
  • NoMaYさん

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

    色々と実験ありがとうございます。permission deniedが特に気になります。ツールチームと相談開始しました。

    ①再現環境もらえませんか?

    ②再現頻度はどのくらいでしょう?

    ③再現環境が置いてあるファイルパスを教えてください。

    ④ほやさんが書き込んでいる視点(操作手順や設定など)での情報もあれば教えてください。

    再現したりしなかったり、とのことなので情報まとまった段階で情報いただければと思います。

    種々お手数おかけしてすみません。新しい開発環境の精度をもっと上げていきたいと考えてます。

    本スレッド含め掲示板の内容は全般継続的に確認させていただいております。

    以上です