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
__interruptvoid 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()来设置。