<script type="text/javascript"><!--google_ad_client = "pub-2132256014190581";/* 728x15, 创建于 09-4-3 */google_ad_slot = "3979913520";google_ad_width = 728;google_ad_height = 15;// --></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>
关于__irq使用,首先看ARM公司的说明:
ARM 编译器 armcc 支持的函数关键字和运算符。
ARM 编译器支持的关键字扩展表:
关键字 |
||
---|---|---|
__align |
__int64 |
__svc |
<script type="text/javascript"><!--google_ad_client = "pub-2132256014190581";/* 728x90, 创建于 09-1-12 */google_ad_slot = "2911234755";google_ad_width = 728;google_ad_height = 90;// --></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>__ALIGNOF__
|
__INTADDR__ |
__svc_indirect |
__asm |
__irq |
__svc_indirect_r7 |
__declspec |
__packed |
__value_in_regs |
__forceinline |
__pure |
__weak |
__global_reg |
__softfp |
__writeonly |
__inline |
__smc |
|
通过使用 __irq 关键字,可以将 C 或 C++ 函数用作中断例程。
__irq 是一个函数限定符。 它影响函数的类型。
armcc的编译器的C对ANSI C的关键字做了些扩展。
比如__irq 是用来声明IRQ和FIQ中断处理函数用的,可以自动返回原来的现场。__asm用来嵌入汇编代码等。
<script type="text/javascript"><!--google_ad_client = "pub-2132256014190581";/* 728x90, 创建于 09-1-12 */google_ad_slot = "2911234755";google_ad_width = 728;google_ad_height = 90;// --></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>
__irq为一个标识,用来表示一个函数是否为中断函数。对于不同的编译器,__irq在函数名中的位置不一样,例如:
ADS编译器中 : void __irq IRQ_Eint0(void);
Keil编译器中 : void IRQ_Eint0(void) __irq;
但是其意义一样,它所完成的任务是标识该函数为中断函数,在编译器编译是调用此函数时,先保护函数入口现场,然后执行中断函数,函数执行完毕,恢复中断现场,这整个过程不需要用户重新编写代码来完成,由编译器自动完成。因而这也给不具备中断嵌套功能的ARM系统带来了问题,若使用 __irq 时有中断嵌套产生,这现场保护就会混乱。因此自己编写中断入口现场保护代码,并不使用 __irq 标识符号,就是这个原因。
总结如下:
1、若不想自己编写中断入口现场保护代码,而且使用中无中断嵌套,在中断函数中用 __irq 来标识我们的中断函数,否则出错;
2、若程序中要使用中断嵌套,对于无中断嵌套功能的ARM来说,一定要自己编写中断入口现场保护代码,而且不能用 __irq 标识我们的中断函数,否则出错。
参考网址:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0348ac/BABICJBC.html
http://blog.21ic.com/user1/3572/archives/2007/34803.html
<script type="text/javascript"><!--google_ad_client = "pub-2132256014190581";/* 728x90, 创建于 09-1-12 */google_ad_slot = "2911234755";google_ad_width = 728;google_ad_height = 90;// --></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>