打印

求助51单片机 定时器中断子程序的问题

[复制链接]
1951|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wu221314|  楼主 | 2013-8-30 09:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我是新手忘高手指点,定时器中断子程序为什么不需要在主函数前声明呢?
在模块化编程后,将定时器初始化程序和定时器中断子程序封装后,在主函数中把该头文件包含进去,应用的时候,为什么仅仅将定时器初始化程序写入主函数内即可实现中断子程序与主函数的链接?
将定时器初始化程序和定时器中断子程序封装时,头文件中为什么不用对定时器中断子程序进行声明?

内心貌似知道是约定俗成的东西,但是还感觉矛盾,没有理论支撑,不踏实,求解答!!!!

相关帖子

沙发
minier| | 2013-8-30 15:44 | 只看该作者
中断函数基于中断向量自动调用,自然不用声明

使用特权

评论回复
板凳
散装805| | 2013-8-30 16:29 | 只看该作者
你随便写个函数,在main里不调用他,还用声明不?

使用特权

评论回复
地板
dirtwillfly| | 2013-8-30 21:29 | 只看该作者
中断函数的入口地址是固定的,不用再次声明告诉编译器

使用特权

评论回复
5
sedatefire| | 2013-8-31 17:47 | 只看该作者
51编译器透过 interrupt x   /* x表示编号 */
知道这个函数就是中断服务程序,同时知道它是第几个中断。
在链接的时候,自然把该函数的入口地址,加载在中断向量表中的对应项里面。

mcu的定时中断一产生,直接就跳转过去了。

你载一个STM32的库,看看里面的启动汇编档,就明白了。那边的架构就直接靠函数名链接,没有interrupt关键字。
51的starup.a51里面体现不明显。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
wu221314 + 1 谢谢
6
江枫渔火| | 2013-8-31 19:29 | 只看该作者
因为呀,你在写中断处理函数的时候,已经用了特殊的关键字来告诉编译器,这个函数是中断函数,所以就特殊处理了~

必须用特殊关键字 指定这个函数,这样编译器才会在你不知道的背后,做些额外处理,比如压栈,出栈,如果你用汇编来写,这些都要你自己做,但既然用C语言了,这些操作又是比较通用的,所以编译器就会自动给你做了。

同时,编译器会自动建立起中断向量的联系,让中断发生时能跳转到你的中断处理函数执行。

这种方式在51,arm7,430都有使用 ,不同开发软件使用的关键字可能不同,语法也可能不同,但目的和作用基本相同。

但在m3,m0中,中断向量在启动文件中定义了,不需要什么关键字申明函数。只要编写一个相同的函数名函数覆盖启动文件中对应硬件中断的函数即可,有一种称为弱定义的 汇编关键字,启动文件中定义的向量入口都是弱定义的,也就是说:只要外面你再定义了一个同名的函数,就会使用你定义的函数,而不是使用原来默认的函数。

使用特权

评论回复
7
sedatefire| | 2013-8-31 19:35 | 只看该作者
江枫渔火 发表于 2013-8-31 19:29
因为呀,你在写中断处理函数的时候,已经用了特殊的关键字来告诉编译器,这个函数是中断函数,所以就特殊处 ...

你来迟了,哈

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

4

帖子

0

粉丝