2016-08-08 33 views
-1

私はフリースケールのMPC5534コントローラをベースとした開発プロジェクトに取り組んでいます。
ISR(既に存在する)中に、関数からアクセス可能な変数に2つの特殊関数レジスタ(つまりSRR0SRR1)の値を格納する必要があります。既存の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で働いている人なら誰でも助けてくれるかもしれません。前もって感謝します。

+0

、R4およびR5は、割り込み時に積み重ねられていないから:

これは私が参照APPNOTEです。だから、古い値を積み重ねる前にそれらを使うのはどういう意味ですか?私はその問題がPowerPCにどのように関連しているのか具体的にはわかりません。一般的に、CPUに関係なく、ISR内部からランダムなCPUレジスタに書き込むだけではありません。 – Lundin

+1

すべてのアセンブラコードを使用する理由は何ですか? CまたはC++コンパイラがフレームを生成し、組み込み関数を使用するのはなぜでしょうか。 – Olaf

答えて

0

クイック検索では、このファミリの他の部分(555x、551x)に独自のスタックフレームを実装する必要があることがわかります。私は553xのリファレンスを明示的に見つけられませんでしたが、あなたはそれを見つけることができるはずです。私が覚えているAN2865

関連する問題