你好,我使用的芯片是OMAP3530,对应的DSP型号为dm3730,开发环境为CCS3.3,BIOS5.4。在DSP/BIOS系统下开发。现在想使用C64x+芯片提供的异常处理机制来监测处理系统异常,但是在测试时,触发异常后,系统并未进入设置好的异常处理程序,麻烦你们帮我查找下原因?
我开发过程如下:
1、进入DSP/BIOS配置界面,使能EXC功能:HWI_Hardware Interrupt Service Rou
tine Manager->Properties->勾选“Enable EXC module excdption processing”,保存。
2、在DSP/BIOS配置界面,设置异常处理函数(excInt):HWI_NMI->Properties->function,在function后填入:_excInt,然后保存。
3、相关代码说明:
(1)内存保护初始化
#define EXC_EVTPMCCMPA 120 /* L1P CPU Memory Protection fault */
#define EXC_EVTDMCCMPA 122 /* L1D CPU Memory Protection fault */
#define EXC_EVTUMCCMPA 124 /* L2 CPU Memory Protection fault */
void MPC_init (void)
[
/*写1 到MPFCR,清除BOOT ROM 可能触发的内存保护异常*/
L1PMPFCR = 1;
L1DMPFCR = 1;
L2MPFCR = 1;
/*清除内存保护故障事件对应的EVTFLAG 和MEXPFLAG 标志位*/
EVTCLR3 | = 0x01000000;
EVTCLR3 | = 0x04000000;
EVTCLR3 | = 0x10000000;
/*使能内存保护故障事件*/
EXPMASK3 & = ~0x01000000;
EXPMASK3 & = ~0x04000000;
EXPMASK3 & = ~0x10000000;
]
(2)异常中断初始化
#define EXC_TSRGEE 0x00000004
#define EXC_TSRXEN 0x00000008
void EXC_init(void)
[
extern volatile cregister unsigned int TSR;
extern volatile cregister unsigned int ISTP;
extern volatile cregister unsigned int IER;
extern volatile cregister unsigned ECR;
extern volatile cregister unsigned NRP;
extern volatile cregister unsigned NTSR;
extern volatile cregister unsigned IERR;
/*清除异常中断相关寄存器的状态*/
ECR = 0xFFFFFFFF;
NRP = 0;
NTSR = 0;
IERR = 0;
/* 使能异常中断*/
TSR |= EXC_TSRXEN | EXC_TSRGEE;
IER = IER |2;
]
(3)设置内存保护页属性
#define MPC_MPPA_UX 0x00000001 /* User execute */
#define MPC_MPPA_UW 0x00000002 /* User Write */
#define MPC_MPPA_UR 0x00000004 /* User Read */
#define MPC_MPPA_SX 0x00000008 /* Supervisor execute */
#define MPC_MPPA_SW 0x00000010 /* Supervisor Write */
#define MPC_MPPA_SR 0x00000020 /* Supervisor Read */
#define MPC_MPPA_LOCAL 0x00000100 /* LOCAL CPU access */
void MPC_setBufferPA(void)
[
unsigned int * p1;
unsigned int i;
p1 = (unsigned int *) 0x0184AE40; //L1DMPPA16 地址
for(i=0; i<8; i++)
*p1++ = MPC_MPPA_UR | MPC_MPPA_SR | MPC_MPPA_LOCAL;
for(i=0; i<8; i++)
*p1++ = 0; //16KB cache
]
(4)中断服务处理程序
void excInt()
[
//异常处理代码
]
(5)main函数中调用
#define L1DSRAM_CACHE_BASE 0x00F14000
void main(void)
[ volatile unsigned int * p;
/* L1DCFG L1D Configuration. 16k cache, 16k addressable */
L1DCFG = 3;
MPC_init(); //内存保存初始化
EXC_init(); //中断初始化
MPC_setBufferPA(); //设置内存属性
//向不可写的内存进行写操作,触发异常
p= (unsigned int *) L1DSRAM_CACHE_BASE;
*p=123;
]
将上述程序集成到系统中,编译后下载到调试板上,发现系统并未进入异常处理函数excInt()。我想问下,是我配置存在问题吗?还是什么其他原因?