打印
[STM8]

用局部int型静态变量运行过程中会乱变?

[复制链接]
1073|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
因火生烟|  楼主 | 2017-8-21 09:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用的是IAR FOR STM编译器,一个涵数中定义了int型静态变量
static unsigned int T20min,T1hour;//20,60分钟
T20min,T1hour都是加1的,在运行过程中可以看到会从几十突然变到几千或几万的,但换成两个static unsigned char静态变量就正常了,或者换成数组形变量也没事。为什么会这样?这个静态变量只是局部的,只有这个涵数才用到的。
沙发
feelhyq| | 2017-8-21 09:15 | 只看该作者
检查下 T20min,T1hour到达60 和24后的判断条件是否正常,有可能存在越界其他数据把他们破坏了。静态局部变量固定占用了一个内存坑。

使用特权

评论回复
板凳
因火生烟|  楼主 | 2017-8-21 09:24 | 只看该作者
feelhyq 发表于 2017-8-21 09:15
检查下 T20min,T1hour到达60 和24后的判断条件是否正常,有可能存在越界其他数据把他们破坏了。静态局部变 ...

T20min++;
if(T20min>1999)
{
   T20min=0;
}
都是正常的,有时候记时也正常,有时候就乱变。

使用特权

评论回复
地板
feelhyq| | 2017-8-21 09:47 | 只看该作者
因火生烟 发表于 2017-8-21 09:24
T20min++;
if(T20min>1999)
{

那很有可能别的数据把他破坏了,可以这样去验证,你将这2个静态局部变量定义成一个长度为6的数组,数组前2个和后面2个初始化为0,中间2个给T20min和T1hour用,运行一段时间后,检查下数组的前面2个和后面2是个是不是还是为0,如果不为0,那很可能就是哪里把他改变了。

使用特权

评论回复
5
因火生烟|  楼主 | 2017-8-21 10:32 | 只看该作者
feelhyq 发表于 2017-8-21 09:47
那很有可能别的数据把他破坏了,可以这样去验证,你将这2个静态局部变量定义成一个长度为6的数组,数组前 ...

换成两个static unsigned char静态变量就正常了,或者换成数组形变量也没事,这个涵数用的都是静态变量

使用特权

评论回复
6
feelhyq| | 2017-8-21 10:37 | 只看该作者
因火生烟 发表于 2017-8-21 10:32
换成两个static unsigned char静态变量就正常了,或者换成数组形变量也没事,这个涵数用的都是静态变量 ...

if(T20min>1999)  你变成uchar后 那么这个条件永远不可能满足了,0~255

使用特权

评论回复
7
feelhyq| | 2017-8-21 10:44 | 只看该作者
建议从根本上找原因,而不是稀里糊涂的把它避开

使用特权

评论回复
8
mmuuss586| | 2017-8-21 16:32 | 只看该作者
正常不会的;
好像好查下程序看看

使用特权

评论回复
9
因火生烟|  楼主 | 2017-8-22 09:29 | 只看该作者
feelhyq 发表于 2017-8-21 10:37
if(T20min>1999)  你变成uchar后 那么这个条件永远不可能满足了,0~255

两个uchar后,就不是这个if(T20min>1999) 判断了

使用特权

评论回复
10
feelhyq| | 2017-8-22 09:30 | 只看该作者
因火生烟 发表于 2017-8-22 09:29
两个uchar后,就不是这个if(T20min>1999) 判断了

嗯,好好好排查下这个原因,肯定能学到不少知识

使用特权

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

本版积分规则

49

主题

167

帖子

8

粉丝