私はフリースケールのMPC5534コントローラをベースとした開発プロジェクトに取り組んでいます。
ISR(既に存在する)中に、関数からアクセス可能な変数に2つの特殊関数レジスタ(つまりSRR0とSRR1)の値を格納する必要があります。既存のISRのためのアセンブリコードスニペットを以下に示します。特殊関数レジスタから変数への値の格納
lis r0,0x_value1
ori r0,r0,0X_value2
mfSPEFSCR r3
and r0,r0,r3
mtSPEFSCR r0
lis r3,[email protected]
ori r3,r3,[email protected]
mtlr r3
li r3,0x_value3
blrl
rfi
:
は何を私にトラブルがあるlis r0,0x_value1
ori r0,r0,0X_value2
mfSPEFSCR r3// move from SPEFSCR register
and r0,r0,r3
mtSPEFSCR r0 //move to SPEFSCR register
lis r3,[email protected]
ori r3,r3,[email protected]
mtlr r3
mfsrr0 r4 //copy srr0 to r4
mfsrr1 r5 //copy srr1 to r5
li r3,FPU_RESET
blrl
rfi
、私はどのようにを知っていますかレジスタr4とr5が既に他の関数によって使い果たされている場合(他のプロジェクトファイルにアクセスできないとします) もしそうなら、私のアプローチは間違いありませんか?このISRのスタックフレームを明示的に作成して、r4とr5をプッシュしてポップすると、レジスタの衝突がないことを確認する必要がありますか?それは理にかなっていますか?
今、私はファイルをコンパイルして見ることができません。
一般的にフリースケールまたはPowerPCで働いている人なら誰でも助けてくれるかもしれません。前もって感謝します。
、R4およびR5は、割り込み時に積み重ねられていないから:
これは私が参照APPNOTEです。だから、古い値を積み重ねる前にそれらを使うのはどういう意味ですか?私はその問題がPowerPCにどのように関連しているのか具体的にはわかりません。一般的に、CPUに関係なく、ISR内部からランダムなCPUレジスタに書き込むだけではありません。 – Lundin
すべてのアセンブラコードを使用する理由は何ですか? CまたはC++コンパイラがフレームを生成し、組み込み関数を使用するのはなぜでしょうか。 – Olaf