打印

IAR中全局变量莫名奇妙被修改原因?

[复制链接]
941|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaobq|  楼主 | 2021-1-6 12:09 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
今天调试一个程序,环境是IAR8.40.2+STM32+FreeRTOS,出现了一个莫名奇妙的问题:
1.声明了一个结构体,定义了一个结构体数组,8个长度,全局变量;
2.结构体里有个成员uint8_t类型的变量Mode,初始化是8个结构体变量里的Mode都设定为3;
3.数组[1]里的Mode变量会被系统莫名奇妙的修改,清0;其他数组里的Mode变量能保持不变;
4.发现变量被修改发生在调研freertos的延时函数osDelay(1)时发生;
5.找原因,代码没有问题,没有地方修改;怀疑IAR出问题了,重装了软件;C代码优化改为NONE,均不行。
6.最后解决方法是把uint8_t变量,改成uint32_t就可以了,变量能够按代码逻辑运行,不再被自动清0。
说的有点乱,不知说明白了没有,大家遇到过这种情况吗?什么原因呢?

图片1.png (394.06 KB )

图片1.png

使用特权

评论回复

相关帖子

沙发
天津饭和饺子| | 2021-1-7 08:54 | 只看该作者
在IAR下我也遇见过变量自己变数的情况,前一句打印数据还是对的,经过一个其他的函数之后,数据就变了,但不是每次都发生,我没有解决

使用特权

评论回复
板凳
steelen| | 2021-1-7 09:17 | 只看该作者
看内存分配

使用特权

评论回复
地板
叶春勇| | 2021-1-7 11:38 | 只看该作者
个人经验:
1、全局变量,volatile
2、全局变量,尽可能只有一个函数能写。
3、全局变量,多处可写,不可避免,尽可能写成状态机的形式。确保一个状态一个函数能写。bug好找一些。

使用特权

评论回复
5
雪山飞狐D| | 2021-1-7 11:55 | 只看该作者
函数重入问题?全局变量要非常注意

使用特权

评论回复
6
gaobq|  楼主 | 2021-1-7 14:46 | 只看该作者
这个全局变量,可以读写的地方就2个地方:一个是初始化EEPROM读出来,另一个是收到上位机串口通信,写EEPROM。变量清0发生在啥也不干的时候,如果没有使用FreeRTOS,可以单步跟踪。使用freertos,进入延时osDelay(1)函数里面,变的时刻就看不懂了。
看一个帖子里说,变量自动变,存在4字节对齐问题,STM32的变量,不管声明的是8位或16位、32位,都会占用1个32位空间吧。反正实用32位整数就正常了

使用特权

评论回复
7
xxp1943| | 2021-1-7 17:05 | 只看该作者
设置一个条件断点啦。当写这个地址的时候触发断点,这样就可以知道在哪里被改写了。

使用特权

评论回复
8
pjzmj2012| | 2021-3-2 17:05 | 只看该作者
我也遇到过。

使用特权

评论回复
9
madboy21| | 2021-3-3 00:05 | 只看该作者
看来很多人都碰到过呀!我木有用过IAR,但我想说下会在什么情况下可能出现这种情况。1、使用了指针,在获取地址时可能发生了错误。2、int a[2]; 若a[b] = y; 当b > 1时能正常操作并且不会报错,此时修改了其它变量。

使用特权

评论回复
10
qinxg| | 2021-3-3 08:38 | 只看该作者
内存定位中断.  这样在读写某个内存时会产生中断, 很多CPU都有这个功能.  中断会查看堆栈, 可以看到哪个函数读取了这个内存

使用特权

评论回复
11
madboy21| | 2021-3-3 09:27 | 只看该作者
int a@0x20 ,一些编译器已声明这样的地址并不会被保留。如int b;b有可能被系统分配给0x20 ,

使用特权

评论回复
12
madboy21| | 2021-3-3 09:32 | 只看该作者
再比如有两个数组int a[3];int b[5]; //假设a地址为0x0, b地址为0x3;
那么a[4]与b[1]是相同地址
如果有x = ykk; a[x] = y ;需要注意x是否超出了地址范围。

使用特权

评论回复
13
dragonhux| | 2021-3-4 12:39 | 只看该作者
1、野指针,被别的指针位置给改写了
2、字节对齐问题
听楼主的问题,更象是字节对齐造成的问题
可以在原先U16的定义后面,再定义一个U16的dumy变量,看还会不会出现问题
STM32是32位的,理论上32位操作效率更高

使用特权

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

本版积分规则

171

主题

824

帖子

5

粉丝