- UID
- 1029342
- 性别
- 男
|
我们可以看到0x805ec这个地址位于main函数内,我们再对比一下图5和图4中的指令,可以发现它们是相同的,可能写法上会有一些差异,但功能是相同的。
好了,ARM7内核的介绍到此结束,下面介绍cortex内核的,使用ST的STM32、TI的LM3S系列的同学们注意了,它们都是cortex内核的,下面的介绍你也许用得上。
Cortex内核与ARM7内核定位此种问题的思路完全是一样的,cortex内核的详细介绍请参考“底层工作者手册之嵌入式操作系统内核”中的5.1节。cortex内核有一些特殊,它在产生中断时会先将R0~R3、R12、LR、PC以及XPSR这8个寄存器压入当前的堆栈,然后才跳转到中断向量表执行中断服务程序,此时LR中保存的不是返回地址,而是返回时所使用的芯片模式和堆栈寄存器的标示,只能是0xFFFFFFF1、0xFFFFFFF9或者是0xFFFFFFFD这3个值中的一个,如果你还认为LR中保存的是返回地址,并且是这么奇特的地址,估计你一定会晕了。
要找cortex内核芯片的返回地址就需要到栈中去找,前面不是说了么,进入中断前硬件会自动向当前栈压入8个寄存器
如果你看了2.3节和5.1节就应该知道cortex和ARM7内核都是一种递减满栈,意思是说压栈时栈指针向低地址移动,栈指针指向最后压入的数据。SP(R13)寄存器就是栈寄存器,它里面保存的就是当前的栈指针,因此当cortex内核发生中断时,我们就可以根据SP指针来找到压入上述8个寄存器的地址,然后找到LR的位置,再从LR中找到返回地址,下面的这个例子是“底层工作者手册之嵌入式操作系统内核”中的6.1节的一个例子,
void TEST_TestTask1(void)
{
while(1)
{
DEV_PutStrToMem((U8*)"\r\nTask1 is running! Tick is: %d",
MDS_SystemTickGet());
DEV_DelayMs(1000);
MDS_TaskDelay(250);
if(MDS_SystemTickGet() >= 2000)
{
ADDRVAL(0xFFFFFFFF) = 0;
}
}
}
红色字体部分会触发一个异常,它会向0xFFFFFFFF这个地址写入0,也会触发一个异常中断,触发的异常会进入MDS_FaultIsrContext异常中断服务函数,在MDS_FaultIsrContext函数的入口地址打上断点,运行此程序 |
|