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

[复制链接]
 楼主| 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() 是启动代码调用的, 完成后不是还返回启动代码去
billowtust 发表于 2011-11-24 16:59 | 显示全部楼层
main函数是由启动代码调用

启动代码有两种处理方式:
一种是循环调用main,也就是main退出后,会再次重复执行
二是直接限入软件陷阱,呈现死机状态
香水城 发表于 2011-11-24 21:41 | 显示全部楼层
LS两位已经说得很清楚了,LZ可以单步跟踪一下就知道是怎么回事了。
看我吴钩 发表于 2014-1-17 15:17 | 显示全部楼层
我彻底被这个编译器坑了,都是因为自己不熟悉。实验验证:如果不加while(1);循环,若中断发生后返回时,主程序main已经执行完了。那只有进系统异常fault吧!!死机!!!彻底玩完。我的一个稍大点的程序,一直在找原因,坑爹啊!!!用了整整一周才找到是这个bug!!
看我吴钩 发表于 2014-1-17 15:22 | 显示全部楼层
第一种情况:while(1)是一个死循环,就是让单片机一直执行while(1);或者执行中断程序。如果不加的话,程序会不断的复位执行main函数,这样中断就进不去了。死机!
第二种情况:在中断响应完之后要跳到主函数去执行,如果没有while(1);中断响应完之后就跳到main()函数的开头,复位,从头开始运行;有了while(1)的话中断响应完之后就跳到main()中while(1);处运行,这样就不会出错。
网上说的这两种情况,我认为要看不同单片机的不同的启动代码里面的设置
波板糖 发表于 2015-3-27 17:21 | 显示全部楼层
8楼赞一个一语道破真谛,楼上的同意给力
Vitality1 发表于 2015-3-28 10:52 | 显示全部楼层
前两位确实说得很清楚了
搞IT的 发表于 2015-3-29 10:48 | 显示全部楼层
这个问题挺有意思的啊,我也是被坑了。。
vigous1 发表于 2015-3-29 11:10 | 显示全部楼层
第一种情况:while(1)是一个死循环,就是让单片机一直执行while(1);或者执行中断程序。如果不加的话,程序会不断的复位执行main函数,这样中断就进不去了。死机!
第二种情况:在中断响应完之后要跳到主函数去执行,如果没有while(1);中断响应完之后就跳到main()函数的开头,复位,从头开始运行;有了while(1)的话中断响应完之后就跳到main()中while(1);处运行,这样就不会出错。
这说的很好
cowboy2014 发表于 2015-3-30 16:57 | 显示全部楼层
为啥不加入while循环呢?每次指向完成都返回到启动代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

43

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

0

主题

43

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部