SoC嵌入式软件架构设计之一:系统内存需求评估

内存是SoC(System on Chip,片上系统)集成设计的重要模块,是SoC中成本比重较大的部分。内存管理的软硬件设计是SoC软件架构设计的重要一环,架构设计师必须要在成本和效率中取得平衡,做到在节省内存的同时保证整个系统的性能。系统内存需求评估是对嵌入式软件架构师的最基本要求,同时也是其最重要的技能之一。一般在SoC项目立项的时候,架构师就要完成系统内存需求评估。

下面以一个多媒体电子解决方案中的SoC设计为原型,说明大致的评估流程:

1. 根据产品规格,对各个应用场景进行功能和性能分解

产品规格一般会描述应用功能场景和性能。架构师要对各个场景进行功能和性能分解,分析各个场景在内存使用上的关系。包括:

1)列出所有的应用场景,明确各个应用的生命周期,在什么时候开始,什么时候结束。

2)系统是否要同时支持多个应用(多进程),例如听歌曲的时候要浏览图片,这意味中两个应用是同时利用内存,不能进行应用内存分时复用;

3)系统是否要同时支持多种介质,例如同时访问卡设备和闪存设备,一般在单进程时都只是访问单种存储设备,除非是实现数据复制,但在多进程的时候,不同的进程访问不同的存储设备也很正常,同时访问不同的存储设备意味着两种驱动是同时使用内存。

4)系统是否要同时支持多种文件系统。不同的存储设备可能部署不同的文件系统,其同样存在2)中的问题。

5)明确系统支持的编解码格式,其表现为算法内存需求。不同的编解码格式对内存的要求不同的,同样的算法时,不同的速率也导致不同的内存需求。

6)系统性能要求,例如LCD刷屏,有大块framebuffer自然会有更好的性能。

2. 对系统软件进行分层,明确每一层模块的组成

1)系统分启动、驱动、操作系统、文件系统、中间件(算法、UI)、应用框架、应用等层次,一般的消费类电子产品,如多媒体设备、游戏机等产品系统都会分成多个层次。每个层次又会有多个模块组成,如驱动分字符设备驱动和块设备驱动,一般按键属于字符设备,存储设备一般属于块设备;存储设备里可能支持nand flash、SD-MMC card、Uhost等;文件系统又有FAT32、exfat等等;应用层当然会包括很多个应用程序。

2)明确每个应用实现所需要的软件层次。有些应用可能要很多层,如音乐,从应用到应用框架(UI+按键)、API、中间件(解码)、操作系统、驱动等层次,而设置应用是不需要解码中间件的。

3. 明确每个软件层次中内存分时复用的模块,找出最大内存需求的模块

如《节省内存的嵌入式软件设计技巧》这篇文章提到,应用、驱动、中间件、数据段都存在着复用的需求。要在2)中的各个软件层次中区分各个不同的组成模块,明确各个模块是否能够进行分时复用。在复用的情况下,找出最大内存需求的模块,如nand flash驱动要比card驱动复杂,那nand flash驱动的内存需求自然要高;而音乐应用自然要比设置或者FM等应用要复杂,其内存需求自然也要更多。

4.对最大内存需求模块的代码进行分析,大致明确其常驻内存代码和分块(bank)管理的代码。

常驻代码段一般是调用频繁的、性能要求高的代码段,如中断管理、消息管理等。一般应用中大量的代码是可以按需加载执行的,如音乐的音效管理和音量设置这些功能代码并不要求很高的执行性能,其是可以分时加载到内存执行,能够达到内存分时复用的目的。

5.确定各个软件层次的常驻代码空间和分时复用内存的空间

在成本的要求下尽可能减少常驻代码空间,会导致代码执行性能的降低,因为bank代码执行前要先进行加载,一般是从nand flash或者card中读取;在成本的要求下我们也想尽可能减少bank代码复用的内存空间,同样会导致bank代码切换频繁而降低性能,因此也不能一味地减少内存,而是仔细分析各个子模块的功能和性能对内存的大致要求。例如两个子模块的函数实现是8k和4k,那我们可以考虑2K的复用空间,即前者分成4个bank,后者2个bank,是否能够达到性能;如果复用空间设置为4K,效率会高一些,但成本会增加;如果设置为1k,那前者就会有8个bank,切换次数过多。

6.明确可以固化的代码空间

应用的常驻代码是不能固化的,因为不同的应用都需要常驻代码,即其是变化的,而像操作系统的中断管理、时间管理、任务调度管理等代码一般是不变的,其可以固化到ROM中,这样能达到节省内存的目的。

7.考虑其他特殊的需求

通过6,我们可以大致得到整个系统的内存需求。这时要考虑一些特殊的场景的内存需求,看之前制定的内存是否能够满足这个场景。例如启动阶段的内存需求分布,OS引导初始化时的内存要求等。这些并不是产品的规格,同样是架构设计师要考虑的。

一般会对6中得到的内存再次评估,以进行细微的调整。

时间: 2024-08-06 11:57:24

SoC嵌入式软件架构设计之一:系统内存需求评估的相关文章

SoC嵌入式软件架构设计之四:内存空间规划分配

本文继续阐述基于低端控制器CPU的SoC固件架构设计.第一节 SoC嵌入式软件架构设计之一:系统内存需求评估 讲述了系统内存需求的评估.这一节讲述内存空间的具体规划分配.CPU有两种体系结构:哈佛结构和冯诺依曼结构.哈佛结构是一种将程序指令存储和数据存储分开的存储器结构,如80251,代码空间与数据空间完全分开,独立编址:冯诺依曼结构是一种将程序指令存储器和数据存储器合并在一起的存储器结构,如MIPS,ARM等,其代码和数据空间是统一编址.这里就以冯诺依曼体系结构为例. 一.嵌入式系统软件分层

SoC嵌入式软件架构设计之四 :内存空间规划分配

本文继续阐述基于低端控制器CPU的SoC固件架构设计.第一节 SoC嵌入式软件架构设计之一:系统内存需求评估 讲述了系统内存需求的评估.这一节讲述内存空间的具体规划分配.CPU有两种体系结构:哈佛结构和冯诺依曼结构.哈佛结构是一种将程序指令存储和数据存储分开的存储器结构,如80251,代码空间与数据空间完全分开,独立编址:冯诺依曼结构是一种将程序指令存储器和数据存储器合并在一起的存储器结构,如MIPS,ARM等,其代码和数据空间是统一编址.这里就以冯诺依曼体系结构为例. 一.嵌入式系统软件分层

SoC嵌入式软件架构设计II:否MMU的CPU虚拟内存管理的设计与实现方法

大多数的程序代码是必要的时,它可以被加载到内存中运行.手术后,可直接丢弃或覆盖其他代码.我们PC然在同一时间大量的应用,能够整个线性地址空间(除了部分留给操作系统或者预留它用),能够觉得每一个应用程序都独占了整个虚拟地址空间(字长是32的CPU是4G的虚拟地址空间),但我们的物理内存仅仅是1G或者2G.即多个应用程序在同一时候竞争使用这块物理内存.其必定会导致某个时刻仅仅存在程序的某个片段在运行,也即是全部程序代码和数据分时复用物理内存空间-这就是内存管理单元(MMU)工作核心作用所在. 处理器

SoC软件架构设计之一:系统内存需求评估

内存是SoC(System on Chip,片上系统)集成设计的重要模块,是SoC中成本比重较大的部分.内存管理的软硬件设计是SoC软件架构设计的重要一环,架构设计师必须要在成本和效率中取得平衡,做到在节省内存的同时保证整个系统的性能.系统内存需求评估是对嵌入式软件架构师的最基本要求,同时也是其最重要的技能之一.一般在SoC项目立项的时候,架构师就要完成系统内存需求评估. 下面以一个多媒体电子解决方案中的SoC设计为原型,说明大致的评估流程: 1. 根据产品规格,对各个应用场景进行功能和性能分解

SoC嵌入式软件架构设计之二:虚拟内存管理原理、MMU硬件设计及代码分块管理

程序的大部分代码都可以在必要的时候才加载到内存去执行,运行完后可以被直接丢弃或者被其他代码覆盖.我们PC上同时跑着很多的应用程序,每个应用程序使用的虚拟地址空间几乎可以整个线性地址空间(除了部分留给操作系统或者预留它用),可以认为每个应用程序都独占了整个虚拟地址空间(字长是32的CPU是4G的虚拟地址空间),但我们的物理内存只是1G或者2G.即多个应用程序在同时竞争使用这块物理内存,其必然会导致某个时刻只存在程序的某个片段在执行,也即是所有程序代码和数据分时复用物理内存空间—这就是内存管理单元(

SoC嵌入式软件架构设计之三:代码分块(Bank)设计原则

上一节讲述了在没有MMU的CPU(如80251.MIPS M控制器系列.ARM cortex m系列)上实现虚拟内存管理的集成硬件设计方法,新设计的内存管理管理单元要实现虚拟内存管理还需要操作系统.代码分块(Bank)的支持,详见SoC嵌入式软件架构设计之二:没有MMU的CPU实现虚拟内存管理的设计方法.这里要阐述Bank设计的一些原则. Bank设计是为了实现不同时刻运行的Bank(代码块)运行在同一块内存上,所以在运行之前操作系统需要将已存在内存的代码/数据进行缓存处理,并加载将要运行的Ba

SoC嵌入式软件架构设计之七:嵌入式文件系统设计

嵌入式的系统区(system disk,SD)包括操作系统.驱动.中间件.应用和字库.UI资源等文件,本文讲述SD区的文件系统设计.文件系统最主要的目标是为了实现单个文件的定位和读写.因为一般代码都是不可自修改的,即量产之后不会有写操作,嵌入式系统的SD文件系统就是为了能够简单.高效地定位某个文件和读取文件中的数据.设计原则和要点有以下几方面: 1. 逻辑连续存储单个文件,以扇区对齐. SD区的单个代码和资源文件一般都不大,所以不必要像fat32文件系统那样用fat表把文件簇串起来,直接逻辑连续

SoC嵌入式软件架构设计之六:API设计方法

在嵌入式系统中,驱动都是以API的方式提供给应用进行调用.这里介绍嵌入式系统的API设计和管理方法. 驱动在系统中会按模块进行分类,例如按键驱动.LCD驱动.文件系统.card驱动.I2C驱动等等:每个模块又有多个接口,例如LCD驱动有光标定位.画点.画直线等,而文件系统有fread.fwrite.fseek.fopen等接口.以下举例将以文件系统的fopen为例,工具链为mips. 一.API设计方法 1. 驱动接口声明:extern FILE * fopen(const char * pat

SoC嵌入式软件架构设计之五:可执行程序的重构

低端控制器对执行效率要求很高,成本敏感,因而SoC内置SRAM是紧缺资源.代码分块管理就是为了充分利用内存,提高内存的复用效率而提出的一种设计方法.代码分块管理不仅涉及到硬件,同样对操作系统和应用.驱动的设计都有要求,这些模块共同努力以使执行效率达到最高. 本节讲述代码分块(Bank)管理思想下可执行文件的重构,即对程序编译后的可执行文件进行重新组织.打包,以在加载阶段获得最高的执行效率,减少内存占用.要使执行效率高,意味着可执行文件的格式尽可能简单,解析执行文件的流程简单,相应地,解析过程代码