如何从固件(c代码)访问arm r0到r15寄存器?
从我的固件(基于arm的处理器)中,我需要访问arm cortex寄存器设置r0到r15的值。我怎样才能访问这些注册表?固件正在使用c代码。我需要使用内联汇编代码吗?任何示例代码都会很有帮助。如注释中所述-一些寄存器已存入银行。您没有提供CPU的类型。是Corter Mx,Cortex Ax吗 倾倒所有寄存器用于崩溃日志记录是非常简单的,但是我们需要考虑一个假设,因为在这个问题中缺少细节。p>如何从固件(c代码)访问arm r0到r15寄存器?,arm,Arm,从我的固件(基于arm的处理器)中,我需要访问arm cortex寄存器设置r0到r15的值。我怎样才能访问这些注册表?固件正在使用c代码。我需要使用内联汇编代码吗?任何示例代码都会很有帮助。如注释中所述-一些寄存器已存入银行。您没有提供CPU的类型。是Corter Mx,Cortex Ax吗 倾倒所有寄存器用于崩溃日志记录是非常简单的,但是我们需要考虑一个假设,因为在这个问题中缺少细节。p> 固件在“用户”或“系统”模式下工作,崩溃将CPU切换到“中止”模式 STMDB SP, {
STMDB SP, {R0-R14}^
这将把所有寄存器转储到“中止”堆栈中。保存的值可以从内存中访问。SP_abt
应提前适当设置。或者类似的选择是将崩溃缓冲区和转储寄存器分配到特定的内存区域,而不是堆栈中
abort_handler:
push {lr} // LR_abt into 'abort' stack
ldr lr, =crash_buffer // load address of crash log buffer
stm lr, {r0-r14}^ // Save *USER* R0-R14
// do error handling if any
pop {lr} // restore original LR_abt
subs pc, lr, #8 // return from ISR (optional)
SP
或LR
或Rx\u fiq
,您需要
- 将崩溃缓冲区地址加载到非银行寄存器
- 切换到“碰撞前”模式。原始模式可以从
寄存器中获取SPSR
- 存盘寄存器
- 返回中止模式并完成错误处理
STMDB SP, {R0-R14}^
这将把所有寄存器转储到“中止”堆栈中。保存的值可以从内存中访问。SP_abt
应提前适当设置。或者类似的选择是将崩溃缓冲区和转储寄存器分配到特定的内存区域,而不是堆栈中
abort_handler:
push {lr} // LR_abt into 'abort' stack
ldr lr, =crash_buffer // load address of crash log buffer
stm lr, {r0-r14}^ // Save *USER* R0-R14
// do error handling if any
pop {lr} // restore original LR_abt
subs pc, lr, #8 // return from ISR (optional)
SP
或LR
或Rx\u fiq
,您需要
- 将崩溃缓冲区地址加载到非银行寄存器
- 切换到“碰撞前”模式。原始模式可以从
寄存器中获取SPSR
- 存盘寄存器
- 返回中止模式并完成错误处理
也许你可以展示一下你的尝试和你的困境?任何代码都是有用的。您可能需要内联asm,请命名您的编译器(可能是gcc)。鉴于您执行的任何代码都必须已经使用这些寄存器,你最好解释一下你真正想要实现的是什么。我需要访问ARM寄存器,需要检查固件中包含的内容,以防发生崩溃。希望的要求现在是明确的。我正在使用用于ARM嵌入式处理器的GNU工具作为编译器。如果你能提供一些关于示例代码的想法将会很有帮助。如果你只是想查看用于调试的寄存器,为什么不使用一个好的调试器呢?例如,带有GDB的Emacs应该可以让你访问这些寄存器。(但在现金支付之后,这可能没有帮助,任何内联汇编程序代码也不会有帮助…!)也许您可以展示您尝试了什么以及您遇到了什么困难?任何代码都是有用的。您可能需要内联asm,请命名您的编译器(可能是gcc)。鉴于您执行的任何代码都必须已经使用这些寄存器,你最好解释一下你真正想要实现的是什么。我需要访问ARM寄存器,需要检查固件中包含的内容,以防发生崩溃。希望的要求现在是明确的。我正在使用用于ARM嵌入式处理器的GNU工具作为编译器。如果你能提供一些关于示例代码的想法将会很有帮助。如果你只是想查看用于调试的寄存器,为什么不使用一个好的调试器呢?例如,带有GDB的Emacs应该可以让你访问这些寄存器。(但这在现金支付后可能没有帮助,任何内联汇编程序代码也不会有帮助…!)