打印
[PIC®/AVR®/dsPIC®产品]

关于检查程序问题的讨论

[复制链接]
楼主: Rain_King
手机看帖
扫描二维码
随时随地手机跟帖
81
Rain_King|  楼主 | 2013-11-19 13:42 | 只看该作者 回帖奖励 |倒序浏览
yewuyi 发表于 2013-11-19 13:36
1、56楼的代码是我公司面试电子工程师的时使用的一条笔试题目。

2、这条题目中,有一些比较常见的小错误, ...

好吧......其实我也不知道临界代码,可否给点相关资料看看啊.......版主...........

使用特权

评论回复
82
m564522634| | 2013-11-19 13:50 | 只看该作者
我以前用过一个PIC单片机读EEPROM,怎么读都不行,搞了4天。最后换了个芯片好了。那个流泪了,还有我们用的PIC下载器都是山寨有时可能会有点问题了

使用特权

评论回复
83
Rain_King|  楼主 | 2013-11-19 15:42 | 只看该作者
yewuyi 发表于 2013-11-19 13:36
1、56楼的代码是我公司面试电子工程师的时使用的一条笔试题目。

2、这条题目中,有一些比较常见的小错误, ...

版主.....给个资料看看啊........能否讲解一二啊.....

使用特权

评论回复
84
Rain_King|  楼主 | 2013-11-19 15:43 | 只看该作者
m564522634 发表于 2013-11-19 13:50
我以前用过一个PIC单片机读EEPROM,怎么读都不行,搞了4天。最后换了个芯片好了。那个流泪了,还有我们用的 ...

单片机的EEPROM木有问题,因为我在这个函数之外的地方读取时可以的......我正在探索............

使用特权

评论回复
85
yewuyi| | 2013-11-19 15:49 | 只看该作者
Rain_King 发表于 2013-11-19 15:42
版主.....给个资料看看啊........能否讲解一二啊.....

这哪有什么详细资料,就是一个名词,其实就是一种程序BUG,但这个BUG属于隐性的,在符合一定的要素后触发临界条件,并导致了预测之外的错误。

很多童鞋都会在这方面犯错,因为错误现象呈现一定的概率性,所以很多童鞋就认为现象很诡异,想不透之后,就认为芯片有问题,或者是干扰什么等等。。。。。。

芯片就是一个机器,怎么动作主要是你的代码在指挥它,如果动作在预测之外,要么是程序BUG,要么是你没有按照芯片数据手册规定的条件使用它,极少可能是芯片本身有问题,概率实在太低了,特别是一款上市多年的芯片。

使用特权

评论回复
86
Rain_King|  楼主 | 2013-11-19 15:51 | 只看该作者
yewuyi 发表于 2013-11-19 15:49
这哪有什么详细资料,就是一个名词,其实就是一种程序BUG,但这个BUG属于隐性的,在符合一定的要素后触发 ...

那怎么样避免呢???、有木有什么方法啊....一下常规的举例,或者解释一下你先前出的那个题目,为啥会出现临界代码现象??

使用特权

评论回复
87
gbars| | 2013-11-19 16:06 | 只看该作者
Rain_King 发表于 2013-11-19 10:08
哪里设置的????从哪里关???

mplab ide
project-build option-project-compiler-operation mode

使用特权

评论回复
88
Rain_King|  楼主 | 2013-11-19 16:27 | 只看该作者
gbars 发表于 2013-11-19 16:06
mplab ide
project-build option-project-compiler-operation mode

我已经找到了.........并且第一个问题解决了...就是优化搞的.....

使用特权

评论回复
89
yewuyi| | 2013-11-19 16:27 | 只看该作者
if(msCounter>5000){
                  Startout();
                  }         
           }   
}
//------------------------------------------------------------------------
//定时中断服务程序
void interrupt Timer_1ms_ISR(void){
                                  msCounter++;
                                  }
//------------------------------------------------------------------------

在8位MCU上,msCounter>5000,5000对应的16进制数值就是0x1388,超过了一字节数域的表示范围,这个对应的ASM指令,一般都是多条指令来判断大小,基本上编译器生成的汇编指令都是分成两次分别比较高字节和低字节值的大小,当MCU执行比较时,如果恰好中断发生并导致了进位,此时就产生了临界。

使用特权

评论回复
90
yewuyi| | 2013-11-19 16:32 | 只看该作者
这只是一个例子,在实际中还有很多种可能的临界代码,但作为一个高质量的代码工人,要时刻牢记并惊醒规避这种临界代码的可能。

使用特权

评论回复
91
Rain_King|  楼主 | 2013-11-19 16:41 | 只看该作者
本帖最后由 Rain_King 于 2013-11-19 16:49 编辑
yewuyi 发表于 2013-11-19 16:27
if(msCounter>5000){                  Startout();                  }          ...


哦,我明白意思了....所谓的临界代码,一般都是指一个变量在多处改变时,并且有些改变的具有优先级,这样就会导致一些意外的问题。。。。。

使用特权

评论回复
92
Rain_King|  楼主 | 2013-11-19 16:44 | 只看该作者
yewuyi 发表于 2013-11-19 16:32
这只是一个例子,在实际中还有很多种可能的临界代码,但作为一个高质量的代码工人,要时刻牢记并惊醒规避这 ...

我的这个问题发现原因了,是编译器的优化问题导致的.....设置一下就好.....

使用特权

评论回复
93
yewuyi| | 2013-11-19 17:05 | 只看该作者
Rain_King 发表于 2013-11-19 16:41
哦,我明白意思了....所谓的临界代码,一般都是指一个变量在多处改变时,并且有些改变的具有优先级,这样 ...

临界代码有很多种可能,我的举例只是最简单的一种。

使用特权

评论回复
94
Rain_King|  楼主 | 2013-11-19 17:25 | 只看该作者
yewuyi 发表于 2013-11-19 17:05
临界代码有很多种可能,我的举例只是最简单的一种。

额...好吧..貌似有点复杂啊...

使用特权

评论回复
95
Rain_King|  楼主 | 2013-11-19 17:26 | 只看该作者
yewuyi 发表于 2013-11-19 17:06
不敢苟同。

能说一下你的想法么

使用特权

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

本版积分规则