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中得到的内存再次评估,以进行细微的调整。


     请关注SoC嵌入式软件架构设计(控制器SoC固件架构)系列博文:

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

SoC嵌入式软件架构设计之二:没有MMU的CPU实现虚拟内存管理的设计方法

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

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

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

嵌入式:节省内存的软件设计技巧




posted @ 2017-08-14 21:02  jzdwajue  阅读(329)  评论(0编辑  收藏  举报