フリースケール 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,Address@h
ori r3,r3,Address@l
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,Address@h
ori r3,r3,Address@l
mtlr r3
mfsrr0 r4 //copy srr0 to r4
mfsrr1 r5 //copy srr1 to r5
li r3,FPU_RESET
blrl
rfi
レジスタ r4 と r5 がすでに他の関数によって使用されているかどうかを知るにはどうすればよいですか (たとえば、他のプロジェクト ファイルにアクセスできないとします)。もしそうなら、私のアプローチは正しいですか?レジスタの衝突が発生しないようにするために、r4 と r5 をプッシュおよびポップするこの ISR のスタック フレームを明示的に作成する必要がありますか? それは理にかなっていますか?
現在、私はファイルをコンパイルして確認する立場にありません。
freescale または powerPC を一般的に使用したことのある人なら誰でも、私を助けることができるかもしれません。前もって感謝します。