打印

中断函数和主函数关系——有趣的问题

[复制链接]
6846|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chenzongxi|  楼主 | 2011-11-24 15:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
窗口看门狗实验,main函数没有while等死循环,也没有延时,就几条初始化语句,这样,窗口看门狗进不去中断,所以在一直复位,而在main函数中加上延时1s语句,就会进中断。


是不是main函数已经执行完了,但看门狗还没有递减到0x40这个下窗口。所以没进入中断,然后继续递减到0x3f,所以复位电路。
而加上延时函数,main函数还没结束,递减到0x40,进入中断。


是不是中断函数需要在主函数运行时才能触发?
沙发
airwill| | 2011-11-24 15:34 | 只看该作者
main 函数没有 while 死循环, 那么 main 指向完成, 返回到启动代码, 继续往下执行, 可能接下来发生的是非法地址或者非法指令...故障. 进而可能是硬故障,这些故障的优先级很高, 也都是死循环. 所以看门狗中断是轮不到执行了

使用特权

评论回复
板凳
chenzongxi|  楼主 | 2011-11-24 15:51 | 只看该作者
2# airwill


main 指向完成, 返回到启动代码, 继续往下执行, main函数执行完了,还能执行?
如果有循环,还能返回启动代码?

使用特权

评论回复
地板
airwill| | 2011-11-24 16:28 | 只看该作者
main() 是启动代码调用的, 完成后不是还返回启动代码去

使用特权

评论回复
5
billowtust| | 2011-11-24 16:59 | 只看该作者
main函数是由启动代码调用

启动代码有两种处理方式:
一种是循环调用main,也就是main退出后,会再次重复执行
二是直接限入软件陷阱,呈现死机状态

使用特权

评论回复
6
香水城| | 2011-11-24 21:41 | 只看该作者
LS两位已经说得很清楚了,LZ可以单步跟踪一下就知道是怎么回事了。

使用特权

评论回复
7
看我吴钩| | 2014-1-17 15:17 | 只看该作者
我彻底被这个编译器坑了,都是因为自己不熟悉。实验验证:如果不加while(1);循环,若中断发生后返回时,主程序main已经执行完了。那只有进系统异常fault吧!!死机!!!彻底玩完。我的一个稍大点的程序,一直在找原因,坑爹啊!!!用了整整一周才找到是这个bug!!

使用特权

评论回复
8
看我吴钩| | 2014-1-17 15:22 | 只看该作者
第一种情况:while(1)是一个死循环,就是让单片机一直执行while(1);或者执行中断程序。如果不加的话,程序会不断的复位执行main函数,这样中断就进不去了。死机!
第二种情况:在中断响应完之后要跳到主函数去执行,如果没有while(1);中断响应完之后就跳到main()函数的开头,复位,从头开始运行;有了while(1)的话中断响应完之后就跳到main()中while(1);处运行,这样就不会出错。
网上说的这两种情况,我认为要看不同单片机的不同的启动代码里面的设置

使用特权

评论回复
9
波板糖| | 2015-3-27 17:21 | 只看该作者
8楼赞一个一语道破真谛,楼上的同意给力

使用特权

评论回复
10
Vitality1| | 2015-3-28 10:52 | 只看该作者
前两位确实说得很清楚了

使用特权

评论回复
11
搞IT的| | 2015-3-29 10:48 | 只看该作者
这个问题挺有意思的啊,我也是被坑了。。

使用特权

评论回复
12
vigous1| | 2015-3-29 11:10 | 只看该作者
第一种情况:while(1)是一个死循环,就是让单片机一直执行while(1);或者执行中断程序。如果不加的话,程序会不断的复位执行main函数,这样中断就进不去了。死机!
第二种情况:在中断响应完之后要跳到主函数去执行,如果没有while(1);中断响应完之后就跳到main()函数的开头,复位,从头开始运行;有了while(1)的话中断响应完之后就跳到main()中while(1);处运行,这样就不会出错。
这说的很好

使用特权

评论回复
13
cowboy2014| | 2015-3-30 16:57 | 只看该作者
为啥不加入while循环呢?每次指向完成都返回到启动代码

使用特权

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

本版积分规则

0

主题

43

帖子

1

粉丝