在路上__Online的笔记 https://bbs.21ic.com/?472483 [收藏] [复制] [RSS]

日志

几个中断函数写法的比较(ZZ)

已有 2354 次阅读2007-10-31 09:21 |个人分类:C51编程|系统分类:单片机| 中断函数

写单片机程序,中断是免不了的。我比较喜欢用C写单片机程序,简单而且可读性高,当然程序效率没有汇编的高。目前写过51单片机跟AVR单片机的C程序,最近在看MSP430的书。用C写不同的单片机程序其实都是大同小异,因此能对不熟悉的单片机也能很快上手写程序。不过中断函数的写法,各个编译器往往都会有些差别。

       最早写的C程序是51单片机的,用的编译器自然是大名鼎鼎的keil c了。Keil的功能还是非常强劲的,不仅能编译,还有软件仿真调试与硬件调试的功能。由于条件简陋,没用过什么仿真器,一直都是靠软件仿真调试程序的。Keil 中的中断函数一般格式如下:


       void 函数名() interrupt n using n


       {


              …….


       }


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


       后然接触到AVR的单片机,该单片机开发环境一般用ICC或者是GCC。由于ICC是商用软件,而GCC是免费的,因此我一般用GCC来写AVRC程序。现在版本的GCC for AVR有了一些改进,对于中断函数支持两种关键字ISRSIGNAL,其格式如下:


       ISR(vect)


       {


              ………


       }



SIGNAL(vect)


{


       ……..


}


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


最近在看TIMSP430系列单片机的资料,看到该单片机采用C430写的中断服务函数有点像前两种的综合,其格式如下:


interrupt [vect] void 函数名(void)


{


       …….


}


其中vect也是中断向量名,函数名可以任取。


比较这几种中断函数写法,本人更倾向于AVRGCC的写法。首先对于中断函数来说即不能有输入参数又没有返回值,没必要再给它加个“void 函数名(void)”的形式的函数。而且光看中断向量名一般都能知道是哪个中断源产生,再写个中断函数名作解释似乎有点重复。对于keil c用中断向量号的形式来表示中断源,感觉有点麻烦,记住中断源的中断号比记中断向量要难多了。不过可能标准51的中断缘比较少,而且keil应该出来的比较早,所以才会采用这种方式。


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)