打印

C语言熟悉的进来看下 谢谢

[复制链接]
5053|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
a250871207|  楼主 | 2011-5-19 08:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
if(bsInfo.pv[0]<100)
{
  LED_DispNumeric(1,bsInfo.pv[0],1);
  .......
  ........
bsInfo
定义如下
typedef struct{
int pv[2];
}_bsInfo;
extern bank2 volatile _bsInfo bsInfo;
现在问题是这样的  这里本来需要控制达到的是只有当数据小于100时显示数据
可现在问题是经常会在运行中 明明大于比如bsInfo.pv[0]=373这样的 它依然会显示  这是为什么呢  如果要是一直是也还好说 可根本无规律可查   都是在运行一段后才会出现   请高手指点 谢谢
沙发
yewuyi| | 2011-5-19 08:44 | 只看该作者
1、你的程序中存在临界代码,什么叫临界代码,你可以自行通过百度等查询。
2、一个简单的临界可能举例:
当程序执行到if(bsInfo.pv[0]<100)时,对于8位MCU来说,这个代码对应的ASM代码将是多条指令汇集而成,如果在判断的时候发生中断,并且你的中断中有某个代码修改了bsInfo.pv[0]数值,那么问题就会出现了。
3、多数临界代码都是因为中断造成
4、造成临界代码的原因主要是你缺乏一个良好的程序结构,并且对各种变量的开销不能完全了解。
5、你可以在if(bsInfo.pv[0]<100)这行代码前加一条指令先把所有的中断都关闭掉,然后看看结果是否有改变?

使用特权

评论回复
板凳
a250871207|  楼主 | 2011-5-19 08:47 | 只看该作者
可事实是我根本没在任何中断中调用这个变量啊   还有其它的原因吗?

使用特权

评论回复
地板
yewuyi| | 2011-5-19 09:06 | 只看该作者
可事实是我根本没在任何中断中调用这个变量啊   还有其它的原因吗?
a250871207 发表于 2011-5-19 08:47


要理解临界的意思,调用只是一种可能,也可能是你修改了进位标志等,这些都有可能。

我不是告诉你验证的办法了吗?

你可以先关闭掉中断再看看。

另外,你有没有隐含的变量类型强制转换,如果转换错误的话,那么这也会形成一种形式的临界代码。

使用特权

评论回复
5
a250871207|  楼主 | 2011-5-19 09:17 | 只看该作者
验证了 现象依然存在  我直接关闭的全局中断GIE  有没有对这类情况详细介绍的书籍 能给推荐一个吗  我想我可能需要统筹的去学习一下 现在问题根本无从下手了

使用特权

评论回复
6
a250871207|  楼主 | 2011-5-19 09:19 | 只看该作者
顺便问下 我怎样能让这种临界代码最快的显现出来  现在总是运行好长一段时间 才能看出效果  有时我都以为不会有这BUG了呢

使用特权

评论回复
7
kvdong| | 2011-5-19 09:48 | 只看该作者
把你的LED_DispNumeric()函数贴出来分析分析

使用特权

评论回复
8
yewuyi| | 2011-5-19 09:57 | 只看该作者
顺便问下 我怎样能让这种临界代码最快的显现出来  现在总是运行好长一段时间 才能看出效果  有时我都以为不会有这BUG了呢
a250871207 发表于 2011-5-19 09:19



临界代码一旦形成,往往是比较难抓出来的,因为这不是很多代码互相纠结形成的。

避免临界代码的最好办法就是形成良好的软件结构,用一句通俗的话讲就是:不谋全局者何以谋一域!

从我让你去测试,到你反馈,总共不到10分钟时间,这样的临界代码还是很容易抓到的,有的临界代码潜伏成月不出现都可能。

另,你还需要重点检查那些存在变量可能被隐含强制转换的代码,这些代码都是地雷,但什么爆炸,则可不好说,也许终身携带,到产品终结退市之时也未必爆炸,但。。。

使用特权

评论回复
9
shizaigaole| | 2011-5-19 12:25 | 只看该作者
既然中断里面没有牵涉大你的变量,

那存在两种情况:

1.你的逻辑设计不正确,还有别的地方的代码会影响到你的代码执行
2.内存操作错误,例如指针操作数组超限

使用特权

评论回复
10
shizaigaole| | 2011-5-19 12:26 | 只看该作者
请仔细检查你程序中指针操作相关代码

使用特权

评论回复
11
yangyangabc| | 2011-5-19 13:19 | 只看该作者
考C语言能行吗

使用特权

评论回复
12
mytempid| | 2011-5-19 13:38 | 只看该作者
验证了 现象依然存在  我直接关闭的全局中断GIE ...
a250871207 发表于 2011-5-19 09:17


如果关闭全局中断,现象依然存在,
可能是LED_DispNumeric(1,bsInfo.pv[0],1)有问题

使用特权

评论回复
13
上树的猪| | 2011-5-19 14:04 | 只看该作者
问题在这里   extern bank2 volatile _bsInfo bsInfo;
bsInfo  定义 的  跟 硬件 相关 .

可能是 比较的 时候 是 小于的,  等到 显示的时候 ,又变了.....

建议 :

int  tmp;
tmp = bsInfo.pv[0];
if( tmp <100)
{
  LED_DispNumeric(1,tmp,1);
}

使用特权

评论回复
14
peigang| | 2011-5-19 15:29 | 只看该作者
可能你的逻辑设计不正确,从新读一遍代码。
再看看寄存器是否溢出。

使用特权

评论回复
15
鲲鹏展翅| | 2011-5-19 16:37 | 只看该作者
bsInfo.pv[0]是如何取值的

使用特权

评论回复
16
hzt818| | 2011-5-19 17:23 | 只看该作者
同意13楼

使用特权

评论回复
17
兰天白云| | 2011-5-19 17:24 | 只看该作者
按13楼做可以解决问题

使用特权

评论回复
18
yuzhao8881000| | 2011-5-19 17:45 | 只看该作者
:)

使用特权

评论回复
19
原野之狼| | 2011-5-19 20:15 | 只看该作者
检查所有有指针操作的地方
90%的可能是越界造成的数据非法改变

使用特权

评论回复
20
liuxiaofo| | 2011-5-19 20:32 | 只看该作者
这个我不是非常清楚,但是也支持一下

使用特权

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

本版积分规则

6

主题

107

帖子

1

粉丝