OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10231|回复: 19

求助原子哥,全局变量值莫名其妙被清0的问题

[复制链接]

12

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-12-22
在线时间
1 小时
发表于 2015-12-9 00:05:06 | 显示全部楼层 |阅读模式
5金钱
程序里有一个全局变量,可以理解为油门的作用,STM32根据它的大小来给出四路PWM。今天碰到一个莫名其妙的BUG,其他程序都正常跑着,就是这个全局变量的值不知为何总会被自动清0,明明初始化成非0值的。另外,我可以通过串口改变这个变量的值的,但每次刚通过串口给它赋值,瞬间就被清0了。我是用那个变量来控制电机喽,现象就是每次改变下油门,电机动一下立马就不转了。。。我程序里绝对没有对这个变量清0过。最奇葩的是,程序没有重新下载,只是复位几次,又忽然恢复正常了。但再复位又可能不正常了。。。这真是活久见~~~难道RAM到寿命了?可是程序正常跑着啊,其他变量也没事,就这一个全局变量会有这样的问题,你们说有可能是什么原因?

Quadrotor-V2.2.rar

889.6 KB, 下载次数: 484

哪管多少辛酸已获胜算!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

333

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1838
金钱
1838
注册时间
2012-7-16
在线时间
504 小时
发表于 2015-12-9 08:21:06 | 显示全部楼层
程序放出来,不然很难知道什么原因,多半是程序BUG,硬件出问题的可能很小。
回复

使用道具 举报

30

主题

282

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2015-8-24
在线时间
241 小时
发表于 2015-12-9 08:23:28 | 显示全部楼层
觉得是你自己在哪不小心动了那个全局变量。
回复

使用道具 举报

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1684
金钱
1684
注册时间
2014-2-25
在线时间
230 小时
发表于 2015-12-9 09:09:02 | 显示全部楼层
也有可能是你在别的.C源文件定义的变量数组,然后再其他地方extern声明的时候声明的数组长度不一样,然后有些变量被覆盖了。
回复

使用道具 举报

12

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-12-22
在线时间
1 小时
 楼主| 发表于 2015-12-9 10:10:54 | 显示全部楼层
回复【4楼】1201yuge:
---------------------------------
一个u16的全局变量,不是数组,外部声明查过了,没问题。我的全局变量全部定义在一个单独一个C文件里,然后在它的H文件进行外部声明。没有错误
哪管多少辛酸已获胜算!
回复

使用道具 举报

12

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-12-22
在线时间
1 小时
 楼主| 发表于 2015-12-9 10:12:20 | 显示全部楼层
回复【3楼】沉默焚烧:
---------------------------------
绝对没有。。。。程序都是自己一句一句码的我会不知道?我也检查了
哪管多少辛酸已获胜算!
回复

使用道具 举报

12

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-12-22
在线时间
1 小时
 楼主| 发表于 2015-12-9 10:16:24 | 显示全部楼层
回复【2楼】hyghyg1234:
---------------------------------
已放出,是一个四轴工程,出问题的变量是Throttle,在define.c文件中定义,extern.h文件中进行外部声明
哪管多少辛酸已获胜算!
回复

使用道具 举报

70

主题

6769

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13193
金钱
13193
注册时间
2012-11-26
在线时间
3820 小时
发表于 2015-12-9 10:37:06 | 显示全部楼层
关注下这个问题    以前遇到过这种奇葩问题,最后delay一小会避开了这个问题
学无止境
回复

使用道具 举报

12

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-12-22
在线时间
1 小时
 楼主| 发表于 2015-12-9 11:14:04 | 显示全部楼层
回复【8楼】jermy_z:
---------------------------------
哪里加delay?
哪管多少辛酸已获胜算!
回复

使用道具 举报

2

主题

239

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2015-6-5
在线时间
110 小时
发表于 2015-12-9 12:02:27 | 显示全部楼层
每次刚通过串口给它赋值,瞬间就被清0了。

 Throttle=(USART_2.USART_RX_BUF[1]<<8)+USART_2.USART_RX_BUF[2];

你要不要確定一下USART_RX_BUF[1] USART_RX_BUF[2]是不是0值
我看你判斷只斷USART_RX_BUF[0]就進入了
回复

使用道具 举报

12

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-12-22
在线时间
1 小时
 楼主| 发表于 2015-12-10 12:43:35 | 显示全部楼层
回复【10楼】Rocks:
---------------------------------
抓取了串口数据,没问题,而且我说瞬间被清0不是指被串口清了0,而是串口给他赋值后起了一两个控制周期的作用然后又莫名其妙归0了
哪管多少辛酸已获胜算!
回复

使用道具 举报

13

主题

206

帖子

1

精华

高级会员

Rank: 4

积分
613
金钱
613
注册时间
2014-10-26
在线时间
32 小时
发表于 2015-12-10 13:05:46 | 显示全部楼层
ALT+F 全局搜索一下那个函数,都在什么地方用到,分析一下~
学习!
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2015-12-10 14:52:41 | 显示全部楼层
回复【11楼】雪噬剑:
---------------------------------
数据地址找到,对地址设置断点,看这个地址的数据除了在你发送和赋值的时候使用还在其他什么地方被清除了。
基本上是要找到这个数据地址的前面地址是否定义了二维数组什么的,可能写超了。
回复

使用道具 举报

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2013-12-9
在线时间
14 小时
发表于 2015-12-15 12:44:13 | 显示全部楼层
我试过了把你的变量通过串口发送出来没有问题啊!你是仿真检测看到他变0了么?还是你看到的现象判断它变0了?
回复

使用道具 举报

11

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2015-11-2
在线时间
17 小时
发表于 2015-12-15 14:22:31 | 显示全部楼层
12楼正解。
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2015-12-16 10:54:08 | 显示全部楼层
问题说的不清楚。究竟是哪个变量存储pwm的值?究竟是通过哪个函数传递pwm并控制电机的?
初步看,Throttle=(USART_2.USART_RX_BUF[1]<<8)+USART_2.USART_RX_BUF[2]; 如果数组是u8类型的话,这里<<8应该导致数据溢出了。
业余程序玩家。
回复

使用道具 举报

11

主题

1044

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3725
金钱
3725
注册时间
2011-5-23
在线时间
2013 小时
发表于 2015-12-16 11:37:31 | 显示全部楼层
写断点分分钟找到问题。
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2021-12-17
在线时间
3 小时
发表于 2017-3-29 16:57:01 | 显示全部楼层
本帖最后由 linwei1234 于 2017-3-29 17:42 编辑

问题找到了吗?  我也遇到类似问题.
f0的一个long变量不为0进行减1;减1后为0则清标志,结果变量直接为0了没清标志,没有赋0操作,
只有一个赋值2和100的操作.
赋值2不可能进入,一直挂断点.
赋值100经常操作.不过是在变量为0时才赋值100.
都是非中断操作.代码没有做优化编译:


                if(gRequest_read_wait_time_ms )        //清除请求读的硬件申请
                {
                        gRequest_read_wait_time_ms--;
                        if(gRequest_read_wait_time_ms == 1)
                        {
                                GPIOB->ODR &= ~I2C_nINT_Pin;
        //超时未读,自动清除
        gSYS.SYS_FLAG &= ~(
//                         (1 << FLAG_KEY_IN)|
//                          (1 << FLAG_TOUCH_IN)|
                          (1 << FLAG_BR8881_IN)
                         | (1 << FLAG_ALARM)
                         | (1 << FLAG_RESET)
                         | (1 << FLAG_RESET_WATCHDOG)
                         | (1 << FLAG_POWER_EVENT)
                         );
                        }
                }


QQ 475240581

回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2021-12-17
在线时间
3 小时
发表于 2017-4-6 10:03:58 | 显示全部楼层
linwei1234 发表于 2017-3-29 16:57
问题找到了吗?  我也遇到类似问题.
f0的一个long变量不为0进行减1;减1后为0则清标志,结果变量直接为0了 ...

还是自己问题,逻辑之间的时间问题
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2017-7-7
在线时间
1 小时
发表于 2017-7-8 10:43:54 来自手机 | 显示全部楼层
u16的全局变量是16位的,假如取反会变为oxff
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-8-17 01:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表