找回密码
 立即注册

微信扫码登录

查看: 462|回复: 6

在zigbee sdk 中使用volatile关键字修饰会导致入网异常

[复制链接]

7

主题

10

回帖

91

积分

注册会员

积分
91
发表于 2024-9-3 14:07:37 | 显示全部楼层 |阅读模式
大家好,近期在zigbee sdk3.8.7中,在重启或者重新烧录程序(未擦除flash)重启的时候将一个用volatile关键字修饰的变量赋值,会导致已入网的router 设备重新发起beacon request ,我对比了例程,如果router 已经入了网,在重启或者重新烧录程序(未擦除flash)重启,设备只发link status,如果我使用了volatile修饰变量,比如:定义变量volatile u16 abc;在user_init(bool isRetention)中赋值,abc = 100; 这样就会重现,如果我注释了与正常的例程一样的入网行为,我想知道这是为什么,如何解决这种情况,我排除了很久这个问题,希望你们能帮助到我,谢谢

27

主题

91

回帖

373

积分

版主

积分
373
发表于 2024-9-3 18:02:38 | 显示全部楼层
你好,按照你的操作方法,在原始SDK v3.6.8.7的sampleLight工程上未能复现到你反馈的现象,建议在你的环境下使用原始的demo来做一下对比验证。

从描述看,较大可能是存在内存越界(当添加了新的变量后引起内存变量重新布局,刚好将问题显现到了入网的逻辑判断上面)。

7

主题

10

回帖

91

积分

注册会员

积分
91
 楼主| 发表于 2024-9-4 09:14:57 | 显示全部楼层
TL_YB 发表于 2024-9-3 18:02
你好,按照你的操作方法,在原始SDK v3.6.8.7的sampleLight工程上未能复现到你反馈的现象,建议在你的环境 ...

感谢您的回答,我也用sampleLight验证了一下确实不会这样,但是我的工程中没有用到数据,几乎是全局变量,和一些算法,数组越界可以排除,其它还有什么会造成内存越界呢,而且是用了volatile 修饰变量时候才表现在重新入网的时候

27

主题

91

回帖

373

积分

版主

积分
373
发表于 2024-9-4 17:30:13 | 显示全部楼层
haiou 发表于 2024-9-4 09:14
感谢您的回答,我也用sampleLight验证了一下确实不会这样,但是我的工程中没有用到数据,几乎是全局变量 ...

volatile是告诉编译器不要将这个变量优化,你可以观察一下去掉这个修饰后是不是这个变量被优化掉了,所以没有产生明显的异常。
我觉得这个跟变量在内存中分配的位置有关系,你可以试试将变量换个名字,看现象是不是会发生改变。

7

主题

10

回帖

91

积分

注册会员

积分
91
 楼主| 发表于 2024-9-15 15:01:47 | 显示全部楼层
TL_YB 发表于 2024-9-4 17:30
volatile是告诉编译器不要将这个变量优化,你可以观察一下去掉这个修饰后是不是这个变量被优化掉了,所以 ...

有什么方法或者工具来判断是否是内存溢出,还是堆栈溢出,最近又碰到这个问题了,我目前还没法排除它造成的原因,我审视了我的代码很多遍也没有发现问题

7

主题

10

回帖

91

积分

注册会员

积分
91
 楼主| 发表于 2024-9-18 14:46:38 | 显示全部楼层
我已经找到问题所在了,因为我打印加了        TRACE("[%d]%s()-> ",__LINE__,__FUNCTION__);           TRACE(__VA_ARGS__); TRACE("\r\n");        ,然后我打印比较多,所以造成程序死机,而且这种死机似乎是非常致命的,reset也不会正常,直接变砖了

27

主题

91

回帖

373

积分

版主

积分
373
发表于 2024-9-18 16:58:41 | 显示全部楼层
好的,感谢你的分享~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Telink forum ( 沪ICP备17008231号-1 )

GMT+8, 2024-10-30 11:18 , Processed in 0.096402 second(s), 19 queries .

Powered by Telink 隐私政策

泰凌微电子版权所有 © 。保留所有权利。 2024

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