一、
char dbg_info[1024];
for(uint8_t i=0; i<Uart2Para.Rxcnt; ++i)
sprintf(dbg_info+3*i, "%02X ", Rx2_buf[i]);
开始设置的dbg_info数组长度是512,程序中Uart2Para.Rxcnt有次达到193,此时dbg_info数组访问越界,造成程序运行异常
二、
uint8_t lx12864_string[17];
sprintf((char *)lx12864_string, "%4d-%02d-%02d %02d:%02d", calendar.w_year, calendar.w_month, calendar.w_date, calendar.hour, calendar.min);
LxShow(4, lx12864_string);
开始定义的lx12864_string数组长度为16,sprintf后字符串尾会自动添加0,导致地址lx12864_string+17处赋值0,长度为16就会覆盖其他变量值,覆盖的什么变量可以在.map文件查看
本例中 .map 文件部分如下:
g_Battery_Capacity 0x2000065c Data 4 packet.o(.data)
g_Total_Working_Time 0x20000660 Data 4 packet.o(.data)
g_Working_time 0x20000664 Data 4 packet.o(.data)
uwTickFreq 0x20000668 Data 1 stm32f1xx_hal.o(.data)
uwTickPrio 0x2000066c Data 4 stm32f1xx_hal.o(.data)
uwTick 0x20000670 Data 4 stm32f1xx_hal.o(.data)
SystemCoreClock 0x20000674 Data 4 system_stm32f1xx.o(.data)
user_data 0x2000067c Data 256 main.o(.bss)
hadc1 0x2000077c Data 48 adc.o(.bss)
calendar 0x200007ac Data 16 rtc.o(.bss)
datestring 0x200007bc Data 50 rtc.o(.bss)
timestring 0x200007ee Data 50 rtc.o(.bss)
weekstring 0x20000820 Data 50 rtc.o(.bss)
hrtc 0x20000854 Data 20 rtc.o(.bss)
htim3 0x20000868 Data 72 tim.o(.bss)
htim6 0x200008b0 Data 72 tim.o(.bss)
Rx1_buf 0x200008f8 Data 256 usart.o(.bss)
Uart1Para 0x200009f8 Data 12 usart.o(.bss)
Rx2_buf 0x20000a04 Data 1280 usart.o(.bss)
Uart2Para 0x20000f04 Data 12 usart.o(.bss)
huart1 0x20000f10 Data 68 usart.o(.bss)
huart2 0x20000f54 Data 68 usart.o(.bss)
data_buf 0x20000f98 Data 256 scl3300.o(.bss)
SCL3300_D01_Handle 0x20001098 Data 35 scl3300.o(.bss)
lx12864_string 0x2000113b Data 17 lx12864.o(.bss)
cfg_info 0x2000114c Data 1329 config.o(.bss)
ServerIP 0x2000167d Data 16 config.o(.bss)
storage_item 0x2000168d Data 32 mysql.o(.bss)
packet_head 0x200016ad Data 23 packet.o(.bss)
heartbeat_packet 0x200016c4 Data 12 packet.o(.bss)
basicinfo_packet 0x200016d0 Data 176 packet.o(.bss)
workingstate_packet 0x20001780 Data 64 packet.o(.bss)
probleminfo_packet 0x200017c0 Data 29 packet.o(.bss)
polelean_packet 0x200017dd Data 59 packet.o(.bss)
svrack_packet 0x20001818 Data 12 packet.o(.bss)
dbg_info 0x20001824 Data 1024 packet.o(.bss)
pFlash 0x20002428 Data 32 stm32f1xx_hal_flash.o(.bss)
__initial_sp 0x20004448 Data 0 startup_stm32f103xe.o(STACK)
lx12864_string后面是cfg_info,所以lx12864_string越界后覆盖了cfg_info的值,实际程序运行也是如此,cfg_info的首字节被赋0
lx12864_string要定义17字节