垦请高手帮忙: 在实际应用中,有时RAM中数据在复位后要保留,比如上次产生的记录 ,不能上电后就初始化掉。而KEIL的加载文件不知道如何设置才能防止RAM被初始化。 我这样设置的: LR_IROM1 0x08000000 0x00020000 { ; load region size_region ER_IROM1 0x08000000 0x00020000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } ER_RW 0x20001000 0x4000{ * (+RW +ZI) } ER_RSV 0x20000000 UNINIT { ram.o(ER_RSV) } } 0X2000000-0X20001000 设置成UNINIT, 用于存放RAM.C 里面定义的变量。 检查MAP 文件,地址分配是正确的,但是DEBUG时却发现: 每次复位CPU,KEIL内嵌的__SCATTER_COPY 还是会把数据清掉! |
RE:如何禁止KEIL 初始化RAM?请高手帮忙
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"的变量放这里
}
}
回复:如何禁止KEIL 初始化RAM?请高手帮忙
已解决。
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"的变量放这里
}
}
我也遇到了跟楼主一样的问题,希望的到解决。
.\obj\V_OV7660_STM32.sct(7): error: L6236E: No section matches selector - no section to be FIRST/LAST.
LR_IROM1 0x08000000 0x00010000 { ; load region size_region
ER_IROM1 0x08000000 0x00010000 { ; load address = execution address
*.o (Init, +First) //是这行错误,原来是(reset,+FIRST),现在这样也不行。要怎么解决。我的工程也是从IAR转来的。原来是IAR的工程。用的《STM32 IAR工程->Keil MDK转换详解》这篇文章里的那位仁兄的启动文件,现在只剩下这个错误。
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00010000 { ; RW data
.ANY (+RW +ZI)
}
}
LR_IROM2 0x08010000 0x00010000 {
ER_IROM2 0x08010000 0x00010000 { ; load address = execution address
.ANY (+RO)
}
}