ST-Bluenrg-lp芯片编程因为地址重叠导致常量值被更改
所遇问题:定义的结构体,用于限制范围大小。类似于:struct test SysParaMax = {.test1= 5000,.test2 = 5000,.test3 = 100,.test4 = 600,}struct test SysParaMin = {.test1= 0,.test2 = 0,.test3 = 0,.test4 = 0,}结果作为范围限制使用的时候,因为debug才查看到

所遇问题:定义的结构体,用于限制范围大小。类似于:
struct test SysParaMax = {
.test1= 5000,
.test2 = 5000,
.test3 = 100,
.test4 = 600,
}
struct test SysParaMin = {
.test1= 0,
.test2 = 0,
.test3 = 0,
.test4 = 0,
}
结果作为范围限制使用的时候,因为debug才查看到的值为这样:
struct test SysParaMax = {
.test1= -3090,
.test2 = 8902,
.test3 = -2345,
.test4 = -4343,
}
struct test SysParaMin = {
.test1= 987,
.test2 = 342,
.test3 = 343,
.test4 = -1244,
}
由此导致程序出现各种奇奇怪怪的问题,而作为常量值,一般也不怎么会检查。最后发现时就浪费了大量的时间了。
这种问题首先第一可能是指针指向,导致变量发生改变,第二地址偏移导致。
第一种查找办法:一般先通过全局搜索查看是否有指针指向的问题。结果发现没有。
第二种分析办法:通过map文件查看变量对应的上下地址。
类似于:
因为要是上面的syspara的使用数据超过了定义的范围是会出现数据的溢出现象导致后面的数据发生变化。而后面检查了其大小发现也不是这个问题。
最后纯属运气发现了一个非常有意思的问题,我所使用的某个模块中定义了一个大小达到了60k的一个局部变量的结构体,因为别人之前对空间没什么要求就定义的比较大。
这是我自己所使用的RAM大小,所使用的全局变量和局部变量全部都被定义在RAM中,局部变量使用完后就会被去除,再使用是再定义,本来使用的一般的全局变量和局部变量的地址不会一样,毕竟一个在全局区,一个在栈区。
但这次定义的局部变量太大了,导致局部变量的地址和全局变量的地址重叠,导致了全局变量的数据会随着局部变量的数据发生变化,,,,在我自己的应用中,一些全局的结构体变量被使用完一次之后数据立马清零,不清楚的都是玄学问题,搞清楚后就舒服很多。
这是某些文件的地址:
而我的局部变量的地址是从0x2000080E到0x2000F276所以导致在这个区间的变量全部都变的不太一样,而局部变量赋值的时候是会改变地址上的值,由此造成各种各样的奇怪问题,最后都回归到一个问题上。
最后补充一下,因为局部变量把堆栈的地址也给占用了,所以使用malloc时就发生堆栈溢出,也会改变对应地址的变量值。溢出后的地址是随机的。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐






所有评论(0)