因为程序在某些时候跑飞,想查找异常,但是无奈没有类似于ARM的“取指异常”与“访问异常”等异常,如对0地址的读写操作。
但看到MPU大概可以实现这个功能;,无奈相关资料太少;
并且<SPRUH79A>上说的MPU REVID(0x4E810101)与实际器件(0x4E814901)不一致.
找到另外一篇:
KeyStone Architecture Memory Protection Unit (MPU)
Literature Number: SPRUGW5A
June 2013
版本ID能对上,但按时间操作并无引起异常;
程序如下(仿真器调试):
HWREG(SOC_MPU_0_REGS + MPU0_PROG1_MPSAR) = 0x00000000;
HWREG(SOC_MPU_0_REGS + MPU0_PROG1_MPEAR) = 0x00000000 + 0x00700000 – 1;
HWREG(SOC_MPU_0_REGS + MPU0_PROG1_MPPA) = 0x03FFFE00;
p = (void*)1;
*p = 0x11;
val = *p;
按我理解应该是会引起异常的,虽然中断没开,至少“FLTSTAT”等寄存器会有变化;
是否有更详细的资料或参考代码;“C6748_StarterWare”中没有此部分例程。
tu wolfe:
问题太简单了?没人回答?
Tony Tang:
#1. C6748就参考SPRUH79A好了,你说的ID不对,可能是写错了,但不影响实际的操作。
#2. C6748的MPU只能对DDR,shareRAM做保护,你上面例子的地址不是这个范围,其实是配置不进去的。
#3. 你要的功能是DSP 核的memory protection功能,请参考sprufk5a。
tu wolfe:
回复 Tony Tang:
谢谢!
按你说法MPU即无法实现“访问非法存储区域”引起一个异常?
那如何产生“指令异常”与“数据异常”?
现在我所遇到的问题是程序有时候会跑飞,程序指针在0x0070000之后的地址,即是内部ROM;
我想做的工作是:访问非法的存储区时产生异常,在异常处理中记录产生异常的一些信息,如程序指针,堆栈信息等,以备查找原因。