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 = %dn", gr_a);
Uart_Printf( "int gr_b ; gr_b = %dn", gr_a);
Uart_Printf( "int const gr_c; gr_c = %dn", gr_c);
Uart_Printf( "static int gr_s; gr_s = %dn", gr_s);
Uart_Printf( "&gr_a = %08xn", &gr_a);
Uart_Printf( "&gr_b = %08xn", &gr_b);
Uart_Printf( "&gr_c = %08xn", &gr_c);
Uart_Printf( "&gr_s = %08xn", &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