This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

DSP C64x+异常处理

Other Parts Discussed in Thread: DM3730, OMAP3530

你好,我使用的芯片是OMAP3530,对应的DSP型号为dm3730,开发环境为CCS3.3,BIOS5.4。在DSP/BIOS系统下开发。现在想使用C64x+芯片提供的异常处理机制来监测处理系统异常,但是在测试时,触发异常后,系统并未进入设置好的异常处理程序,麻烦你们帮我查找下原因?

         我开发过程如下:

        1、进入DSP/BIOS配置界面,使能EXC功能:HWI_Hardware Interrupt Service Routine 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()。我想问下,是我配置存在问题吗?还是什么其他原因?

  • 先看一下IFR中断标志位有没有置起来?

  • 你好,非常感谢你的解答。

    我已经将IFR寄存器的状态值打印出来了,发现其低16位的值是0x8000,NMIF并未置1,所以无法进入异常中断。我还有几个疑问,麻烦你解答下:

    1、利用DSP/BIOS开发,我在程序中那样使能C64x+ 的异常处理机制对吗?

    2、现在未进入中断,我应该从那方面去寻找问题?即为什么NMIF未置为1,是我异常使能不对?还是我那样操作内存并未触发异常呢?

     

  • DSP/BIOS里有MPC_setBufferPA API函数,可以试试用BIOS API函数配置。 请参考一下DM6437的exception handling例程。
    http://processors.wiki.ti.com/index.php/Cache_Protection_With_the_DSP/BIOS_MPC_Module#Example

  • 你好,经过调试我的程序已经可以进入NMI中断了,非常感谢。

    我还有几个疑问,希望你能解答下:

    1、如果在BIOS中不使能”MPC module“,是否可使用<mpc.h>中的MPC API函数?

    2、在BIOS中不使能”MPC module“,但使能了”内存异常事件“,如果出现了内存的违规访问,是否会产生相应的异常事件,并进入”HWI_NMI“中断的处理函数?

                   期待你的回答!祝:工作愉快!

  • 你可以把BIOS中使能MPC module勾去掉再跑一下程序看能不能产生异常事件。

  • 你好,我现在遇到一个比较困惑的问题:

            (1) 我在DSP/BIOS中使能了“MPC module”功能,但并未故意制造内存访问异常,并且在DSP初始化中对EXPMASK(0~3)寄存器各位全部置1了,如下:

                EXPMASK0 = 0xffffffff;

                EXPMASK1 = 0xffffffff;

                EXPMASK2 = 0xffffffff;

                EXPMASK3 = 0xffffffff;

    即异常事件都未联合,但程序却进入了HWI_NMI中断控制程序,并且进入了外部可屏蔽异常(EXF);

            (2)当我不使能“MPC module”功能时,程序就没产生异常。

              程序是一样的,请问这是什么原因?期待你的答复。

  • 你好,另外我在网上找到一片文章《TI C64x+ DSP 内核异常处理机制的应用》,作者是贵公司的员工崔晶。他在文章中提到不使用DSP/BIOS情况下,也可以进行DSP异常检测和处理,他在文章中提到了一个DM648_EXC.zip的例程,你可否提供类似的例程,即不使用DSP/BIOS开发的全程?十分感谢!

                                                               祝:工作愉快。^~^

  • 你好,非常感谢你的帮助。我现在已经进入异常处理程序的调试。

    今天在调试过程中,碰到一个问题,希望你能解答下:

           我在初始化程序中只使能了122号事件(L1D Memory protect default),程序进入了异常处理程序,并且检测到EXF.EXF被置1(即检测到外部可屏蔽异常),

    但是MEXPFLAG3状态寄存器没有位被置1,非常奇怪,这是为什么?

  • 不好意思,是EFR.EXF被置1,

  • zhiming xu 说:

    你好,另外我在网上找到一片文章《TI C64x+ DSP 内核异常处理机制的应用》,作者是贵公司的员工崔晶。他在文章中提到不使用DSP/BIOS情况下,也可以进行DSP异常检测和处理,他在文章中提到了一个DM648_EXC.zip的例程,你可否提供类似的例程,即不使用DSP/BIOS开发的全程?十分感谢!

                                                               祝:工作愉快。^~^



    例程可以到下面的网站下载。
    TI C64x+ DSP内核异常处理机制的应用 (ZIP 1146 KB)
    http://www.ti.com.cn/general/cn/docs/litabsmultiplefilelist.tsp?literatureNumber=zhca072

     

  • zhiming xu 说:

    你好,非常感谢你的帮助。我现在已经进入异常处理程序的调试。

    今天在调试过程中,碰到一个问题,希望你能解答下:

           我在初始化程序中只使能了122号事件(L1D Memory protect default),程序进入了异常处理程序,并且检测到EXF.EXF被置1(即检测到外部可屏蔽异常),

    但是MEXPFLAG3状态寄存器没有位被置1,非常奇怪,这是为什么?



    EVTFLAG相应位置1了么? EXPMASK是不是设成0?


  • 你好,EXPMASK3设置为0xfbffffff(即122事件被使能了,并且我只使能了122事件)。经过测试,我发现EVTFLAG1寄存器的值为0x10000000(即60号事件被置1了),EVTFLAG0、EVTFLAG2、EVTFLAG3值均为0x00000000。

           为什么60号事件会被置1,是寄存器设置问题吗?

  • 你好,我的问题基本解决了。非常感谢你提供的帮助。

  • 方便的话,能否分享一下60号中断置位的问题,谢谢。

  • 你好,我现在也不清楚为什么60事件会置位。

    我现在只是将原来直接对寄存器配置变为使用EXC API函数进行操作,才不会出现之前的问题。

    想问题:128事件在 dm3730 datasheet手册中描述比较简单,请问其他手册有更加详细的描述资料吗?