单片机
返回首页

s3c2410 __attribute__ ((interrupt ("IRQ")))

2016-11-25 来源:eefocus

        在中断里面,有这个函数,不太明白是怎么回事,于是网上找答案~原文是关于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的中断处理函数。


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • 短波AM发射器电路设计图

  • 开关电源的基本组成及工作原理

  • 用NE555制作定时器

  • 带有短路保护系统的5V直流稳压电源电路图

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章