基于ARM Cortex-M的SoC存储体系结构和实战

System on Chip Architecture Tutorial Memory Architecture for ARM Cortex-M based SoC-Aviral Mittal

Memory Architecture for Cortex-M bases System on Chip.

一旦你完成了处理器的选择(即在ARM Cortex-M家族中),内存架构可能是SoC架构的第二个最重要的方面。内存结构取决于处理器的选择。

例如,如果选择Cortex-M7,则处理器中内置指令缓存和数据缓存作为选项,因此内存系统可能没有任何缓存。

Cortex-M7还具有紧密耦合存储器(TCMs),它提供非常快速的代码执行(来自指令TCMs)和非常快速的数据访问(来自数据TCMs)。

NVM Memory choice for code storage.

现在,由于这项技术是关于无主机SoC的,即一个自给自足的SoC,并且是系统的主要SoC,它应该有非易失性存储器(NVM)用于代码存储,而不像“托管”SoC,它通常从“主机”接收其代码,并且代码最终在SoC的RAM中。

Flash or R-RAM as NVM for code storage.

一个流行的选择是NAND Flash。对于28nm以上的几何图形,您也可以使用e-Flash,即嵌入式Flash,即集成在SoC中的闪存,但对于28nm以下的几何图形,由于技术限制,e-Flash通常不可用,因此您可能需要选择外部Flash设备,通常通过SPI接口、四SPI接口(QSPI)或八进制SPI接口。(OSPI)。但是,如果您想让NVM在SoC上实现更精细的几何结构,可以选择R-RAM(电阻RAM)或M-RAM(磁RAM)。然而,您必须记住,R-RAM是一个昂贵的事情,可以大大增加SoC的成本。

ROM for code storage

你可以用ROM,它比Flash或者R-RAM速度快,成本低,功耗低,但是ROM的问题是,它不是很灵活。它不能被覆盖,所以如果你想在后期更新你的系统,ROM不会让它发生。然而,ROM是最“安全”的内存,一般不需要验证或解密等。因此,如果您的系统足够稳定,如果您的代码在系统生命周期内不需要更新,ROM是一种方法。有时,在开发过程中,SoC可能有flash或R-RAM,SoCs的初始版本用flash/R-RAM发布,并且随着代码的成熟,flash/R-RAM被ROM取代。

OnChip R-RAM Vs Flash:

重要的是要考虑到Flash中的代码存储通常是在nandflash中,因为它提供随机访问,而不像NOR Flash那样随机访问是不可能的。

从上表中可以很明显地看出,R-RAM在大多数情况下都是胜出的,因此如果成本允许,并且您的SoC需要更多的性能来降低功耗,R-RAM将是NVM的选择。

然而, R-R a M是一项非常新的技术,并且目前非常昂贵,因此,大多数使用ARM Cortex-M类处理器的soc仍然具有e-Flash或片外Flash。

注:需要注意的是,R-RAM不能替代片上RAM。它仍然有有限的写入周期~10000,因此不能像在SoC上使用普通RAM那样使用。

从安全角度看片内与片外NVM:

片上NVM可以被认为是更安全的,因为您不需要“认证”NVM,因为它是片上的。然而,片外NVM至少在每次系统启动时都需要“身份验证”,以确保片外设备是真正的设备。

XIP vs No XIP.

在考虑NVM时,如果它是Flash或R-RAM(而不是ROM,ROM通常总是XIP),您可能还需要考虑是否需要XIP。XIP执行到位。你可以在这里找到更多关于XIP的信息。

如果您的系统没有高性能要求,XIP可能是一个非常好的建议。它非常经济有效,因为它比片上RAM便宜得多,而且您的代码直接从这个内存执行。即使NVM是片外闪存,使用cache存储器也可以缩小性能差距,为各种应用提供足够的性能。

然而,从片外闪存使用XIP的缺点是高功耗。在片外XIP过程中,您将消耗比将代码一次复制到片上RAM并从片上RAM执行多得多的能量。因此,这些是作为SoC架构师必须做出的权衡。成本/功率/性能。没有对错之路。这取决于你的SoC的用例是什么。

然后不使用XIP意味着代码需要从NVM复制到RAM,这意味着需要更多的内存来存储代码,因为有代码复制。但是在这些情况下,代码在NVM中被压缩,然后解压缩到RAM中,这样可以节省一些内存,但是没有XIP意味着比XIP更多的系统内存。

The Security Aspect of XIP vs no XIP

从安全的角度来看,XIP将需要所谓的内联解密,因为代码在执行时将被解密,因为代码通常将从NVM中的随机位置获取。但是,如果没有XIP,则解密方法将是“块”解密,即在将整个图像复制到系统RAM时对其进行一次解密。

Execute In Place (XIP)

当嵌入式系统在没有电源的情况下启动时,它将执行的第一个代码必须来自非易失性存储器源,例如Flash或ROM。

通常应该有一个“bootloader”程序,它将尽可能少地启动和运行系统。

当系统启动时,它没有可用的ram,因此没有可用的堆栈,因此没有可用的内存来存储程序变量。因此,处理器运行的第一个代码必须完全使用处理器寄存器。处理器执行的第一个代码也从它所在的位置执行。也就是说,它是“就地执行”(XIP)。它不能试图修改程序本身的任何内容,因为这段代码可能在ROM中,并且代码不能自我修改。

由于上述考虑,处理器通电后执行的第一个程序通常用汇编语言编写,因为c程序的执行几乎总是需要在读/写存储器(RAM)中设置一个“堆栈”来存储变量,并且在启动或通电时RAM可能不可用。

引导加载程序要做的一件事是使系统RAM可用。然后,它可以将代码从flash重新定位到这个ram中,然后跳到ram来执行这个复制或重新定位的代码。

是的,对于所有的XIP代码,load region=execution region,也就是说,XIP代码存储在根区域中。记住“根区域”的定义是加载地址为=执行地址的区域。

Other applications of XIP:

除了引导加载程序代码之外,XIP在嵌入式世界中也越来越流行,它可以直接从Flash中执行引导代码以外的程序。NOR flash可以像NAND那样随机访问,因此NOR flash显然是这样的XIP存储和就地执行代码的选择。这有助于节省片上ram区域,而这反过来又可以节省成本。当然,执行速度会比RAM执行慢,但是对于许多嵌入式应用程序来说,它带来了成本优势,并提供了足够的性能。

Load Region Vs Execute Region:

在典型的嵌入式系统中,当系统断电时,所有的程序和数据都存储在非易失性存储器中。然而,当系统通电时,一些数据或代码可以在执行前(如果是代码)或在使用前(如果是数据)移动到系统SRAM(volatile mem)中。

当用户编译并“链接”程序时,会生成该程序的“图像”。这是系统可以执行的二进制可执行文件。

二进制“image”通常分为“Read Only”段(包含代码和只读数据)和“Read Write”段(包含可以初始化或零初始化甚至未初始化的数据)。

通常“只读”段甚至可以放入ROM(与flash相反),并且不需要从内存中的位置移动。它是“从它所在的地方执行”即它是在适当的地方执行的。

而“读写”段必须在执行开始前移入系统的读/写存储器,例如SRAM。

因此,对于代码的某些部分,系统关机时该部分所在的内存位置与系统开机时相同。

但是

对于代码的某些部分,当系统处于关机状态时,该部分所在的内存位置与开机时该部分移动到的内存位置不同。

那么谁来移动代码呢?

链接器将把代码添加到处理器将要执行的程序中,并移动代码中需要在通电时移动到系统SRAM中的那些部分。

现在,这些代码段在“加载”时有不同的地址,这是在NVM中,而在“执行”时,通常是在SRAM中的某个地方。

因此,程序映像可以有“加载区域=执行区域”的部分,并且这部分代码是“就地执行”XIP。

对于代码的某些其他部分,“加载区域不等于执行区域”,并且这部分代码没有在适当的位置执行。

Example:

用户有它的应用程序代码,他编译并链接它以生成名为'图像.bin'. '图像.bin'是14246字节。

这意味着系统必须至少有该数量的NVM可供用户在系统中匹配其二进制图像。

然后,系统将具有一些SRAM(比如16KB,在本例中相当慷慨),这是在0x2000_0000和0x2000_3FFF位置。

现在是图像文件的永久地址'图像.bin'将在NVM中,并将占用系统中的内存地址0x0000_0000到0x0000_37A6。

因此,整个二进制文件的加载地址是从0x0000_0000到0x0000_37A6。这可以是一个NVM(闪存),甚至可以是ROM。

但在执行之前,作为最低要求

应设置堆栈内存。

r/w数据(如变量)必须移动到r/w存储器

系统的R/W内存(假设系统中总共有16KB的SRAM可用)位于内存映射中的其他位置,并假设它是从0x2000_0000到0x2000_3FFF(16KB)。

因此image.bin'将被移动到位于0x2000_和0x2000_3FFF之间的内存位置。堆栈指针将被设置为为为“stack”保留一些内存,这些内存也将位于0x2000_0000和0x2000_3FFF之间。

因此,对于图像.bin'文件,加载地址=执行地址,并且它保持永久性,并且在0x0000_0000和0x0000_37A6之间。这也是XIP,在图像.bin'.

鉴于图像.bin'文件,加载地址在0x0000~0x0000~37A6之间,执行地址在0x2000~0x2000~3FFF之间。i、 e.对于这些部分,加载地址不等于它们的执行地址。

Let us take another example where the Load address is not the same as execution address:

用户有一个用C编写的关键函数。包含此函数的图像文件放在NVM中。但是,用户希望将此函数移到离处理器非常近的SRAM中,以便快速执行。

现在这个函数有两个内存地址。

1. 加载地址:当系统关机时,该函数在NVM内存中的位置

2.执行地址:当系统启动并运行时,函数在SRAM内存中的位置。

同样,对于这个函数,加载地址与其执行地址不同。

因此,此代码将不是XIP(就地执行)。

Conclusion:

二进制图像中的某些代码可以从内存中的位置执行。此代码永远不会“移动”到内存的另一个区域,并且具有永久地址。当执行此代码时,它是从它所在的位置执行的,这称为就地执行(XIP)。

基于ARM Cortex-M的SoC存储体系结构和实战的更多相关文章

  1. 《嵌入式软件设计基础——基于ARM Cortex—M3》读书笔记

    此书有点深,记录点自己能够看懂的. 1.内存管理一章:讲到变量的类型.生存周期.内存分配. auto static register 局部变量,全局变量 malloc free 内存碎片,消除内存池的 ...

  2. 灵动微电子ARM Cortex M0 MM32F0010 GPIO 的配置驱动LED灯

    灵动微电子ARM Cortex M0 MM32F0010 GPIO的配置 目录: 1.前言 2.学习方法简要说明 3.要点提示 4.注意事项 5.MM32F0010系统时钟的配置 6.MM32F001 ...

  3. 基于ARM的SoC设计入门[转]

    原文:基于ARM的SoC设计入门 我们跳过所有对ARM介绍性的描述,直接进入工程师们最关心的问题.要设计一个基于ARM的SoC,我们首先要了解一个基于ARM的SoC的结构.图1是一个典型的SoC的结构 ...

  4. 基于ARM处理器的反汇编器软件简单设计及实现

    写在前面 2012年写的毕业设计,仅供参考 反汇编的目的 缺乏某些必要的说明资料的情况下, 想获得某些软件系统的源代码.设计思想及理念, 以便复制, 改造.移植和发展: 从源码上对软件的可靠性和安全性 ...

  5. 基于ARM的射频识别读卡器电路设计

    http://tech.yktworld.com/201010/201010032128115666.html 来源:一卡通世界      作者:江小平,李中捷,余晓峰      2010-10-3 ...

  6. 【DSP开发】【Linux开发】基于ARM+DSP进行应用开发

    针对当前应用的复杂性,SOC芯片更好能能满足应用和媒体的需求,集成众多接口,用ARM做为应用处理器进行多样化的应用开发和用户界面和接口,利用DSP进行算法加速,特别是媒体的编解码算法加速,既能够保持算 ...

  7. 浅析基于ARM的Linux下的系统调用的实现

    在Linux下系统调用是用软中断实现的,下面以一个简单的open例子简要分析一下应用层的open是如何调用到内核中的sys_open的. t8.c 1: #include <stdio.h> ...

  8. 《基于Arm实验箱的国密算法应用》课程设计 结题报告

    <基于Arm实验箱的国密算法应用>课程设计 结题报告 小组成员姓名:20155206赵飞 20155220吴思其 20155234昝昕明 指导教师:娄嘉鹏 设计方案 题目要求:基于Arm实 ...

  9. SQL Server 2008空间数据应用系列八:基于Bing Maps(Silverlight)的空间数据存储

    原文:SQL Server 2008空间数据应用系列八:基于Bing Maps(Silverlight)的空间数据存储 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft S ...

随机推荐

  1. 【原创】Centos8安装ansible

    1.安装步骤 # 安装epel扩展源 dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rp ...

  2. 硬盘分区形式(MBR、GPT)、系统引导、文件系统、Inode和Block

    目录 MBR和GPT MBR的局限性 GPT的优势 主分区.扩展分区和逻辑分区 挂接卷 Legacy.UEFI引导和GRUB引导 文件系统(FAT16.32.NTFS和EXT2.3.4.Xfs.Tmp ...

  3. UVA11520填充正方形

    题意:      给你一个n*n的矩阵,让你往里面添加大写字母,矩阵有的字母已经给填好了,然后要求是每个格子都不能与他相邻的格子的大写字母相同,如果有多个答案,输出从上到下,从左到右所连接的成的那个n ...

  4. 006-Java的访问权限控制符和包导入机制

    目录 一.Java的访问权限控制符 一.访问控制符的作用 二.访问控制符的分类 二.Java的包导入机制 一.为什么要使用package? 二.package怎么用? 三.对于带有package的ja ...

  5. Asp.NetCore Web开发之初始文件解析

    在写代码之前,有必要了解一下.net帮我们生成的文件都是干什么用的,在开发过程中他们都负责那些地方(下面以MVC模板举例). 先简单介绍一下什么是MVC,MVC(model-view-controll ...

  6. Spring Cloud Alibaba(10)---Sentinel控制台搭建+整合SpringCloudAlibaba

    上一篇博客讲了Sentinel一些概念性的东西 Spring Cloud Alibaba(9)---Sentinel概述 这篇博客主要讲 Sentinel控制台搭建,和 整合SpringCloudAl ...

  7. 与find不同,locate并不是实时查找。你需要更新数据库,以获得最新的文件索引信息。updatedb

    find是实时查找,如果需要更快的查询,可试试locate:locate会为文件系统建立索引数据库,如果有文件更新,需要定期执行更新命令来更新索引库: $locate string 寻找包含有stri ...

  8. 配置trunk和access

    配置trunk和access 拓扑图 PC地址设置 PC1 :192.168.1.1 vlan10 PC2 :192.168.1.2 vlan10 交换机配置 LSW3配置 <Huawei> ...

  9. 【转载】CentOS 7 系统区域(语言)和键盘设置

    CentOS 7 系统区域(语言)和键盘设置   即使是在window中,平常说的语言设置这一项也是归类为系统区域,CentOS可以通过修改/etc/locale.conf配置文件或使用localec ...

  10. STM32的引脚的配置

    http://blog.csdn.net/u010592722/article/details/45746079