芯片是gd32450z。
用了一个全局变量保存了一些初始配置值,例如变量名是aaa。
INIT_BOARD_EXPORT(rt_hw_can_init);
在系统初始化时,调用了rt_hw_can_register
函数,其中进入到rt_object_get_information
时,发现aaa里面某个字段的值被改掉了。
这是在studio里面调试的时候,通过添加监看定位到一进入rt_object_get_information
这个函数,值就被改掉了。
不知道这是什么原因引起的,请各位大侠指点。
系统启动过程中,rt_hw_can_init这些函数的栈空间和全局变量的地址重叠了。
全局变量的地址是0x20000f14,
函数局部变量地址是0x20000FCC,
函数继续往下走的时候,局部变量的地址就覆盖了全局变量的地址。
栈的分配应该怎么修改呢?
@martinwu
在init board阶段,还是使用的msp对应的stack。你尝试增大lds文件中的stack size试试看,或许是这个栈设小了。如果是mdk下,去启动文件看看,改msp栈的大小尝试一下。
@lchnu
我用的是rtstudio生成的工程,生成的是gd32_rom.ld这个文件。
尝试过修改ld文件里面的_system_stack_size,但是改了之后局部变量地址并没有发生变化。
问题解决了,boot里面跳转之前没有用下面这句设置寄存器,导致使用的栈地址错误。
__set_CONTROL(0);
@martinwu
这个帖子不错,赞!
有问题描述,有分析,有结论,可以帮不少人避开雷区。