在中断里面,有这个函数,不太明白是怎么回事,于是网上找答案~原文是关于s3c44B0的,不过感觉都差不多吧~下面整理下~
ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采用中断比以往的查询方式占用更少的CPU时间,让系统提供更好性能。
查询S3C2410的手册,发现它有?(我不清楚有几种)种工作模式,每种工作模式是不一样的。其中最常用的,就是FIQ和IRQ模式。在使用中断之前,一定要初始化每种模式的栈指针SP,如果不初始化,肯定会出错。在CPU进行初始化时,就需要依次进入IRQ模式,初始化SP,接着再进入FIQ模式初始化SP。这样这两种模式,就可以使用了。然后再在断向表里,初始化IRQ的中断处理程序,这段代码就是用来根据不同中断位来调用不同的中断子程序。
对于使用C语言写的中断子程序,一定要加一些特定的修饰定义,否则C编译器不会生成适合中断模式下运行的程序。定义:void function(void) __attribute__ ((interrupt ("IRQ"))); //注意这里是2个下划线哦~
之后,就会生成合适的中断处理程序了。GCC就会编译成这样的代码:
sub lr, lr, #4 ;
stmdb sp!, {r0, r1, r2, r3, r4, ip, lr}
......
......
ldmia sp!, {r0, r1, r2, r3, r4, ip, pc}^
由于从IRQ模式返回到FIQ模式,就需要把LR减4,才是PC的指令。如果不加上面的中断修饰定义,就不会生成这样的代码,这样的函数就不能作来中断处理使用。然后通过嵌入式汇也是可以实现的。比如:
void foo(void)
{
asm volatile ( "sub lr, lr, #4" );
asm volatile ( "stmdb sp!, {r0, r1, r2, r3, r4, ip, lr}" );
......
......
asm volatile ( "ldmia sp!, {r0, r1, r2, r3, r4, ip, pc}" );
return;
}
通过查找GCC的帮助文档,下面的连接:
http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Function-Attributes.html,就可看到中断函数在GCC的里声明。
5.24 Declaring Attributes of Functions
In GNU C, you declare certain things about functions called in your program which help the compiler optimize function calls and check your code more carefully.
The keyword __attribute__ allows you to specify special attributes when making a declaration. This keyword is followed by an attribute specification inside double parentheses. The following attributes are currently defined for functions on all targets: noreturn, noinline, always_inline, pure, const, nothrow, sentinel, format, format_arg, no_instrument_function, section, constructor, destructor, used, unused, deprecated, weak, malloc, alias, warn_unused_result and nonnull. Several other attributes are defined for functions on particular target systems. Other attributes, including section are supported for variables declarations (see Variable Attributes) and for types (see Type Attributes).
You may also specify attributes with `__' preceding and following each keyword. This allows you to use them in header files without being concerned about a possible macro of the same name. For example, you may use __noreturn__ instead of noreturn.
See Attribute Syntax, for details of the exact syntax for using attributes.
然后再看看它的中断函数声明:
interrupt Use this attribute on the ARM, AVR, C4x, M32R/D and Xstormy16 ports to indicate that the specified function is an interrupt handler. The compiler will generate function entry and exit sequences suitable for use in an interrupt handler when this attribute is present.
Note, interrupt handlers for the m68k, H8/300, H8/300H, H8S, and SH processors can be specified via the interrupt_handler attribute.
Note, on the AVR, interrupts will be enabled inside the function.
Note, for the ARM, you can specify the kind of interrupt to be handled by adding an optional parameter to the interrupt attribute like this:
void f () __attribute__ ((interrupt ("IRQ")));
Permissible values for this parameter are: IRQ, FIQ, SWI, ABORT and UNDEF.
除了可以使用IRQ中断方式之外,还可以写FIQ,SWI,ABORT,UNDEF的中断处理函数。
上一篇:ARM常见移位指令
下一篇:s3c2410实时时钟(RTC)
推荐阅读最新更新时间:2024-03-16 15:22
设计资源 培训 开发板 精华推荐
- EEWORLD月度问答榜(第3期)
- 身临其境不足以窥全貌,《TI嵌入式产品研讨会》比现场更有料的小小书
- 有奖直播|魏德米勒 OMNIMATE® 联接技术的创新发展
- 【EEWORLD大学堂】玩转LaunchPad及TI MSP430G2XX系列超值单片机!!!
- 下载《TI MCU与无线连接技术研讨会讲座实录》抽奖赢好礼!
- 有奖直播:TI 低功耗 MCU 产品和 Zigbee 无线解决方案
- 免费领取 | 射频年度盛会EDI CON VIP全场通票(北京,3.20~22)
- 安世半导体新能源应用探索站,闯关赢好礼!
- 《美光2022台北国际电脑展主题演讲精选:数据中心专辑》,关注、评论赢固态硬盘等好礼!