代码执行方式及存储器


前言

经常接触到诸如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?


总结

如有错误,欢迎指点一二

参考

  1. 内核启动流程-程序员ITS201
  2. XIP技术-数字IC设计学习之路
  3. Cache-血糯米冰酪
  4. XIP与BootROM-sudaroot
  5. FLASH区别-寒听雪落
  6. 单片机内存解释-dtj-ee
  7. 《ARM Cortex-M3/M4权威指南》
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值