如何从固件(c代码)访问arm r0到r15寄存器?

时间:2016-02-16 09:31:35

标签: arm

从我的固件(基于arm的处理器),我需要访问设置r0到r15的arm皮质寄存器的值。我该如何访问这些寄存器?固件使用的是c代码。我是否需要使用内联汇编程序代码?任何示例代码也会有所帮助。

1 个答案:

答案 0 :(得分:0)

评论中提到的artless noise - 一些寄存器已存入银行。您没有提供CPU类型。是Corter Mx,Cortex Ax?

将所有寄存器转储到崩溃日志记录非常简单,但由于问题中缺少详细信息,我们需要考虑一些假设。

  1. 固件在“用户”或“系统”模式下工作,崩溃将CPU切换为“中止”模式

    STMDB   SP,     {R0-R14}^
    

    这会将所有寄存器转储到'abort'堆栈中。保存的值可以从内存中访问 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)
    
  2. 从非“用户”/“系统”模式中止。处理非常相似,但要转储库存SPLRRx_fiq,您需要

    • 将崩溃缓冲区地址加载到非存储寄存器
    • 切换到“崩溃前”模式。原始模式可以从SPSR register
    • 获取
    • 保存已存档的寄存器
    • 返回中止模式并完成错误处理。