OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 调试51单片机程序,花了2天才搞定! 分享一下我的经验~

共11条 1/2 1 2 跳转至

调试51单片机程序,花了2天才搞定! 分享一下我的经验~

助工
2019-12-02 14:55:31    评分

一直以来,对51单片机还是觉得是“小菜一碟”,但最近的一个事情改变了我的认知

下面分享一下我的一些经验:


其实就是偷懒造成的,一个函数在程序初始化时使用,这个时候系统任何中断并没有打开,另外这个函数在定时中断中也有使用,天真的认为不存在同时调用的可能,所以不可能存在再入的问题,就是没理会重复调用的告警信息。函数再入引起,不要忽视警告信息!


后来程序不定时的出现问题,因为开始已经有了不可能同时调用再入这个函数的场合,所以就没有检查这个问题。

实在没有办法,刚才检查MAP信息,TNND才发现,其实不仅仅有再入的问题,这个函数使用的局域变量占用的地址,有一个是和其他函数是重复覆盖使用的,真相大白了,两天时间就是不想写一个reentrant,因为会增加一点点代码。




关键词: 单片机     调试     重入函数     函数再入    

管理员
2019-12-02 15:38:45    评分
2楼

事实告诉我们,有些懒是万万不能偷的


助工
2019-12-02 16:53:30    评分
3楼

谢谢分享


助工
2019-12-02 22:54:45    评分
4楼

楼主,C代码函数里面的变量都在栈里面,不可能出现地址重复的


助工
2019-12-02 23:05:40    评分
5楼

一个函数在程序初始化时使用,这个时候系统任何中断并没有打开
初始化后,函数已经执行完退出,不会影响第一次中断调用的
倒是怀疑定时中断时间间隔过小,造成前次中断未返回,后次中断又来了,没做再入函数设置,当然会出问题!


助工
2019-12-03 00:10:48    评分
6楼

回楼上的明月风:

哈哈,就是一样的思维才导致查了两天才解决问题。
当中断和主程序共同可以调用一个函数的时候,这个函数不是再入属性,编译器优化这个函数局域变量占用内存的时候,可能和主程序其他函数做覆盖优化,这个时候问题就发生了,哪怕仅仅覆盖一个字节。
当局域变量不是静态分配而是堆栈的话,就没有这个问题发生了。


专家
2019-12-03 09:19:04    评分
7楼

51的编译器现在没有提示warning吗?


助工
2019-12-04 22:55:26    评分
8楼

会有提示的吧


助工
2019-12-05 21:09:15    评分
9楼

支持一下


助工
2019-12-07 21:58:26    评分
10楼

围观一下


共11条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]