【发布时间】:2016-08-08 10:04:42
【问题描述】:
我正在开发一个基于飞思卡尔 MPC5534 控制器的开发项目。
对于某些要求,我需要在 ISR(已经存在)期间将两个特殊功能寄存器(即 SRR0 和 SRR1)的值存储到可以访问的变量中功能。以下是现有 ISR 的汇编代码 sn-p:
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 是否已经被其他一些函数用完了(比如我无权访问其他项目文件)? 如果是这样,我的方法对吗?我是否必须为此 ISR 推送和弹出 r4 和 r5 显式创建堆栈帧,以确保不会发生寄存器冲突?是否有意义?
现在我无法编译文件并查看。
通常使用过飞思卡尔或 powerPC 的任何人都可以帮助我。提前致谢。
【问题讨论】:
-
据我记得,r4 和 r5 在中断时不会堆叠。那么在堆叠旧值之前使用它们有什么意义呢?我看不出这个问题与 PowerPC 有什么特别的关系。通常,无论 CPU 是什么,您都不能只从 ISR 内部写入随机 CPU 寄存器。
-
有什么理由使用所有的汇编代码?为什么不让 C 或 C++ 编译器生成框架并使用内部函数。
标签: assembly embedded powerpc isr