关于__irq 的使用
2014-01-26 15:59
344 查看
关于__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”关键字进行声明。 |
相关文章推荐
- Qt关于dll的生成和使用(Qt C++ li…
- 关于如何在startup时 使用spfile
- [iOS常见问题] 关于使用QQ做…
- Qt关于dll的生成和使用(Qt C++ li…
- 关于python使用One Class&nbs…
- 关于使用Android NDK编译ffmpeg
- 关于网卡及MAC和PHY的区别 ,ARP
- 使用StringBuilder, StringBuilder…
- 关于"使用注册为 allowDefinition='MachineToApplication' 的节是错误的"的解决方案
- 关于Time Drift Detecte…
- PHP ExcelReader使用详解(图文)
- iOS学习之iOS5.0以上 使用新…
- 关于__irq 的使用
- 关于Column '*' not found 解决方案 Hibernate使用SQL查询返回实体类型,即返回某个类,或实体类
- Adobe Flex学习笔记(14)- 使用摄…
- XML 问题: 超越DOM(轻松使用 DOM 的技巧和诀窍)
- linux Crontab 使用
- Kettle 使用备忘录 4- 远程执行job…
- Amazon ec2 使用几个需要主要的地…
- 关于error inflating class