前言
经常接触到诸如Flash, SRAM, SDRAM, ROM等关键词,但在以往的应用开发中很少有较深入的了解,这里笔者做一下相关笔记。
一、存储器映射
下图是存储器映射,代码无法在外设、设备、系统存储区执行。若运行于RAM\SRAM区域,取指令需要一个额外的周期。
二、代码执行方式
1.BootROM方式
易知,代码从0x0000 0000,偏移0x4的bootrom开始执行。人为的,我们将程序段从相应存储区域映射到对应地址,如eflash的0x0800 0000地址。
bootloader + app 方式
boot至内部flash启动(例如0x0800 0000) >> 配置外部RAM存储器(SDRAM/SRAM) >> RAM拷贝App代码(SDCARD/SPI-FLASH/外部ROM)就地执行
用户App应与外部RAM链接
1.1完全映射
运行时,将所有代码从非易失性存储器(flash/rom)复制到ram中。
LR_IROM1 0x20000000 0x000E0000 { ; load region size_region
ER_IROM1 0x20000000 0x000E0000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20010000 0x00020000 { ; RW data sram
.ANY (+RW +ZI)
}
}
1.2部分映射
按需分页,代码部分复制到ram中。若访问产生页错位,则代码和数据都放入ram。
//待补充
//xxxx.sct
1.3内部flash执行
设内部flash映射地址0x0800 0000,bootloader将程序指针跳转到0x0800 0000,偏移0x4开始执行,即执行汇编xxx.s文件,配置c语言等环境。
相应的.sct文件编辑如下,
//08EFM.sct
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 0x00020000 { ; RW data sram
.ANY (+RW +ZI)
}
RW_ERAM1 0x80000000 0x00200000 { ; 外部SDRAM
.ANY (EXRAM) ;选择EXRAM 节区
}
}
其中:Code为程序代码部分
RO-data 表示 程序定义的常量const temp;
RW-data 表示 已初始化的全局变量
ZI-data 表示 未初始化的全局变量
.map文件如下,
2.XIP方式
XIP(eXecute In Place), 芯片内执行,指MCU直接从存储器中读取程序代码执行,无需从存储器中先读到ram再从ram执行代码。
//待补充
Nand FLASH(✘)
读取操作基于扇区,速度相对较慢(us级),不适合实现XIP。数据线地址共用,写速度比Nor快,适合做成存储和下载系统。类似于SPI FLASH。
Nor FLASH(✔)
数据线地址线分开,随机寻址,按块擦除慢,读取时序接近SRAM(约100ns)。可以进行字节寻址,代码可以在Nor FLASH运行。
QSPI FLASH(✔)
类似于Nor Flash?
总结
如有错误,欢迎指点一二
参考
- 内核启动流程-程序员ITS201
- XIP技术-数字IC设计学习之路
- Cache-血糯米冰酪
- XIP与BootROM-sudaroot
- FLASH区别-寒听雪落
- 单片机内存解释-dtj-ee
- 《ARM Cortex-M3/M4权威指南》