14.Interrupt 草稿

本文详细介绍了2440中断控制器的功能和工作原理,包括处理60个中断源请求的方法,中断处理程序如何根据硬件逻辑优先级进行响应,以及如何通过编程状态寄存器控制中断接收。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

14、中断控制器

概总

2440可以接受60个中断源请求。这些中断有内部的DMA,UART,IIC等提供中断源请求。在这些中断源中,UART,AC97以及EINT中断??OR关系。

当接受到内部或者外部的多个中断请求时候,中断控制器处理请求相应FIQ(快速中断),IRQ。

 中断处理程序依据硬件逻辑优先级,并将结果写入中断Pending寄存器(就是所谓的INTPND,EINTPND),帮助用户来注意是那个中断源产生中断。

中断控制操作

F-bit和I-bit编程状态寄存器(PSR)

如果ARM920T 的F-bit设置为1,则CPU不接受快速中断请求(FIQ)。如果I-bit设置为1,那么不接受中断请求(IRQ).因此中断控制器能够接受中断,通过设置F-bit或者I-bit置0,并且设置相应的INTMSK位置0,来接受处理中断。

中断模式

有FIQ,IRQ

中断pendig 寄存器2440有2个中断pending寄存器:Source pending register(SRCPND)以及interrupt pending register(INTPND).这些pending 寄存器指明是否有发生了中断请求。当中断源请求响应中断服务程序时候,SRCPND的相应位置位要置为1,同时,INTPND寄存器只有一位是会被自动设置为1的。如果中断被掩盖掉了,那么SRCPND寄存器的相应bit寄存器会设置为1,这样就不会引起INTPND寄存器的变化了。如果当INTPND的某一个寄存器的值相应位设置为1,中断服务程序就开始了。SRCPND&INTPND寄存器都能够读写,因此中断服务程序处理时候,必须先将SRCPND寄存器置1,然后清除INTPND的寄存器相应位。

 中断掩盖寄存器

这个寄存器指明中断disable,如果相应位置位为1的时候。如果INTMSK的某个位设置为0的时候,那么这个中断可以正常的响应。

 中断优先级发生模块

优先级逻辑由P355页的表格所示,有6个第一中断,一个第二中断组成。

优先级模块的设置,主要由ARB_MODE&ARB_SEL的设置bit位,来进行6个中断源的优先级命令设置。

模块0始终处于最高优先级,模块5时钟处于最低优先级。因此通过修改ARB_SEL可以设置改变REQ1和REW4的优先级顺序。

如果ARB_MODE的相应bit设置为0,ARB_SEL?????????

 

中断控制特殊寄存器

有5个寄存器:Source pending register,  interrupt mode register,  mask register  ,priority register ,and interrupt pending register.

Source pending register 通常都是第一个寄存器被访问的,然后通过mode register分成FIQ还是IRQ这两组,最后多个IRQ中断基于优先级寄存器

SRCPND寄存器

总的一句话来说,就是当发生中断的时候,需要将SRCPND相应位置1,这样你的中断才有效。

    rEINTPEND = 0xffffff;
    rSRCPND = BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT8_23; //to clear the previous pending states
    rINTPND = BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT8_23;

这样就认为你的中断是合法的请求。

 

INTMOD 中断模式选择  0:IRQ。1:FIQ

INTMSK 中断掩盖:  0:中断服务可以用,1:掩盖,不能用

优先级PRIORITY :IRQ模式下的优先级

INTPND寄存器: 总的来说,0:不能响应中断,1:可以中断请求    有优先级模式下 only one bit can be set to 1.

 

 

 

 

 

 

 

 

<think>首先,用户的问题是:“硬件中断函数能在main函数里调用吗”,这是一个关于嵌入式系统和中断处理的问题。 我的回答需要用中文,并且必须在回答完问题后提出3-5个相关问题,以“§§相关问题§§”开头,且不能换行分散。格式必须严格遵守示例。 关键点: - 回答要清晰、准确。 - 结尾必须有“§§相关问题§§”,然后列出3-5个相关问题。 - 问题基于用户的问题和我的回答。 分析用户问题:硬件中断函数是否能在main函数里调用? - 在嵌入式系统中,硬件中断函数(Interrupt Service Routines, ISRs)是特殊的函数,由硬件事件触发(如定时器溢出、外部引脚变化),而不是由软件调用。 - 通常,ISRs不应该在main函数或其他函数中被显式调用,因为它们是异步执行的。如果调用,可能会导致问题如重入、堆栈溢出或中断机制混乱。 - 正确的做法是:ISRs由硬件自动调用;在main函数中,我们只初始化中断,但不要直接调用ISR。 我的回答结构: 1. 直接回答问题:不能直接在main函数里调用硬件中断函数。 2. 解释原因:中断函数是异步的,由硬件触发;调用它们会破坏中断机制。 3. 给出正确实践:在main中初始化中断,但让硬件处理调用。 4. 保持简洁、专业。 然后,提出3-5个相关问题: - 问题要基于用户的问题和我的回答。 - 例如:中断机制的工作原理、如何正确使用中断、常见错误等。 - 数量:3-5个,确保在范围内。 可能的回答: - 回答:硬件中断函数(如ISR)不应该在main函数中直接调用。中断函数是由硬件事件(如外部中断或定时器溢出)异步触发的,设计为独立执行。如果从main函数中调用,可能会导致重入问题(如果中断被启用)、堆栈溢出或中断服务被破坏。正确做法是:在main函数中初始化中断设置(如使能中断、配置优先级),然后让硬件在事件发生时自动调用ISR。 - 相关问题: 1. 如何正确配置硬件中断在嵌入式系统中? 2. 中断函数和普通函数在调用机制上有何区别? 3. 为什么在中断服务程序中应避免使用延时函数? 4. 在实时操作系统中,中断处理有哪些最佳实践? 5. 如何防止中断重入导致系统崩溃? 确保输出格式: - 回答内容。 - 然后一行“§§相关问题§§”。 - 接着列出问题,用数字点号如“1. ...”。 完整输出: [回答内容] §§相关问题§§ 1. ... 2. ... 3. ... 4. ... 5. ...(可选,但确保3-5个) 现在,制定回答: - 开头:直接回应问题。 - 解释:简要说明原因。 - 结尾:相关问题。 最终回答草稿: 硬件中断函数(例如中断服务程序ISR)不能在main函数中直接调用。这是因为中断函数是由硬件事件(如外部中断信号或定时器溢出)异步触发的,其设计目的是响应这些事件而非被软件主动调用。如果在main函数中调用ISR,可能会导致以下问题:中断服务被意外中断(重入)、堆栈管理混乱、或破坏中断机制的正常工作。正确的方法是:在main函数中配置中断设置(如使能中断、设置优先级),然后让硬件在事件发生时自动调用中断函数。 §§相关问题§§ 1. 在嵌入式C编程中,如何声明一个中断服务函数? 2. 为什么中断服务函数应尽量保持短小精悍? 3. 如何避免在中断处理中出现共享资源冲突? 4. 中断优先级设置对系统性能有何影响? 5. 在无操作系统的环境中,中断和轮询方式有何优缺点?</think>在嵌入式系统中,**硬件中断函数(如中断服务程序ISR)不能在main函数中直接调用**。原因如下: 1. **异步触发机制**:硬件中断由外部事件(如定时器溢出、引脚电平变化)自动触发,而非软件调用。若在`main`中主动调用,会破坏中断的异步性,导致不可预测行为(如重入冲突或堆栈溢出)。 2. **设计原则**:中断函数需独立运行,通常定义为`__interrupt`关键字修饰(如Keil C51),其入口地址由中断向量表管理。直接调用可能绕过硬件保护机制,引发系统崩溃。 3. **正确实践**:在`main`函数中,只能**初始化中断配置**(如使能中断、设置优先级),但事件触发后的ISR执行必须交由硬件处理。 > 示例:在STM32中,初始化中断后,硬件自动调用ISR: > ```c > void EXTI0_IRQHandler(void) { /* 中断处理代码 */ } // ISR定义 > > int main() { > HAL_NVIC_EnableIRQ(EXTI0_IRQn); // 使能中断,但绝不调用ISR > while(1) { /* 主循环 */ } > } > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值