本帖最后由 john_lee 于 2020-4-2 22:59 编辑
你的变量SYS_Over_Current_Count或SYS_Overload_Count是定义在xdata中的。相关内存布局如下(文件经过整理,这里要吐槽一下keil,这些地址居然不排序):
正常的(变量名是SYS_Overload_Count)的内存布局: X:0000H PUBLIC SYS_Max_Temp
X:0001H PUBLIC SYS_Maj_Run_Coe
X:0002H PUBLIC SYS_Overload_Count
X:0003H PUBLIC S4_RX_JS
X:0004H PUBLIC SYS_SET_TRA
X:0005H PUBLIC SYS_MEM_Major
X:0006H PUBLIC SYS_SET_POR
X:0007H PUBLIC SYS_Working_Mode
X:0008H PUBLIC XT_RX_DATA
X:0016H PUBLIC XT_TX_DATA
X:0024H PUBLIC CC1101_CH
......
异常的(变量名是SYS_Over_Current_Count)的内存布局: X:0000H PUBLIC SYS_Max_Temp
X:0001H PUBLIC SYS_Maj_Run_Coe
X:0002H PUBLIC S4_RX_JS
X:0003H PUBLIC SYS_SET_TRA
X:0004H PUBLIC SYS_MEM_Major
X:0005H PUBLIC SYS_SET_POR
X:0006H PUBLIC SYS_Working_Mode
X:0007H PUBLIC XT_RX_DATA
X:0015H PUBLIC SYS_Over_Current_Count
X:0016H PUBLIC XT_TX_DATA
X:0024H PUBLIC CC1101_CH
......
可以看出,“正常”的内存布局的SYS_Overload_Count变量的地址是X:0002H,前一个变量是SYS_Maj_Run_Coe,应该是一个字节的变量。
一般来说,越界几乎都出现在访问数组元素的情况下,那么这个SYS_Maj_Run_Coe自然不会有这种问题。
而异常的内存布局的SYS_Over_Current_Count变量,地址被安排到了X:0015H,前一个变量是XT_RX_DATA,地址为X:0007H,从变量名来看,好像是一个接收数据的缓冲区,长度为15H-7H=14个字节,几乎可以肯定是一个数组,如果接收程序没有限制长度的话,那么当接收到第15个字节时,就会越界覆盖变量SYS_Over_Current_Count。
如果我分析不错的话,楼主遇到的问题就是这样。
然后再补充一下,即使楼主改了变量名,程序也是有隐患的,在“正常”的内存布局中XT_RX_DATA数组的后面是XT_TX_DATA,当越界发生时,数据会覆盖XT_TX_DATA,只是可能XT_TX_DATA很多时候并不包含有效数据,覆盖了也无所谓,发生异常的概率比较小而已。 |