ビット・アクセス命令の動作と割込みとの競合について

いつもお世話になっております。

72855を採用しております。

FAQ1004533にて、V850ファミリの動作について記載がありましたが

SH7280シリーズについて同様の確認をしたく問合せさせて頂きます。

ビット・アクセス命令はリード・モディファイ・ライトの動作となるのでしょうか?

また、その実行処理中に割込みは入るのでしょうか?

  • Tk_naraさん

    SH-2A、SH2A-FPUユーザーズマニュアル ソフトウェア編にビットアクセス命令実行中は割り込みが入りませんと書いてありますね。

     

    (仮に命令実行中に割り込みが入って、実行中の命令を破棄されたとしてても、もう一度命令を先頭が実行するからリードしてビット操作してライトバックするだけなので問題なかったりしますけどねー。)

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

    今回は(汎用レジスタに対するものでは無くてメモリ/内蔵周辺機能レジスタに対するものでしょうから)、ビットアクセス命令(ビット操作命令)って、以下の命令のことになるのではないですか?

    BCLR.B #imm3,@(disp12,Rn)
    BSET.B #imm3,@(disp12,Rn)
    BST.B #imm3,@(disp12,Rn)

    でも、パイプライン動作は以下と同じですね。アドレッシングモードが違うのがミソですかね。

    AND.B #imm,@(R0,GBR)
    OR.B #imm,@(R0,GBR)

  • NoMaYさん
    そーかもしれません。
    コンパイラがどんなコードだすか分からないのですけれども、
    いずれにしてもビット操作はマルチサイクルなので問題なしですね^^

    ps
    最近NoMaYさんモデレータとしてあちこちのスレッドで大活躍ですね ♡

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

    命令レベルではKirinさんのリプライにあったマニュアルの部分でエビデンスが得られましたね。この後は、以下の最初のHigetakaさんのリプライに繋がって行きますね。そして、tk_naraさんは必要な情報が得られたかなぁ?と、、、


    ソフトから見たリード・モディファイ・ライトとは、ロード・演算・ストアのように複数命令に展開される動作となります。この場合、間に割り込みが入ると意図した動作にならない危険が潜んでいる事になります。


    [追記]

    それから、以下のKirinさんのリプライへも繋がって行きますね、です。


    アルゴリズムで演算が条件判断になどにより複数命令に分割されている場合は、割り込み内で変更した値が、割り込み復帰時に割り込み直前の値に戻ることはあると思います。
    その場合は自分で get_imask()/set_imask() で所望の処理を括らないと意図しない結果になるかと思います。

  • 割込失礼します。(割込の話題だけに…)
    Kirinさん最初の書込の「GBR間接アドレッシングでバスを掴んだまま」という記述がずっと引っかかっていたのですが、SH2-Aにはメモリに対する論理演算なんてRISCにあるまじき命令があるのか!
    初めて知りました。まさにルネサスの組込屋としての意地を感じますね。

    よく考えてみると、BSET・BCLRのサポート時点で命令単位のリードモディファイライトには対応してるので、あとは演算内容と即値が1bit/8bitの違いを追加するだけという風にも考えられますね。

    ※話題がズレますが、Cortex-M系ではbit-bandエイリアスというこれまた変態機能でリードモディファイライトへの解決策が提供されてますね。
  • Windyponさん
    各社いろいろアイデアを出してますけれども
    1クロック2クロックに凌ぎを削ってますね^^
  • お世話になっております。
    tk_naraです。

    ご回答いただいた方々、大変ありがとうございました。
    疑問点については、理解できました。
    また何かありましたら、ご協力をお願い致します。