问题现象:
在程序运行过程中发现某变量数值发生了预期外的变化,导致程序运行出错
问题原因:
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;”即可。
欢迎交流!