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

关于检查程序问题的讨论

[复制链接]
楼主: Rain_King
手机看帖
扫描二维码
随时随地手机跟帖
61
Rain_King|  楼主 | 2013-11-19 09:31 | 只看该作者 回帖奖励 |倒序浏览
兰天白云 发表于 2013-11-19 09:24
首先要建立一个信念:办法总比困难多
就拿按键扫描来说,用AD扫描原则上可以,但AD有自身缺陷,受干扰影响 ...

方法啊....我试试..........其实我没有说,我的ad转换时在定时器0里面进行的....不过是10ms一次,应该不会是问题吧.....我这样做主要是想节约点变量.........之所以在写程序时,处处都考虑节约变量,组要原因以前使用51的时候,就是太不节约变量,出现了问题,让后从那以后,每次写程序都考虑能少用变量就少用...

使用特权

评论回复
62
Rain_King|  楼主 | 2013-11-19 09:36 | 只看该作者
本帖最后由 Rain_King 于 2013-11-19 09:38 编辑
yewuyi 发表于 2013-11-19 09:26
2.4请分析以下一段代码并指出有那些地方需要修改。unsigned int msCounter=0;   //毫秒计数器全局变量//--- ...


首先,有个语法错误,函数都void了,还有返回值??,如果你不是有意的就当我没说。其次,我觉得msCounter应该清个零吧,大于5000后次次调用不太好。。。最后,如果你最主要的是想说,中断1ms太频繁了,好吧我觉得这不是问题,我就经常这样...........

使用特权

评论回复
63
Rain_King|  楼主 | 2013-11-19 09:38 | 只看该作者
ayb_ice 发表于 2013-11-19 09:27
怎么不可以关
就调用个按键+10MS延时程序即可

我试试..............方法多了..准会找出问题来的...............

使用特权

评论回复
64
ayb_ice| | 2013-11-19 09:47 | 只看该作者
叫你关中断当然是有意义的
很多人没有临界代码的概念,导致所谓诡异问题,其实不是诡异,
同样的程序可能在有些MCU上没有诡异,有些MCU上应有诡异,反之亦然,其实不是诡异,都是临界的问题,同一条语句有些MCU可以一条指令搞定,有些需要多条指令,有些虽然需要多条指令,但不会出现问题

使用特权

评论回复
65
Rain_King|  楼主 | 2013-11-19 09:50 | 只看该作者
ayb_ice 发表于 2013-11-19 09:47
叫你关中断当然是有意义的
很多人没有临界代码的概念,导致所谓诡异问题,其实不是诡异,
同样的程序可能在 ...

明白了......我去测试一下....如果我关了之后,发现可以工作了,那这说明了啥???还有我的帖子怎么置顶了??能不能取消置顶啊.....毕竟问题我也还没有找出来:'(

使用特权

评论回复
66
ayb_ice| | 2013-11-19 09:54 | 只看该作者
那说明中断与主循环的全局变量传递信息之间有问题
就是临界代码的问题,
很多处理是需要原子操作的

使用特权

评论回复
67
Rain_King|  楼主 | 2013-11-19 09:56 | 只看该作者
ayb_ice 发表于 2013-11-19 09:54
那说明中断与主循环的全局变量传递信息之间有问题
就是临界代码的问题,
很多处理是需要原子操作的 ...

原子操作???啥概念????

使用特权

评论回复
68
Rain_King|  楼主 | 2013-11-19 09:57 | 只看该作者
yewuyi 发表于 2013-11-19 09:26
2.4请分析以下一段代码并指出有那些地方需要修改。unsigned int msCounter=0;   //毫秒计数器全局变量//--- ...

版主,我回答的正不正确啊,不会完全没领悟你的意思吧...........求指教啊..........告诉我理论的东西也行啊.....

使用特权

评论回复
69
ayb_ice| | 2013-11-19 10:02 | 只看该作者
Rain_King 发表于 2013-11-19 09:56
原子操作???啥概念????

就是一个处理不能被打断,比如基本的一条指令,没有执行完是不可能执行其它的指令,

这里的原子操作没有必要不被打断,只是被打断不影响结果就行了,但为了可靠,一般需要原子操作时都是关中断的

使用特权

评论回复
70
gbars| | 2013-11-19 10:05 | 只看该作者
Rain_King 发表于 2013-11-19 08:57
对上面的程序进行说明....
我的消息是这样的,对于一个短按和长按,只有按键释放才能确定,所以短按按下和 ...

跳过判断语句我也遇到过,最后发现基本是表达式问题导致判断结果是常量,然后编译器优化程度比较高的话就直接跳过了,调试时最好把代码优化关了

使用特权

评论回复
71
Rain_King|  楼主 | 2013-11-19 10:08 | 只看该作者
gbars 发表于 2013-11-19 10:05
跳过判断语句我也遇到过,最后发现基本是表达式问题导致判断结果是常量,然后编译器优化程度比较高的话就 ...

哪里设置的????从哪里关???

使用特权

评论回复
72
Rain_King|  楼主 | 2013-11-19 10:31 | 只看该作者
本帖最后由 Rain_King 于 2013-11-19 10:33 编辑
ayb_ice 发表于 2013-11-19 10:02
就是一个处理不能被打断,比如基本的一条指令,没有执行完是不可能执行其它的指令,

这里的原子操作没有 ...


看下一个回复...这个漏过..

使用特权

评论回复
73
Rain_King|  楼主 | 2013-11-19 10:31 | 只看该作者
本帖最后由 Rain_King 于 2013-11-19 10:32 编辑
ayb_ice 发表于 2013-11-19 10:02
就是一个处理不能被打断,比如基本的一条指令,没有执行完是不可能执行其它的指令,

这里的原子操作没有 ...


我把所有的都关了,中断也关了,只显示按键消息。。。。问题依旧,加入
if(RA7_NU==1)
{
RA7_NU=0;
}
else
{
           RA7_NU=1;
}
消息产生正常,不加,轻轻一按,消息产生多,短按,长按都有....而且非常明显...

使用特权

评论回复
74
ayb_ice| | 2013-11-19 10:58 | 只看该作者
Rain_King 发表于 2013-11-19 10:31
我把所有的都关了,中断也关了,只显示按键消息。。。。问题依旧,加入
if(RA7_NU==1)
{

用GPIO扫键试试

使用特权

评论回复
75
Rain_King|  楼主 | 2013-11-19 11:16 | 只看该作者
ayb_ice 发表于 2013-11-19 10:58
用GPIO扫键试试

GPIO扫键???啥东东????

使用特权

评论回复
76
ayb_ice| | 2013-11-19 11:28 | 只看该作者
不用ADC读键,用传统的IO扫键

使用特权

评论回复
77
Rain_King|  楼主 | 2013-11-19 11:30 | 只看该作者
ayb_ice 发表于 2013-11-19 10:58
用GPIO扫键试试

我想我找出问题所在了,我现在检测了消息的产生个数,发现了一个特殊现象,只要我轻轻一按,就产生了8个消息,其中前面6个全部是长按的消息,而且没有释放消息,后面两个是短按消息和短按释放.....应该是略过KeyCntA>=CNTL_KEY这个判断条件,直接运行那个插入消息函数了.....

使用特权

评论回复
78
icecut| | 2013-11-19 13:35 | 只看该作者
yewuyi 发表于 2013-11-19 09:26
2.4请分析以下一段代码并指出有那些地方需要修改。unsigned int msCounter=0;   //毫秒计数器全局变量//--- ...

可怜了你的代码了....

他的回答好像真不知道临界区.
这样的人,写框架,写系统,
我只想说,时间片,不骗你片谁?

他的代码我也没看,惨不忍睹.

我只想提醒他,写代码最烂 也是让编译器理解.如果编译器理解不了,那离着死不远了.
问题很明显,编译器傻了,没法优化代码了...

使用特权

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

2、这条题目中,有一些比较常见的小错误,主要就是为了掩盖那个最重要的错误:临界代码。

3、通过这个查错,来检验面试人员的软件基础和对临界代码概念的理解。

4、你没有通过这个检验。

使用特权

评论回复
80
Rain_King|  楼主 | 2013-11-19 13:41 | 只看该作者
icecut 发表于 2013-11-19 13:35
可怜了你的代码了....

他的回答好像真不知道临界区.

临界代码真的不是很了解.....望告知一二可否啊...........

使用特权

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

本版积分规则