1、对全局变量的初始化。
2、还没发现的事例。
/*************************************************/
先上连接文件sct
LR_ROM1 0x30000000 0x00010000 { ; load region size_region ER_ROM1 0x30000000 0x00010000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_RAM1 0x30010000 0x02000000 { ; RW data .ANY (+RW +ZI) } RW_IRAM1 0x40000000 0x00001000 { .ANY (+RW +ZI) } }
1、对全局变量的初始化 。
本身MDK对已初始化的全局变量的初始化就不对。
没法用。
代码:
int gr_a = 1 ; int gr_b ; int const gr_c = 11; static int gr_s = 22; void variable_test() { Uart_Printf( "int gr_a = 1 ; gr_a = %d ", gr_a); Uart_Printf( "int gr_b ; gr_b = %d ", gr_a); Uart_Printf( "int const gr_c; gr_c = %d ", gr_c); Uart_Printf( "static int gr_s; gr_s = %d ", gr_s); Uart_Printf( "&gr_a = %08x ", &gr_a); Uart_Printf( "&gr_b = %08x ", &gr_b); Uart_Printf( "&gr_c = %08x ", &gr_c); Uart_Printf( "&gr_s = %08x ", &gr_s); }
jlink运行时现象:没有将代码中已初始化的变量正确地赋值。
int gr_a = 1 ; gr_a = 0 int gr_b ; gr_b = 0 int const gr_c; gr_c = 11 static int gr_s; gr_s = 0 &gr_a = 30010038 &gr_b = 30010064 &gr_c = 30009244 //.ro &gr_s = 3001003c
烧写运行时现象:代码中未初始化、已初始化的全局和静态变量都被设为 ~0 .
int gr_a = 1 ; gr_a = -1 int gr_b ; gr_b = -1 ;init.s的代码中有对bss段清零的操作,在汇编代码中用led调试发现,我的clear bss的代码是已经运行了的。 猜测全局变量完全被编译器玩坏了。
int const gr_c; gr_c = 11 static int gr_s; gr_s = -1 &gr_a = 30010038 &gr_b = 30010064 &gr_c = 30009244 &gr_s = 3001003c