×
嵌入式 > 技术百科 > 详情

不同编译器中断函数的表示方法

发布时间:2020-06-04 发布时间:
|
 1.keil对51单片机的中断函数表示:

 void 函数名() interrupt n using n
       {
              …….
       }

       其中函数名可以任意取,关键字interrupt用来指明这是一个中断服务函数,后面的n表示中断号,关键字using加后面的n表示使用哪一组寄存器。

2. GCC for AVR,对于中断函数支持两种关键字ISR与SIGNAL,其格式如下:
       ISR(vect)
       {
              ………
       }

SIGNAL(vect)
{
       ……..
}
其中的vect就是中断向量名,根据不同的型号的AVR单片机的不同的中断源都会有相对应的中断向量名,比如外部中断0对于ISR格式的中断向量名为INT0_vect,对SIGNAL则为SIG_INTERRUPT0。

3.IAR C430 for MSP430

interrupt [vect] void 函数名(void)
{
       …….
}
其中vect也是中断向量名,函数名可以任取。

4.IAR for AVR

 在IAR编译器里用关键字来__interrupt来定义一个中断函数。用#pragma vector来提供中断函数的入口地址
#pragma vector=0x12//定时器0溢出中断入口地址
__interrupt void time0(void)
{
;
}
    上面的入口地址写成#pragma vector=TIMER0_OVF_vect更直观,每种中断的入口地址在头文件里有描述。函数名称time0可以为任意名称。中断函数会自动保护局部变量,但不会保护全局变量。

在IAR for SAMSUNG s3c9234中中断函数只有一个入口0x00,中断的优先级有软件来定。
#pragma vector=0x00
__interrupt void itp(void)
{
    if(MARCO_READ_TIMER_PEND)     //读相应中断标志位
     {
         MARCO_CLEAR_TIMER_PEND; //清相应的中断标志位
           .....
    }
    if(MARCO_READ_WATCHTIMER_PEND)
   {
         MARCO_CLEAR_WATCHTIMER_PEND;

         .....
   }

  .....

}
5.ICC for AVR

#pragma interrupt_handler timer0_ovf_isr:iv_TIMER0_OVF   
void timer0_ovf_isr(void)
{
 TCNT0 = 0x00 /*INVALID SETTING*/; //reload counter value
}

6.AVR GCC for AVR

由于C语言设计目标为硬件无关,因此各种编译器在处理中断时使用的方法都是编译器设计者自己的方法。
在AVR-GCC环境里,向量表已经预先定义,并指向具有预定义名称的中断例程。通过使用合适的名称,用户例程就可以由相应的中断所调用。如果用户没有定义自己的中断例程,则器件库的缺省例程被加入。
除了中断向量表的问题,编译器还必须处理相关寄存器保护的问题。中断API解决了细节问题。用户只要将中断例程定义为INTERRUPT()或SIGAL()即可。而对于用户没有定义的中断,缺省例程的处理是reti指令。
函数定义可参见interrupt.h,中断信号符号表参见sig-avr.h。
6.1 cli
用法:void cli(void);
说明:通过置位全局中断屏蔽位来禁止中断。其编译结果仅为一条汇编指令。
6.2 enable_external_int
用法:void enable_external_int(uint8_t ints);
说明:此函数访问GIMSK寄存器(对于MEGA器件则是EIMSK寄存器)。功能与宏outp()一样。
6.3 INTERRUPT
用法:INTERRUPT(signame)
说明:定义中断源signame对应的中断例程。在执行时,全局屏蔽位将清零,其他中断被使能。ADC结束中断例程的例子如下所示:
INTERRUPT(SIG_ADC)
{
}
6.4 sei
用法:void sei(void);
说明:通过清零全局中断屏蔽位来使能中断。其编译结果仅为一条汇编指令。
6.5 SIGNAL
用法:SIGNAL(signame)
说明:定义中断源signame对应的中断例程。在执行时,全局屏蔽位保持置位,其他中断被禁止。ADC结束中断例程的例子如下所示:
SIGNAL(SIG_ADC)
{
}
6.6 timer_enable_int
用法:void timer_enable_int(uint8_t ints);
说明:此函数操作TIMSK寄存器。也可以通过outp()来设置。

 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
实时控制.安全.如何加速实现未来工厂落地?