zoukankan      html  css  js  c++  java
  • EINT DINT ERTM DRTM EALLOW EDIS ESTOP0的理解

    本文参考以下资料整理

    https://wenku.baidu.com/view/6b0d6906cf84b9d528ea7a66.html

    http://pangqicheng123.blog.163.com/blog/static/8233547620114111235243/

    #define  EINT   asm(" clrc INTM")//INTM置0,开中断
    #define  DINT   asm(" setc INTM")//INTM置1,关中断
    #define  ERTM   asm(" clrc DBGM")//使能调试事件
    #define  DRTM   asm(" setc DBGM")//禁止调试事件
    #define  EALLOW asm(" EALLOW")
    #define  EDIS     asm(" EDIS")
    #define  ESTOP0 asm(" ESTOP0") //类似于一个断点,运行到这里的话,程序停止运行

      TI 的 DSP 为了提高安全性能,将很多关键寄存器作了保护处理。通过状态寄存器 1(ST1)的位6设置与复位,来决定是否允许DSP指令对关键寄存器进行操作。

      这些关键寄存器包括器件仿真寄存器、FLASH寄存器、CSM寄存器、PIE 矢量表、系统控制寄存器、GPIO MUX 寄存器、eCAN 寄存器的一部分。

      DSP由于在上电复位之后,状态寄存器基本上都是清零,而这样的状态下正是上述特殊寄存器禁止改写的状态。为了能够对这些特殊寄存器进行初始化,所以在对上述特殊寄存器进行改写之前,一定要执行汇编指令asm(“EALLOW”)或者宏定义EALLOW来设置状态寄存器1的C6位。在设置完寄存器之后,一定要注意执行汇编指令asm(“EDIS”)或者宏定义EDIS来清除状态寄存器1 的C6 位。

      在 device.h文件中可以找到#define  EALLOW asm(" EALLOW")语句。

    #ifndef DSP28_DEVICE_H
    #define DSP28_DEVICE_H
    #define TARGET 1
    //---------------------------------------------------------------------------
    // User To Select Target Device:
    #define F2812   TARGET
    #define F2810   0
    //---------------------------------------------------------------------------
    // Common CPU Definitions:
    //
    extern cregister volatile unsigned int IFR;
    extern cregister volatile unsigned int IER;
    #define  EINT   asm(" clrc INTM")
    #define  DINT   asm(" setc INTM")
    #define  ERTM   asm(" clrc DBGM")
    #define  DRTM   asm(" setc DBGM")
    #define  EALLOW asm(" EALLOW")
    #define  EDIS asm(" EDIS")
    #define  ESTOP0 asm(" ESTOP0")
    #define M_INT1  0x0001
    #define M_INT2  0x0002
    #define M_INT3  0x0004
    #define M_INT4  0x0008
    #define M_INT5  0x0010
    #define M_INT6  0x0020
    #define M_INT7  0x0040
    #define M_INT8  0x0080
    #define M_INT9  0x0100

    参考《TMS320C28x DSP CPU和指令集参考指南》中对INTM和DBGM的解释

    1、DBGM

      Bit 1:调试启用屏蔽位。当DBGM置位时,仿真器无法在实时状态下访问内存或寄存器。调试器无法更新其窗口。

      在实时调试模式中,若DBGM = 1,则CPU忽略停止请求或硬件断点,直到DBGM清零。DBGM并不阻止CPU停止在软件断点。这点的一个影响可以在实时调试模式中看到。如果你在实时调试模式中单步执行一个指令,并且这条指令置位DBGM,CPU继续执行指令,直到DBGM被清零。

      当你给TI调试器“实时”命令时(进入实时模式),DBGM强制为0。令DBGM = 0确保了允许调试和测试直接内存访问 (DT-DMAs);内存和寄存器的值可传递到主处理器,用于更新调试器窗口。

    CPU在执行中断服务程序(ISR)之前将DBGM置位。当DBGM = 1时,来自主处理器和硬件断点的停止请求被忽略。如果你想要单步执行程序或在对时间要求不严格的ISR中设置断点,那么你必须在ISR的开始处增加一条CLRC DBGM指令。

    DBGM主要用在时间要求严格的程序代码部分的仿真,来阻止调试事件。DBGM使能或禁止调试事件,如下:

      0 调试事件使能。

      1 调试事件禁止。

      当CPU响应中断时,DBGM的当前值存储到堆栈中(当ST1存储在堆栈中时),然后DBGM置位。当由中断返回时,DBGM由堆栈中恢复。此位可分别由SETC DBGM指令和CLRC DBGM指令复位和清零。DBGM在中断操作期间被自动置位。复位时,DBGM置位。执行ABORTI (中止中断)指令也可以将DBGM置位。

    2、INTM

      Bit 0:中断全局屏蔽位。此位从全局上使能或禁止所有可屏蔽CPU中断(那些可由软件阻止的中断):

        0 可屏蔽中断被全局使能。为了被CPU认可,则可屏蔽中断也必须被中断使能寄存器(IER)局部使能。

        1 可屏蔽中断被全局禁止。即使一个可屏蔽中断被IER局部使能,也不会被CPU认可。

      INTM对非可屏蔽中断没有影响,包括硬件复位或软件复位中断NMI。此外,当CPU在实时仿真模式下被停止时,由IER和DBGIER使能的中断将被响应,即使INTM设置为禁止可屏蔽中断。

      当CPU响应中断时,INTM的当前值存储到堆栈中(当ST1存储在堆栈中时),然后INTM置位。当由中断返回时,INTM由堆栈中恢复。

      此位可分别由SETC INTM指令和CLRC INTM指令复位和清零。复位时,INTM置位。INTM的值不会引起中断标志寄存器(IFR)、中断使能寄存器(IER)或调试中断使能寄存器(DBGIER)的改变

  • 相关阅读:
    GridView多行多列合并单元格(指定列合并)
    项目管理知识体系指南PMBOK指南
    作业调度框架 Quartz.NET 2.0 beta 发布
    外语学习有助于大脑发育
    抢书之JS版
    mac 安装python和Django开发环境
    戏谈一道面试题
    —安装时填写注册表
    深入浅出SQL Server Replication第一篇:走近Replication(上)
    IIS寄宿方式的Web地址、BaseAddress和EndPoint Address的关系
  • 原文地址:https://www.cnblogs.com/ylhwx/p/7775135.html
Copyright © 2011-2022 走看看