【问题标题】:Storing values from special function registers to a variable将特殊功能寄存器中的值存储到变量中
【发布时间】:2016-08-08 10:04:42
【问题描述】:

我正在开发一个基于飞思卡尔 MPC5534 控制器的开发项目。
对于某些要求,我需要在 ISR(已经存在)期间将两个特殊功能寄存器(即 SRR0SRR1)的值存储到可以访问的变量中功能。以下是现有 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


【解决方案1】:

快速搜索告诉我,您需要在该系列的其他部分(555x、551x)中实现自己的堆栈帧。我没有明确找到 553x 的参考资料,但您应该可以找到。

这是我引用的应用笔记:AN2865

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 2021-05-23
    相关资源
    最近更新 更多