理解函数调用栈并通过栈回溯(stack trace)定位故障点(一)
R14(LR)是链接寄存器,保存的是下一个要运行的地址

以此为例,当func_A在运行时调用func_B的时候,就会把原本要继续运行的return的地址放在R14里面去,当调用完func_B之后,就会看R14里面放的是什么,继续运行下去
PC指针是指向当前程序所运行到的地址(即将要运行的这条指令)

SP是栈顶指针
栈是地址从下往上,地址逐渐减小
栈指针就指向栈顶

此处栈顶指针指向的是0x200005A8,可以看见r4-r6寄存器的值,都被压进了栈里
![]()
即执行了这条指令
而前面提到的LR寄存器也被压入了栈里,就是最后的 53 16 00 08
想要看到LR寄存器指向的是哪条指令
就可以随便右键Disassembly窗口

要注意的是栈是地址是从下往上,依次减小的,所以应该是0x08001653
点击goto就会跳转到对应的地址
所以当我们遇到比如说非法访问产生的Hardfault时,就可以通过栈指针找到地址
通过数字节数可以找到一个“疑似地址段(08开头的)”就可以进行查找了
当遇到hardFault的时候,就可以通过栈顶指针找到LR寄存器指向的指令,定位到错误位置
什么是中断(一)中断、异常、中断向量表
·什么是中断与什么是异常
对于Cortex-M4来说,CPU内部打断当前程序执行流的(比如算数异常,除0),叫异常。CPU外部(比如各种片上总线,AHB\APB等)促使CPU内部产生异常的,叫做中断。我们一般称为系统异常和外部中断。CPU内部的异常是和CPU同步的,但是外部的中断,比如串口(我们之前做的作业)是和CPU异步的


对于同步异常,只要正在执行的时候,发生了异常,就会立马进入os管理的回调函数或者是异常处理函数,比如说hardfault 就会进入相应的处理函数,通过栈回溯就可以找到问题
但是对于外部中断,如果其发出中断,处理器会先悬起 ,等待cpu响应,再进入cpu的响应异常状态流程
Memory mapping 寄存器映射
这里就是讲了寄存器如何被映射的
如果访问STIR寄存器,并且给它一个中断号,它就可以模拟一些中断
作用是:有时候进行一些回调测试函数,加入i方c硬件产生了硬件中断回调,因为这是硬件产生的,回调产生过程中,我想要测试软件的部分有无问题,就可以产生这样的一个软件中断,
比如说我产生一个定时器的软件中断,看一下这个链路处理的时间有多长,从产生这个软件中断开始计时,再到结束,这个时间段有多长就可以测出来
这个方法在很多i方c 和spi硬件很多问题debug‘不出来,就可以用这种测试方法




圆整性:中断向量表想要偏移的位置,必须要能被0x200整除 ,这个0x200是根据412来的,因为是2进制,向上圆整,所以是512的16进制
更多推荐
所有评论(0)