关于__irq 的使用
__irq为一个标识,用来表示一个函数是否为中断函数。对于不同的编译器,__irq在函数名中的位置不一样,例如:
ADS编译器中: void __irq IRQ_Eint0(void);
Keil编译器中: void IRQ_Eint0(void) __irq;
但是其意义一样,它所完成的任务是标识该函数为中断函数,在编译器编译是调用此函数时,先保护函数入口现场,然后执行中断函数,函数执行完毕,恢复中断现场,这整个过程不需要用户重新编写代码来完成,由编译器自动完成。因而这也给不具备中断嵌套功能的ARM系统带来了问题,若使用 __irq 时有中断嵌套产生,这现场保护就会混乱。中断嵌套处理可以自己编写中断入口现场保护代码,并不使用 __irq 标识符号。(小呆:具体如何编写可以嵌套的中断这里暂时不做研究。
总结如下
1、若不想自己编写中断入口现场保护代码,而且使用中无中断嵌套,在中断函数中用 __irq 来标识我们的中断函数,否则出错;
2、若程序中要使用中断嵌套,对于无中断嵌套功能的ARM来说,一定要自己编写中断入口现场保护代码,而且不能用 __irq 标识我们的中断函数,否则出错。
__irq关键字
在ADS编译器中,“__irq”专门用来声明IRQ中断服务程序,如果用“__irq”来声明一个函数,那么该函数表示一个IRQ中断服务程序,编译器便会自动在该函数内部增加中断现场保护的代码。同样一个函数,如果将关键字“__irq”去掉,那么编译器便不会增加现场保护的代码,而只是作为一个普通函数来处理。
现在大家应该对“__irq”关键字有了一定的了解,那么,是不是所有的IRQ中断服务程序都需要使用“__irq”关键字声明呢?其实,这取决于获取“中断服务程序地址”的方法:
如果在执行中断服务函数之前没有对中断现场进行保护,那么中断服务函数必须要使用“__irq”关键字进行声明。例如,在0x0000 0018处执行指令“LDR PC, [PC, #-0xff0]”,此时对应的中断服务函数必须要使用“__irq”关键字进行声明;如果在执行中断服务函数之前已经对中断现场进行了保护,那么中断服务函数不能使用“__irq”关键字进行声明。
相关推荐
/sbin/set_irq_affinity eth1 可以进行中断绑定指定的cpu,提高网卡收包效率 把下面“eth1” 修改成对应的网卡名称 irq=$(cat /proc/interrupts | grep eth1 | cut -d':' -f 1); echo $irq for i in $irq ; do sudo...
early_irq_init() 函数是 IRQ subsystem 的早期初始化函数,负责初始化 IRQ subsystem 的基本数据结构。该函数主要完成以下任务: * 初始化 IRQ subsystem 的基本数据结构。 * 初始化 IRQ 的默认亲和力。 * 探测...
Crypto_30_vHsm_Irq
Keil μVision是Keil公司开发的一款广泛使用的嵌入式开发工具,支持多种微控制器和处理器。在这里,S32K144的开发工作就是在Keil环境下进行的。通过Keil,开发者可以编写、编译、调试代码,并且可以直接运行和测试...
"Vector-IRQ-interrupt.rar"这个压缩包文件,显然包含了关于单片机向量IRQ中断的学习资料,这对于初学者来说是一份非常实用的教程。向量IRQ中断是中断处理的一种高效方式,相比非向量中断,它提供了更精确的中断服务...
- **中断屏蔽**:使用`local_irq_save(flags)`保存当前的中断标志寄存器,这在修改硬件配置时非常必要,可以防止中断在配置过程中发生,导致不可预知的行为。 ##### 2.2 配置定时器中断向量 ``` legacy_pic->mask...
在标题"irq.rar_Linux gpio irq"中,我们可以推断出这是一个关于Linux GPIO中断处理的资源包,其中可能包含了相关的代码示例、文档或配置文件。在描述中提到"在am3354下验证通过",这意味着这些资料是针对TI公司AM...
本文将深入探讨"IRQ.zip_interrupts_irq_飞思卡尔_飞思卡尔单片机"这一主题,重点是飞思卡尔单片机上的中断(IRQ)处理及其在实际应用中的实现。 中断在微控制器中的角色: 中断是一种硬件机制,当系统中的某个事件...
`irq_work`机制的使用场景通常涉及硬件驱动程序,比如网络接口控制器(NIC)接收数据包时,如果数据包处理需要复杂的逻辑,就可以利用`irq_work`来延后处理。这样,硬中断处理程序可以快速返回,处理下一个中断,而...
- **嵌入式设备开发**:在开发基于Atmel AT91的嵌入式系统时,需要正确配置和使用这个驱动来确保硬件中断功能正常工作。 - **设备驱动开发**:对于其他依赖中断的设备驱动,如定时器、串口、网络接口等,都需要与AIC...
标题中的"save-value-when-voltage-drop-.rar_DZ60_DZ60 IRQ_DZ60 LCD_drop_"揭示了这个压缩包文件的主要内容是关于飞思卡尔(Freescale,现已被NXP收购)DZ60芯片的一个功能实现,即在电压下降时保存关键参数的代码...
标题 "17-STM32F429_nRF24L01P_TRANSMITTER_IRQ.7z" 暗示了这是一个关于使用STM32F429微控制器和nRF24L01P无线收发器进行中断驱动传输的项目。STM32F429是一款高性能的32位Arm Cortex-M4微控制器,广泛应用于嵌入式...
7. **中断释放**:当不再需要中断服务时,使用`free_irq()`释放资源。 综上所述,这个压缩包可能包含了9260设备的驱动源代码,特别是与push button中断处理相关的部分,比如初始化、中断注册、ISR实现以及中断清理...
标题“test_3_irq_led.rar_中断驱动LED”暗示了这是一个关于中断机制与LED控制的项目,而描述则提到了在Keil环境下,通过定时器中断实现对LM3S1601微控制器LED灯的控制。 首先,我们需要了解中断驱动的基本概念。...
"IRQ.zip_单片机IRQ_单片机IRQ中断"是一个针对单片机中断处理的学习资料压缩包,特别适合于单片机和飞思卡尔微控制器的教学和自我学习。 在单片机中,中断是处理器暂停当前任务并响应外部或内部事件的一种机制。...
int WINAPI sio_cnt_irq(int port, VOID (CALLBACK *func)(int port), int count); int WINAPI sio_modem_irq(int port, VOID (CALLBACK *func)(int port)); int WINAPI sio_break_irq(int port, VOID (CALLBACK *...
通过以上分析,我们可以看到在UCOS-II中,OS_CPU_IRQ_ISR的移植涉及到对CPU工作模式的理解、中断处理流程的掌握、寄存器的保存与恢复、中断嵌套的管理以及中断服务函数的调用。在移植过程中,开发者需要特别关注ARM...
例如,它会调用`platform_driver_register()`来注册驱动,并使用`platform_device_add_resources()`和`platform_device_register()`来添加设备资源和初始化设备。 2. 设备驱动(Device Driver): 设备驱动则更...
desc->status &= ~(IRQ_DISABLED | IRQ_AUTODETECT | IRQ_WAITING | IRQ_INPROGRESS); desc->handler->startup(irq); } return 0; } ``` - **关键步骤**: 1. 检查当前中断是否已经被其他设备使用。 2. 如果...
总结,"toggle_irq.rar"压缩包提供了一个关于EM6819单片机使用IRQ中断的实例,配合RIDE C816编译器,可以帮助学习者掌握中断的基本概念、设置方法以及中断服务例程的编写。通过实践这样的例子,可以进一步巩固对中断...