参阅官方文档得知。
AT32F403A关于ZW-NZW-SRAM的大小选择配置有两种
1 ZW:256KB,NZW 768KB,SRAM:96KB (默认配置)
2 ZW:128KB,NZW 896KB,SRAM:224KB
究其原理是MCU的flash运行速度相对较慢,芯片有机制把flash的代码在上电后自动加载到内存来运行。
(相当于内存被划分为两部分,1是运行代码-ZW,2是存储数据-SRAM)
由此可以理解和解释上述两种配置方案。
配置1:总内存是352KB,运行代码为256KB,存储数据为96KB
配置2:总内存是352KB,运行代码为128KB,存储数据为224KB
非零等待(NZW)的执行速率是零等待(ZW)的 0.4 倍,实测更低,针对这个情况,需要我们把实时性要求高的函数-功能组件调到ZW区域为宜,以免出现不可意料的问题。
关于把优先级高的函数编译到ZW区域的icf配置,可参阅 这篇文章https://blog.csdn.net/hiqaxe/article/details/115842317
查找关于这方面的资料 梳理如下:
FMC 选择字节说明,通过配置 EOPB0 选择,地址是: 0x1FFF_F810,EOPB0=0xFF 表示片上 SRAM 为 96KB, EOPB0=0xFE 表示片上 SRAM 为 224KB。 使能 EOPB0 有效必须
要掉电或 RESET 一次。(特别的是,这个是选项字节的设置,断电后保存,重新上电会生效)
① 使用 ICP
② ISP
③在boot启动时调用如下的函数来修改
void Extend_SRAM(void)
{
// check if RAM has been set to 224K, if not, change EOPB0
if(((UOPTB->EOPB0) & 0xFF) != 0xFE)
{
/* Unlock Option Bytes Program Erase controller */
FLASH_Unlock();
/* Erase Option Bytes */
FLASH_EraseUserOptionBytes();
/* Change SRAM size to 224KB */
FLASH_ProgramUserOptionByteData((uint32_t)&UOPTB->EOPB0,0xFE);
NVIC_SystemReset();
}
}
④ 启动文件启动时调用上述的修改函数来修改。
; Default interrupt handlers.
THUMB
PUBWEAK Reset_Handler
SECTION .text:CODE:REORDER:NOROOT(2)
EXTERN Extend_SRAM
Reset_Handler
MOV32 R0,#0x20001000
MOV SP,R0
LDR R0,=Extend_SRAM
BLX R0
MOV32 R0,#0x08000000
LDR SP,[R0]
LDR R0, =SystemInit
BLX R0
LDR R0, =__iar_program_start
BX R0