KEIL 工程师给的方案:
利用输入段使用OVERLAY,而不是NOINIT.
指定单个变量不初始化:
int print_time __attribute__ ((section ("ER_RSV")));
指定文件内所以变量不被初始化:
#pragma arm section code ="ER_RSV", rwdata = "ER_RSV"
int abc;
int systick;
int sys_var1;
#pragma arm section code, rwdata
;
*************************************************************
; *** Scatter-Loading Description File generated by uVision
***
;
*************************************************************
LR_IROM1 0x08000000 0x00020000 { ; load region size_region
ER_IROM1 0x08000000 0x00020000 { ; load address = execution
address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00004000 { ; RW data
.ANY (+RW +ZI)
}
OVERLAY_RAM1 0x20004000 OVERLAY {
*.o (ER_RSV) ;所有模块的指定段为"ER_RSV"的变量放这里
}
}
|
|
|
补充文件
UNINIT.C
__attribute__((zero_init)) char
cStartFlag[2];
2.uninit.sct
;
*************************************************************
; *** Scatter-Loading Description File generated by uVision
***
; *************************************************************
LR_IROM1 0x08000000 0x00002800
{ ; load
region size_region
ER_IROM1 0x08000000 0x00002800
{ ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00004000
{ ; RW data
.ANY (+RW +ZI)
}
RW_IRAM2 0x20004000 UNINIT
0x00001000 {
uninitvar.o (+RW +ZI)
}
}
加载中,请稍候......