16383|6

35

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

DSP 28X中断优先级设置问题讨论! [复制链接]

以下一段话是在网上下载的,我看了下发现有点问题,望诸位指点一二:

/*-------------------------------------------------------------------------------------------------------------------------------------------------------------*/

网上原话:

原以为2812中断不能设置优先级。实际上硬件上优先级是做好的。但软件上有办法来设置优先级。请往下看:
1.首先要找到文件,DSP281x_SWPrioritizedDefaultIsr.c 和DSP281x_SWPrioritizedIsrLevels.h加载到你的程序当中。
2.在DSP281x_SWPrioritizedIsrLevels.h文件中先设置中断组的优先级级别。其中:0表示不使用;1表示优先级最高;16表示优先级最低;
      比如:我设置第9组优先级最高,第3组次之,第2,4,6组优先级为第三。其他以此类推。0表示不用。
      #define        INT1PL      4        // Group1 Interrupts (PIEIER1)
      #define        INT2PL      3        // Group2 Interrupts (PIEIER2)
      #define        INT3PL      2        // Group3 Interrupts (PIEIER3)
      #define        INT4PL      3        // Group4 Interrupts (PIEIER4)
      #define        INT5PL      4        // Group5 Interrupts (PIEIER5)
      #define        INT6PL      3        // Group6 Interrupts (PIEIER6)
      #define        INT7PL      0        // reserved
      #define        INT8PL      0        // reserved
      #define        INT9PL      1        // Group9 Interrupts (PIEIER9)
      #define        INT10PL     0        // reserved
      #define        INT11PL     0        // reserved
      #define        INT12PL     0        // reserved
      #define        INT13PL     5        // XINT3
      #define        INT14PL     5        // INT14 (TINT2)
      #define        INT15PL     5        // DATALOG
      #define        INT16PL     5        // RTOSINT
3.级中断设置好以后,我们就要设置每一组里的中断优先级级别。其中:0表示不用;1表示优先级最高;8表示优先级最低;
     以第9组为例说明:其中,ECAN0INTA优先级最高;ECAN1INTA为第2,SCIRXINTA为第3。其他自己数。
     #define        G91PL       3        // SCIRXINTA (SCI-A)
     #define        G92PL       5        // SCITXINTA (SCI-A)
     #define        G93PL       6        // SCIRXINTB (SCI-B)
     #define        G94PL       4        // SCITXINTB (SCI-B)
     #define        G95PL       1        // ECAN0INTA (ECAN-A)
     #define        G96PL       2        // ECAN1INTA (ECAN-A)
     #define        G97PL       0        // reserved
     #define        G98PL       0        // reserved
4.由上可知所有组里第9组优先级最高,第9组中ECAN0INTA(G95PL)优先级最高。优先级设置好后到 DSP281x_SWPrioritizedDefaultIsr.c
     文件中找到相应的函数。我这里就拿ECAN0INTA(ECAN-A)来作为例子说明;
  这个中断对应的函数为(DSP281x_SWPrioritizedDefaultIsr.c 文件里可以找到)如下:
//---------------------------------------------------------------------------
// eCAN-A Default ISRs:
//
// Connected to PIEIER9_5 (use MINT9 and MG95 masks):
#if (G95PL != 0)
interrupt void ECAN0INTA_ISR(void)  // eCAN-A
{
        // Set interrupt priority:
        volatile Uint16 TempPIEIER = PieCtrlRegs.PIEIER9.all;

                /* 以下表示,大于第9组中断级别的中断使能,小于第9组中断级别的中断不使能*/
        IER |= M_INT9;
        IER &= MINT;                           // Set "global" priority

                /*优先级大于第9组中第5个中断的中断使能,否则不使能*/
        PieCtrlRegs.PIEIER9.all &= MG95;   // Set "group"  priority                  

        PieCtrlRegs.PIEACK.all = 0xFFFF;   // Enable PIE interrupts       
               
        EINT; //全局中断使能,但因为此中断优先级最高,所以其他一般中断不能打断它

          // Insert ISR Code here.......
                CAN_ISR(); //你自己定义的中断处理程序,在此程序中写你自己的代码;
        // Restore registers saved:
        DINT; //关中断
        PieCtrlRegs.PIEIER9.all = TempPIEIER;
}    
#endif

 

/*------------------------------------------------------------------------------------------------------------------------------------------*/

 

讨论:

1.为什么要在中断函数的结尾处关总中断?即执行 DINT语句? 这样做不是把所有可屏蔽中断都屏蔽掉了?那如何才能响应下一个中断呢?

2.  PieCtrlRegs.PIEIER9.all = TempPIEIER;  为什么要执行这一局?要把原先PIEIER9里面的值恢复?为什么这样做?
3.  IER |= M_INT9;
     IER &= MINT;     这两句我推导过,的确是使 大于第9组中断级别的中断使能,小于第9组中断级别的中断不使能,但是这样之后小于第9组的中断级别的中断的IER使能位已经被写0了,那如何才能执行低级的中断?

主要为以上3个问题,望诸位给点建议,不甚感激!                     

最新回复

虽时隔甚远,还是要远程赞一个。  详情 回复 发表于 2016-7-31 15:01
点赞 关注(4)
 

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

推荐
 
楼主思考非常深入,我正在学习DSP的中断嵌套,从你的提问中获益不少。
问题1:
从中断执行的流程可以看到,在执行中断服务程序之前,有一个保护现场的过程:“Perform automatic context save”。其中包含ST1寄存器和IER寄存器的入栈,而中断使能标志位INTM是ST1寄存器中的一位。所以在ISR执行完之后,INTM会恢复到执行ISR之前的状态。所以这样做不会屏蔽之后的中断。而之所以加入DINT这句,应该是避免在执行PieCtrlRegs.PIEIER9.all = TempPIEIER;这句时被中断掉。
参考:TI公司提供的官方文档“TMS320C28x CPU and Instruction Set Reference Guide”。
问题2:
PieCtrlRegs.PIEIER9.all = TempPIEIER;这句会把PIEIER9的值恢复。这样PIEIER9这个Group的优先级从中断时的屏蔽低优先级允许高优先级,恢复到正常运行的优先级。
问题3:
由于IER会入栈保护,所以ISR执行完之后IER内容恢复,低级中断不受影响。

欢迎讨论指正。
 
 

回复

47

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

回复楼主

Dsp对数字信号进行处理,主要是他的运行主频高,并且他有多级流水线,如果产生中断,Dsp将会耽误好多个指令周期来恢复本次产生中断的影响,大大降低了dsp的处理性能,所以建议不到万不得已,不要考虑用中断
 
 
 

回复

35

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

回复 沙发 lw3968 的帖子

TI DSP C2000系列主要用做电机控制,软件设计时肯定得用中断嵌套。
所以感觉挺麻烦的!
 
 
 

回复

47

帖子

2

TA的资源

一粒金砂(中级)

4
 
谢谢! 收藏了.....
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

6
 
1816879000 发表于 2015-10-9 14:12
楼主思考非常深入,我正在学习DSP的中断嵌套,从你的提问中获益不少。
问题1:
从中断执行的流程可以看到 ...

讲得很好啊
 
 
 

回复

26

帖子

0

TA的资源

一粒金砂(中级)

7
 
虽时隔甚远,还是要远程赞一个。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表