DSP中断

转自 http://bbs.21ic.com/blog-239819-62375.html

  1.    中断相关概念 


中断过程-----------------------------------你在下象棋,突然电话响了,你回屋接电话,然后回来继续下象棋,这个过程就叫做中断响应过程。 
CPU执行正常任务---------------------下象棋 
保护现场----------------------------------你已经想好要“将军”,先在脑海中记下来。 
中断发生----------------------------------电话响- 
中断服务程序----------------------------接电话 
恢复现场----------------------------------回来后恢复刚才想法 
中断返回----------------------------------你回来继续下象棋 
中断屏蔽----------------------------------Boss 正在训话,要求所有电话关机,你不能接电话了。 
不可屏蔽中断—----------------------------你内急,即使是 Boss 在训话,你还是得到外面去嘘嘘。

可屏蔽中断-------------------------------你在“闭关修炼”,可以不受外界干扰。 
 
2.  中断源 
C6000 支持软件中断和硬件中断。软件中断由指令产生中断请求,硬件中断可以来自
外设的一个请求信号,如外部中断。C620x/C670x 中断向量表

 

中断号       中断名称                         中断功能

00000b    DSPINT         Host port host to DSP interrupt

00001b    TINT0           Timer 0 interrupt

00010b    TINT1           Timer 1 interrupt

00011b    SD_INT         EMIF SDRAM timer interrupt

00100b    EXT_INT4     External interrupt 4

00101b    EXT_INT5     External interrupt 5

00110b    EXT_INT6     External interrupt 6

00111b    EXT_INT7     External interrupt 7

01000b    EDMA_INT    EDMA channel (0 through 15) interrupt

01001b    Reserved Not used

01010b    Reserved Not used

01011b    Reserved Not used

01100b    XINT0           McBSP 0 transmit interrupt Multichannel Buffered Serial Port (多通道缓冲串行口)

01101b    RINT0           McBSP 0 receive interrupt

01110b    XINT1           McBSP 1 transmit interrupt

01111b    RINT1           McBSP 1 receive interrupt

Other   Reserved

不同型号的DSP 定义中断号所对应的中断功能不同,为了达到统一使用中断号功能,DSP 可以使用中断复用寄存器进行重新映射。通过中断复用寄存器映射可以把中断源映射到任何CPU中断。 
 
中断复用寄存器默认中断号映射表

 

CPU

Related

INTSEL

Interrupt

 

Interrupt

INTSEL field

Reset V alue

Acronym

Interrupt Deion

INT4

INTSEL4

00100b

EXT_INT4

External interrupt pin 4

INT5

INTSEL5

00101b

EXT_INT5

External interrupt pin 5

INT6

INTSEL6

001 10b

EXT_INT6

External interrupt pin 6

INT7

INTSEL7

001 1 1b

EXT_INT7

External interrupt pin 7

INT8

INTSEL8

01000b

DMA_INT0/

DMA Channel 0 Interrupt/

 

 

 

EDMA_INT

EDMA interrupt

INT9

INTSEL9

01001b

DMA_INT1

DMA Channel 1 interrupt ??

INT10

INTSEL10

0001 1b

SD_INT

EMIF SDRAM timer interrupt

 

 

 

 

(C62x/C67x)

 

 

 

SD_INT A

EMIF A SDRAM timer interrupt

 

 

 

 

(C64x)

INT1 1

INTSEL1 1

01010b

DMA_INT2

DMA Channel 2 interrupt ??

INT12

INTSEL12

0101 1b

DMA_INT3

DMA Channel 3 interrupt ??

INT13

INTSEL13

00000b

DSPINT

Host port to DSP interrupt

INT14

INTSEL14

00001b

TINT0

T imer 0 interrupt

INT15

INTSEL15

00010b

TINT1

T imer 1 interrupt

 


3.  常用中断寄存器 
通过对中断寄存器进行配置,可以实现各种中断功能。 
IER(中断使能寄存器) 
IFR(中断标志寄存器) 
ISR(中断设置寄存器) 
ICR(中断清除寄存器) 
ISTP(中断向量表起始地址寄存器)中断向量程序的地址可以通过 ISTP寄存器进行重新映
射 
MUXH(中断复用寄存器) 
MUXL(中断复用寄存器) 
通过DSP的data sheet 可以很容易找到寄存器的绝对地址,但为了减少配置错误和方便移植,在编程时一般采用 CSL 函数对中断寄存进行配置。

4.  CSL(DSP API 函数)函数使用说明 
在开发 DSP 的过程中一定要用好 CSL 函数,它给 DSP 的编程带来很多方便。使用 CSL函数可以使程序更容易理解和维护,同时可以有效避免在编程中的笔误。 
 
IRQ_clear(IRQ_EVT_TINT0);//对 IFR寄存器进行操作,定时中断标志位清零 
IRQ_enable(IRQ_EVT_TINT0;//对 IER寄存器进行操作,使能定时中断 
IRQ_map(IRQ_EVT_TINT0,12);//对 MUX 寄存器进行配置,根据需要把中断号进行重新映
射。 
IRQ_globalEnable();//对CSR 中 GIE 标志位进行配置,标志位置 1; 
。。。。。。。。。。。。。 
 
相应的 CSL函数可以在 CCS自带的PDF 文档《TMS320C6000Chip Support Library API Reference Guide》中进行查找 
 
5.  中断响应流程图 
  
  

6.  中断过程描述 
 
    1.  上电复位,产生复位中断请求,上电中断无需确认,直接执行。 
    2.  STW    B0,*--B15;  进行现场保护 
    3.  MVKL  addr,B0; 
         MVKH  addr,B0;载入中断向量表,将中断向量表送入程序指针。 
    4.  B      B0;跳转至 B0 中存储的地址,执行中断向量表。 
    5.  执行_c_int00 进行初始化 
    6.  跳转至 main()执行 csl 函数,IO口,定时器等初始化。 
    7.  执行 while 循环。 
    8.  定时时间到,产生定时中断。 
    9.  重复执行 2-4步骤 
    10.  执行中断服务程序 c_int14。 
    11.  中断返回 
    12.  LDW    *B15++,B0  恢复现场。 
    13.  继续执行 while 循环。 
 
7.  中断程序解析 

 


void main() 

            
           CSL_init();//CSL函数初始化 
 
           Htimer = TIMER_open(TIMER_DEV0,TIMER_OPEN_RESET);//打开定时器 0,返回定
时器句柄 
           TimerEventId = TIMER_getEventId(Htimer);//取得定时事件 ID 
           TIMER_config(Htimer,&Mtimer_configA);      //配置定时器 
 
           Hgpio  = GPIO_open(GPIO_DEV0,GPIO_OPEN_RESET);//打开 IO 
           GPIO_config(Hgpio,&Mgpio_config);//配置 IO 
 
           IRQ_setVecs(vectors);//重新设置中断向量, 
           IRQ_globalEnable();   //全局中断使能 
           IRQ_nmiEnable();  
           IRQ_map(TimerEventId,14);//把定时中断重新映射到 14 
           IRQ_reset(TimerEventId); 
           IRQ_enable(TimerEventId); // 
 
           TIMER_start(Htimer);           //定时开始 
 
    while(1);//死循环 
 
           TIMER_close(Htimer); 
           GPIO_close(Hgpio);


 
interrupt void c_int14(void)//中断服务程序 

    if(flag==0) 
    { 
                GPIO_pinWrite(Hgpio,GPIO_PIN3,flag);  
                flag=1; 
           } 
           else 
           { 
                GPIO_pinWrite(Hgpio,GPIO_PIN3,1); //点灯 
                flag=0; 
           } 
}


*------------------------------------------------------------------------------ 
* Global symbols defined here and exported out of this file 
*------------------------------------------------------------------------------ 
    .global _vectors//全局标号,可以在别处使用. 
    .global _c_int00 
    .global _vector1 
    .global _vector2 
    .global _vector3 
    .global _vector4 
    .global _vector5 
    .global _vector6 
    .global _vector7 
    .global _vector8 
    .global _vector9           
    .global _vector10   
    .global _vector11     
    .global _vector12   
    .global _vector13     
    .global _c_int14  ; Hookup the c_int14 ISR in main() 
    .global _vector15 
 
*------------------------------------------------------------------------------ 
* Global symbols referenced in this file but defined somewhere else.   
* Remember that your interrupt service routines need to be referenced here. 
*------------------------------------------------------------------------------ 
    .ref _c_int00//相当于 extern,在这里引用,在别处定义


*------------------------------------------------------------------------------ 
* This is a macro that instantiates one entry in the interrupt service table. 
*------------------------------------------------------------------------------ 
VEC_ENTRY .macro addr//定义中断向量入口地址 
 
    STW   B0,*--B15;保存B0 内容,中断产生后执行的第一条指令 
    MVKL  addr,B0; 
      MVKH  addr,B0;//把地址装入 B0 
    B     B0;跳转至 B0 中存储的地址 
    LDW   *B15++,B0;恢复B0内容; 由于C6000流水线的原因,跳转后仍然可以执行多条指                  
令 
    NOP   2 
    NOP    
    NOP    
    .endm 
 
 
*------------------------------------------------------------------------------ 
* This is a dummy interrupt service routine used to initialize the IST. 
*------------------------------------------------------------------------------ 
_vec_dummy:未定义中断服务程序 
  B     B3;其他没有定义的中断跳转至 B3 存储的地址 
  NOP  5 
 
*------------------------------------------------------------------------------ 
* This is the actual interrupt service table (IST). It is properly aligned and 
* is located in the subsection .text:vecs. This means if you don't explicitly 
* specify this section in your linker command file, it will default and link 
* into the .text section. Remember to set the ISTP register to point to this 
* table. 
*------------------------------------------------------------------------------ 
.sect ".text:vecs";定义段 
.align 1024;1024 字节对边界对齐 
 
_vectors: 
_vector0:    VEC_ENTRY _c_int00      ;RESET  跳转到_c_int00 ,_c_int00是 c语言程序的入口 
_vector1:    VEC_ENTRY _vec_dummy  ;NMI 
_vector2:    VEC_ENTRY _vec_dummy  ;RSVD 
_vector3:    VEC_ENTRY _vec_dummy ;  所有未定义中断均跳转到同一地址 
_vector4:    VEC_ENTRY _vec_dummy 
_vector5:    VEC_ENTRY _vec_dummy 
_vector6:    VEC_ENTRY _vec_dummy 
_vector7:    VEC_ENTRY _vec_dummy

_vector8:    VEC_ENTRY _vec_dummy 
_vector9:    VEC_ENTRY _vec_dummy 
_vector10:  VEC_ENTRY _vec_dummy 
_vector11:  VEC_ENTRY _vec_dummy 
_vector12:  VEC_ENTRY _vec_dummy 
_vector13:  VEC_ENTRY _vec_dummy 
_vector14:  VEC_ENTRY _c_int14  ; Hookup the c_int14 ISR in main()  定时中断中断向量 
_vector15:  VEC_ENTRY _vec_dummy 
 
*------------------------------------------------------------------------------------------------------

<think>首先,用户的问题是:“我想查找关于DSP中断的相关信息 请问DSP中断的原理、应用及处理方法”。用户提到了参考站内引用[1],是关于DSP原理及应用课程的,特别是ADC部分和中断事件。 从系统指令: - 所有行内数学表达式用$...$,例如 $x^2$ - 独立公式用$$...$$单独成段 - LaTeX语法正确 - 使用中文回答 - 生成相关问题 - 回答中引用的段落末尾自然地添加引用标识,例如:[^1] - 回答结构清晰,逐步解决问题 用户上一次的问题是关于DSP中断的,但对话历史中没有上一次的问题,所以参考引用[1]的内容。 引用[1]提到: - 影子寄存器到工作寄存器的条件:立即、CTR=APRD - 中断事件在8.3节 - ADC部分有涉及采样和排序器,但中断事件在8.3 用户真正想要的是DSP中断的原理、应用及处理方法。引用[1]中提到了“中断事件”,但没有详细描述。我需要基于DSP中断的通用知识来回答,同时参考引用中的碎片信息。 关键点: - DSP中断:数字信号处理器中的中断机制,用于处理外部事件或内部事件异步地打断当前任务。 - 原理:中断源触发中断请求,CPU保存当前状态,跳转到中断服务程序(ISR),执行完后返回。 - 应用:实时处理事件,如ADC采样完成、定时器到期、外部信号等。 - 处理方法:配置中断向量、使能中断、编写ISR、处理中断标志等。 从引用[1]: - 提到“中断事件”在8.3节 - 在ADC部分,有SOC触发源:软件直接启动、EPWM1-6的SOCA、SOCB、外部引脚触发GPIO_XINT2等,这些可以作为中断源。 - 还提到ADC的转换结果支持DMA访问,可能与中断结合使用。 我需要结构化回答: 1. 原理 2. 应用 3. 处理方法 生成相关问题:在结尾添加相关问题。 使用中文回答。 确保LaTeX正确:如果有数学表达式,用$...$或$$...$$。 例如,中断响应时间可能有公式,但我可能不需要复杂的数学。保持简洁。 参考引用:在回答中提到引用部分时添加[^1]。 回答结构: - 引言:解释DSP中断的重要性。 - 原理部分 - 应用部分 - 处理方法部分 - 结尾相关问题。 相关问题示例: 1. DSP中断的优先级如何处理? 2. 如何优化DSP中断响应时间? 3. DSP中断在实时系统中的应用案例? </think>### DSP中断的原理、应用及处理方法 数字信号处理器(DSP)的中断机制是其高效处理实时任务的核心特性,允许CPU异步响应外部或内部事件,从而优化系统性能。以下内容基于DSP中断系统通用原理,并结合引用[1]中的相关信息进行阐述。引用[1]提到中断事件在8.3节,并隐含在ADC SOC触发源等部分(如软件、EPWM、外部引脚触发)。下面我将逐步解析DSP中断的原理、应用及处理方法,确保回答结构清晰可靠。 #### 1. **DSP中断的原理** DSP中断的原理基于硬件和软件的协同工作:当特定事件(如定时器到期、ADC采样完成或外部信号)发生时,中断源发送请求,CPU暂停当前任务,保存上下文状态,跳转到中断服务程序(ISR)执行处理,最后恢复原任务。关键点包括: - **中断源**:多种事件可触发中断: - 内部事件:如定时器计数结束(如引用[1]中的CTR=APRD条件表示计数器达到周期值)。 - 外部事件:如ADC的SOC触发源(软件启动、EPWM信号或GPIO引脚输入)[^1]。 - **中断向量表**:每个中断源对应一个固定地址(中断向量),CPU据此加载ISR入口点。例如,ADC转换完成中断可能有专用向量位置。 - **优先级机制**:中断源可配置优先级(如高优先级中断可抢占低优先级),确保关键事件及时处理。 - **响应时间**:中断延迟通常涉及时钟周期计算,例如ADC采样速率为12.5MSPS时,中断响应必须在采样窗口内完成(引用[1]中采样窗时间可配置为1~16个ADC时钟周期)[^1]。 数学上,中断响应延迟可由公式表示: $$ t_{\text{response}} = t_{\text{save}} + t_{\text{ISR}} + t_{\text{restore}} $$ 其中 $t_{\text{save}}$ 是上下文保存时间,$t_{\text{ISR}}$ 是ISR执行时间,$t_{\text{restore}}$ 是恢复时间。这有助于分析实时性能。 #### 2. **DSP中断的应用** 中断DSP系统中广泛应用,主要用于实时事件处理和资源优化: - **ADC采样控制**:如引用[1]所述,ADC的SOC触发源(软件、EPWM或外部引脚)可配置为中断事件,实现自动采样。例如,ADC转换完成后触发中断,CPU读取结果寄存器(ADCRESULTn),避免轮询等待,提升效率[^1]。 - **通信与定时任务**:UART接收数据或PWM信号生成时,中断确保及时处理数据流或调整占空比。 - **DMA结合**:ADC转换结果支持DMA访问,中断可用于启动DMA传输,减少CPU开销(如大批量数据采集系统)[^1]。 - **实时系统应用**:在音频处理、电机控制(如EPWM中断调节电机速度)或传感器监控中,中断保证低延迟响应。 典型应用场景包括工业自动化和嵌入式系统,其中ADC同步采样(如引用[1]中的ADCINAx和ADCINBx同时采样)通过中断实现高效数据捕获[^1]。 #### 3. **DSP中断的处理方法** 处理DSP中断需软件配置和编程实践,步骤如下: 1. **初始化中断系统**: - 配置中断向量表:定义每个中断源的ISR入口地址。 - 使能中断:设置中断控制寄存器的使能位(如引用[1]中的“影子寄存器”装载条件:立即或CTR=APRD,用于定时器中断配置)[^1]。 - 设置优先级:分配中断优先级,以防冲突。 2. **编写中断服务程序(ISR)**: - ISR应短小高效,避免长时间阻塞。例如,ADC中断ISR仅读取ADCRESULTn寄存器并启动下次转换。 - 清除中断标志:在ISR末尾清除中断请求位,防止重复触发。 - 使用DMA集成:如引用[1]所述,ADC结果支持DMA,ISR可触发DMA传输,减轻CPU负载[^1]。 3. **调试与优化**: - 测量中断延迟:利用时钟计数器评估响应时间,确保满足实时需求(如ADC的12.5MSPS速率)。 - 错误处理:添加超时机制或错误中断(如ADC溢出),增强鲁棒性。 - 节能模式:在低功耗应用中,中断可唤醒DSP从休眠状态。 处理示例:在ADC连续转换模式下(引用[1]),中断用于每次转换完成时读取数据: ```c // 伪代码示例:ADC中断处理 void ADC_ISR(void) { volatile int result = *ADCRESULTn; // 读取转换结果 *ADC_INT_FLAG = 0; // 清除中断标志 if (result > THRESHOLD) { process_data(); // 处理数据 } } ``` 在此,ADC SOC触发源(如EPWM)启动转换,完成后触发中断[^1]。 #### 注意事项 - **可靠性**:中断嵌套需谨慎管理,避免优先级反转问题。 - **引用参考**:以上内容参考了ADC和中断事件细节(如SOC触发源和转换模式)[^1],但具体实现需查阅DSP型号手册(如TI C2000系列)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值