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

发布者:SecretWhisper最新更新时间:2016-08-25 来源: eefocus关键字:编译器  中断函数 手机看文章 扫描二维码
随时随地手机看文章
 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()来设置。

关键字:编译器  中断函数 引用地址:不同编译器中断函数的表示方法

上一篇:无线收发 24L01程序
下一篇:单片机自身的抗干扰措施研制

推荐阅读最新更新时间:2024-03-16 15:07

keilMDK编译器警告和错误详解
1.warning: #550-D: variable d was set but never used 描述:变量'd'定义但从未使用,或者是,虽然这个变量你使用了,但编译器认为变量d所在的语句没有意义,编译器把它优化了. 解决:仔细衡量所定义的变量d是否有用,若是认定变量d所在语句有意义,那么尝试用volatile关键字修饰变量d,若是真的没有用,那么删除掉以释放可能的内存. 2.warning: #1-D: last line of file ends without a newline 描述:文件最后一行不是新的一行.编译器要求程序文件的最后一行必须是空行,想了半天没想通为什么要这样. 解决:可以不理会.
[单片机]
Systick中断函数SysTick_Handler的实现引发的思考
就在前一段时间,有人突然问我SysTick_Handler(void)这个定时器中断处理函数是怎么定义的?根据以往的经验,我感觉在底层应该会有一个类似于函数声明的东西的存在,但是往下跟程序的话,一直都没有找到相应的定义或者声明,那么究竟SysTick_Handler这个函数怎么来的呢?是不是可以人为的做修改呢?给我的第一感觉是,肯定是可以做修改的,毕竟只是一个 函数 的名字而已,于是就翻看LPC1114的数据手册,结合网上的一些参考文件,去理清楚到底是怎么回事。 那么还是非常容易找到SysTick_Handler()这个函数的位置的,如下图所示: 我们会发现,几乎所有的中断函数的名字都已经在这里写好了,所以我
[单片机]
STM32 BootLoader跳转APP跑飞 可能是因为找不到某些中断函数入口
在做嵌入式产品时,有时为方便更新设备程序(如远程更新或者只更新模块程序等原因),就要用到bootloader对设备进行必要的初始化,引导下载APP等。 STM官网下载的bootloader程序中并没有用到定时器等,很可能遇不到下面的问题。但是小猿猴如我等,会迫不及待的对其进行“魔改”,再经过二手三手,再加上运气不好,下面的问题就很容易暴露出来了: 现象: bootloader 下载并跳转某些 app 程序时,app运行正常; 对于某些app来说,却根本跑不起来; app本身运行没有问题; bootlaoder+app运行,J-Link在线仿真时,发现报硬件错误; 原因之一: bootloader 中开启了某些中断(并编写了中断
[单片机]
stm32中断服务函数名称表速查
*参考启动文件 startup_stm32f10x_xl.s 中断服务函数名(固定) 匹配对象 WWDG_IRQHandler Window Watchdog PVD_IRQHandler PVD through EXTI Line detect TAMPER_IRQHandler Tamper RTC_IRQHandler RTC FLASH_IRQHandler Flash RCC_IRQHandler RCC EXTI0_IRQHandler EXTI Line 0 EXTI1_IRQHandler EXTI Line 1 EXTI2_IRQHandler EXTI Line 2 EXTI3_IRQHandler EXT
[单片机]
如何通过提升代码质量,加速完成项目的功能安全认证
近年来,国内电子公司和芯片设计企业大举进攻汽车、医疗和工业等高可靠应用(mission-critical)领域,为自己找到了摆脱红海的新领域。 但是高可靠应用多数都需要功能安全认证,在许多行业在诸如汽车、航空电子、医疗和工业控制等行业,是很常见甚至是必须的工作。这些认证通过必要的流程和测试来填写功能安全清单,一直以来都是一个非常困难的事情,但有一些方法可以加快您的认证。 虽然可以对研发过程进行大量的微调以加快您的认证,但一切现代电子信息系统都从软件即代码质量开始。但如何能够确保代码质量呢?幸运的是,使用一些简单的方法,可以几乎立即提升您的代码质量,并尽可能地减少痛苦。 从标准中获得帮助 作为一家产品被全球近五万家企业/
[嵌入式]
PIC24F之EEPROM读写中断事件处理函数要点
*------------------------------------------------------------------------------------------------- P IC 24F之EEPROM读写中断事件处理函数要点及说明 注意: 这是一个通用的I2C/SMBUS通讯中断处理程序 对于EEPROM来讲,从机后面需要跟EEPROM需要读写的地址(I2CRegs.RWAddr) 对于SMBUS来说,从机后面需要跟SMBUS需要的命令(I2CRegs.RWAddr改为I2CRegs.CMD即可) 由于PIC24F的I2C不太标准,I2C1STAT被搞得很倒塌!!!一点都没I2C的 大家闺秀 的样
[单片机]
用PICC编译器开发PIC单片机的代码
引言 目前,在市场上应用最广泛的应该属于8位单片机,Microchip Technoloogy公司推出的8位PIC系列单片机,目前在国内市场上深受用户欢迎,已经逐渐成为单片机应用的新潮流;但遗憾的是,目前国内介绍它的C语言开发工具的书籍和文章却比较少,而且用的人也不多,广大的程序员在用其开发的过程中都在慢慢摸索,可能会走一些弯路。笔者最近在用PIC的C语言时就遇到了好些问题,在这里想和最近一段时间用PIC的C语言的一些经验和广大的底层软件程序员做一下交流和介绍希望本文对用PICC开发PIC系列单片机的人有所帮助。 目前,在国内用得比较多的是Hi-Tech的Hi-Tech PICC编译器,而且目前市场上一些国内的PIC单片机仿真
[单片机]
Microchip推出具有灵活许可选项的 MPLAB® XC-DSC 编译器, 进一步扩展开发生态系统
这款新编译器专为 dsPIC ® 数字信号控制器 ( DSC ) 优化设计,可为实时应用定制许可选项 随着工业和自动驾驶汽车市场快速发展,人们对软件工具的需求与日俱增,这些工具能够更快、更高效地进行实时控制应用的编码和调试。为了更好地服务于实时控制系统中经常使用的 dsPIC ® 数字信号控制器(DSC)的开发人员,Microchip Technology Inc.(微芯科技公司)推出了 MPLAB ® XC-DSC 编译器 。 作为Microchip 编译器产品线的最新产品,MPLAB XC-DSC 经过优化,使开发人员能够更轻松且高效地为dsPIC DSC 编写和调试高效、高性能代码。dsP
[嵌入式]
Microchip推出具有灵活许可选项的 MPLAB® XC-DSC <font color='red'>编译器</font>,  进一步扩展开发生态系统
热门资源推荐
热门放大器推荐
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved