STM32中变量数值出现预期外变化的问题分析及解决方法——数组超维赋值或局部变量设置

问题现象:

        在程序运行过程中发现某变量数值发生了预期外的变化,导致程序运行出错

问题原因:

        1.数组赋值超出定义的维度,导致其他变量值被修改

        2.局部变量(函数内部定义)大小超出设定范围

        3.局部变量定义时未赋初值

问题分析:

        1.如数组定义为u8 array[30],即1*30,当因程序边界未设置好或程序错误导致执行array[30]=0时(最后为array[29]),将对“内存分配中array[29](即该数组最后一个字节)对应地址+1”的地址进行赋值;该地址所对应的变量在此时被修改,但程序中完全无法体现,将导致程序运行偏离设计人员预期。

        2.局部变量存储于栈中,在startup文件中“Stack_Size      EQU”处可修改栈大小。修改栈大小后编译,ZI-data(初始化为0数据)数量将增加设定的栈大小,用于确保局部变量有足够的栈空间实现;否则,如果栈空间不足以容纳局部变量,将出现赋值错误情况,导致程序运行出错。

        3.局部变量无初始化过程,在执行函数时将在栈空间内指定一块内存用于存储该变量,所以指定的内存地址上先前存储的数据即为该局部变量的初值,具有“随机”性。如果函数内部存在条件路径导致未对此变量进行修改,则在用此变量判断时将出错。

解决方法:

        1.确保程序中不会出现数组赋值超出维度的情况,尤其是在for循环幅值时;或增加数组维度作为隔离缓冲带。

        2.使用局部变量时注意栈大小的设置是否合理。有些经验丰富的设计人员推荐不在局部变量中定义大数组,但我在实用未发现明显问题,待细堪。另外,栈大小设置小于实际需求时,编译器不会给出任何报警或错误提示;栈大小设置大于单片机内存剩余量时,编译器将会有错误提示。

        3.局部变量时带上赋初值语句,如将“u8 delay_cnt;”修改为“u8 delay_cnt=0;”即可。

 

欢迎交流!

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值