本文属于ADAS控制器开发系列。以智能前视摄像头模块为基础。主要介绍下ADAS/AD ECU的存储topic。

数据存储与管理这个系统BB(Building Blocks),主要是定义控制器模块的存储机制。在智能前视摄像头模块中,一般有三个存储位置,即MCU芯片中的RAM、片上Flash (Embedded Flash Memory)和位于MCU外部的一个大型Flash芯片。其中,片上Flash和外部大型Flash就叫做该控制器模块的NVM。所谓NVM,即Non-volatile memory,非易失存储器,具有非易失、按字节存取、存储密度高、低能耗、读写性能接近DRAM,但读写速度不对称,寿命有限。

外部大型Flash主要存储Mobileye芯片的VFP需要运行的程序和相关数据。

片上Flash主要存储主MCU芯片的程序和相关数据,如图1所示的Memory Map:

图1 片上Flash的Memory Map

如上图所示,片上Flash包括CodeFlash、DataFlash和NVRAM三大片区域。

CodeFlash用于存储代码,包括BL和APP的程序代码,以及相关的固定标定参数代码。

DataFLash包括两部分,空间较小的那部分存储一些基本信息,例如制造相关信息、SBAT相关信息、TAC相关信息等。空间较大的那部分区域则是用来做模拟EEPROM。这部分区域主要有软件层面的一个叫做KAMM(Keep-Alive Memory Manager)的模块来管理,因此这部分空间也叫KAM(Keep-Alive Memory)空间。

NVRAM( Non-Volatile Random Access Memory) 又叫非易失性随机访问存储器,指断电后仍能保持数据的一种RAM。

一、KAM与KAMM

KAM空间在存储策略上采用模拟EEPROM存储策略(也叫EED存储策略,即EEPROM Emulation Driver,EEPROM仿真驱动器)。

而KAMM(Keep-Alive Memory Manager),则:

  1. ECU第一次启动时,KAMM负责将CodeFlash中对应KAM的参数数据加载到KAM区域,使KAM区域的参数有初始值。
  2. 负责将NVRAM中(正在运行的APP程序中的相关参数,以结构体形式存在)与KAM相关的数据写入KAM中,以及将KAM中的数据按优先权大小写入NVRAM。需要提一点,APP程序不能改CodeFlash的,只能用Bootloader来刷写。
  3. 负责记录KAM的写入/擦除次数,使其不得超过NVM(主要指片上Flash)的最大写入/擦除次数。

二、EED策略详解:

  1. 将KAM(Keep-Alive Memory)空间划分成四个页(EEPROM Block),其中Block0=Block1=16k,Block2=Block3=32k大小。
  2. KAM采用EDD策略,因此只支持页操作,要删除就整个页的删;不能像正常Flash那样,按位(bit)来读、写、删。
  3. 这4个页,每个页的首地址,包含每页的标志位,记录该页的状态,一般有三种标志位:Active、Alternate和Erased。被这三种标记位标记的页,分别称为活动页(Active)、备用页(Altenate)和已擦除页(Erased)。活动页代表正使用(正在读写)的页;备用页代表一旦活动页写满,可随时将活动页中的有效数据copy到该页中,然后擦除之前的活动页(擦的比较)。
  4. 第3条上加粗了“有效数据”四个字,为啥要将活动页中的有效数据复制?难道有无效数据存在???事实上这就是FLash模拟EEPROM的精髓所在。如果是在EEPROM中存数据,那很简单,给个地址指针,要读要写直接操作啊,每次写一次,就更新一次那个地址的存储信息就好了。比如有个参数vehiclespeed,vehiclespeed也是指针,指向指针的地址是0x1111,数值80kph,想更改为100kph,如果是EEPROM,那简单,直接改0x1111地址的值就可以了。但是Flash想写数据,就必须先擦除操作(先擦除后写入原则)为了减少擦除次数(况且擦除时间很长,你也等不起啊),不想因为改一个数据的值,就擦除一次,因此设置了一个虚拟地址和数值,例如vehicle speed和80kph,当想“修改”该数值时,实际上不是真修改,而是让虚拟地址会指向同一个页内的、未使用的、擦除过了的区域直接进行写操作(满足了先擦除后写入原则),再写一个100kph进去。这样不就偷懒了一次,少了一次擦写啦。而且,老的80kph数据,和新的100kph数据都存在于该活动页当中。不过系统可以智能的知道,100kph是最新数据,假如需要读vehicle speed数据时,系统不会再去找那个80kph,而是直接找100kph这个数。那么这个80kph就是无效数据,100kph就是有效数据。等到这个页都写满了之后,把都是最新的参数拷贝到下一个页中,那些老的不用的数值,一次性随着整个页的擦写,而消失。(PS:感觉有点像iOS中的Auto Release Pool哇!攒一坨废数据后,一起释放)。
图1 DataFLash的Memory Map
图2 外部Flash与片上FLash的比较

三、KAM数据结构

KAM的数据结构为了操作方便,一般也会按照功能逻辑上写操作时机(Trigger timing)相似的方法进行分组,分成Type0、Type1、Type2和Type3等几个不同的结构体,每个结构体里,封装一组参数。当然,这里的Type0/1/2/3等结构体,跟之前的Block1/2/3/4页没有关系,Block1/2/3/4的大小都是16k以上级别的,而每个Type0/1/2/3结构体占用空间才1b~2kb。这些Type结构体是存储在页中的。

分组结构体有不同的优先权,当几个结构体同时需要读写时,会优先处理优先权最高的结构体。

页式存储管理程序模拟_ADAS/AD开发12 - 数据存储管理相关推荐

  1. 编写程序来模拟计算机LRU算法,操作系统-页式虚拟存储管理程序模拟.doc

    实 验3: 页式虚拟存储管理程序模拟 实验目的: 编写程序来模拟计算机的两种调度方式: (1)先进先出算法 (2)最近最少使用算法 程序设计 FIFO() FIFO() LRU() Msize加1 S ...

  2. 存储管理之页式、段式、段页式存储

    首先看一下"基本的存储分配方式"种类: 1.  离散分配方式的出现 由于连续分配方式会形成许多内存碎片,虽可通过"紧凑"功能将碎片合并,但会付出很大开销.于是出 ...

  3. 【学习笔记】第三章——内存 III(分段存储、段页式存储、分段和分页对比)

    文章目录 一. 分段存储 1) 概念 2)段表 二. 分段 VS 分页 1)对比 2)优缺点分析 三. 段页式存储 1)定义 2)逻辑地址结构 一. 分段存储 1) 概念 离散,每段从0开始编址,每个 ...

  4. 2.3.1操作系统-存储管理:页式存储、逻辑地址、物理地址、物理地址逻辑地址之间的地址关系、页面大小与页内地址长度的关系、缺页中断、内存淘汰规则

    2.3.1操作系统-存储管理:页式存储.逻辑地址.物理地址.物理地址逻辑地址之间的地址关系.页面大小与页内地址长度的关系.缺页中断.内存淘汰规则 页式存储 逻辑地址.物理地址 如何判断物理地址和逻辑地 ...

  5. c语言段页式存储地址转换,页式存储和段页式存储的地址转换过程

    一.页式存储-地址转换 访问2次内存,第一次是页表,第二次是真正的物理内存. 二级页表,访问3次内存 两个例子的形式讲解逻辑地址到物理地址的转换: (1) 页系统页表 : 页号: 0 1 2 3 4 ...

  6. 分段地址变换过程c语言,段页式存储结构

    段.页式存储都是采用离散分配方式的.离散分配方式:允许一个进程直接分散地装入到许多不相临的分区中,可以更好的提高内存利用率. 一.基本分页存储 1.分页存储方式原则 把逻辑进程分为若干页:把实际内存分 ...

  7. 页式存储,段式存储,段页式存储,引入快表等访存次数

    王道的说法 页式存储,2次: 第一次,访问内存中的页表,利用逻辑地址中的页号查找到页帧号,与逻辑地址中的页内偏移拼接形成物理地址: 第二次:得到物理地址后,再一次访问内存,存取指令或者数据. 段式存储 ...

  8. 【操作系统】在一页式存储管理系统中,某作业页表如下。已知页面大小为 1024 字节,问逻辑地址1068,2566,5699 所对应的物理地址各是多少?如果需要置换一页,应该选择哪一页?置换后所对应的物

    在一页式存储管理系统中,某作业页表如下. 已知页面大小为 1024 字节,问逻辑地址1068,2566,5699 所对应的物理地址各是多少?如果需要置换一页,应该选择哪一页?置换后所对应的物理地址是多 ...

  9. 【中级软考】段页式存储是什么?

    段页式存储管理方式即先将用户程序分成若干个段,再把每个段分成若干个页,并为每一个段赋予一个段名. 页式存储管理能有效地提高内存利用率,而分段存储管理能反映程序的逻辑结构并有利于段的共享.如果将这两种存 ...

最新文章

  1. 编译错误syntax error : missing ';' before 'type'原因探寻
  2. 如何提高UDP的可靠性
  3. (二)stm32之中断配置
  4. centos7网络环境配置(optenstack环境配置)
  5. (转)思科VPP源码分析(dpdk node分析)
  6. VSCode 花式玩法(摸鱼)了解一下
  7. 选择部门-选择员工(js)
  8. 家庭购药新指南:2020-2021年中国家庭常备药上榜品牌榜单公布
  9. click 简单易用的Python命令行
  10. 基于UMeng消息推送测试-demo教程(iOS版)
  11. 南京ibm戴尔笔记本维修
  12. Java 使用Axis实现WebService实例
  13. linux命令行怎么结束进程,linux结束进程命令
  14. 银河麒麟踩坑笔记——tty、单用户模式
  15. ICC图文流程——(二)布局规划Floorplan
  16. c语言奇怪的分式11,蓝桥杯-奇怪的分式-java
  17. 切绳子【洛谷P1577】【二分】
  18. 考研数据结构之查找(9.8)——练习题之编写一个函数利用二分查找算法在一个有序表中插入关键字k并保持表的有序性(C表示)
  19. 一文了解市面上的N种物理锁架构
  20. 网站有反爬机制就爬不了数据?那是你不会【反】反爬!道高一尺魔高一丈啊!

热门文章

  1. 腾讯移动分析系统揭密
  2. 推荐一款好用的android反编译工具
  3. leetcode 526. Beautiful Arrangement | 526. 优美的排列(回溯)
  4. 【IDEA】推荐一些好用的IDEA插件
  5. 【算法笔记】重刷PAT 题解合集
  6. JavaScript 检查对象属性
  7. Leet Code OJ 20. Valid Parentheses [Difficulty: Easy]
  8. java ehcahce刷新_Spring整合ehcache 注解实现查询缓存,并实现实时缓存更新或删除...
  9. cad高程如何提取到cass软件_建筑CAD软件中如何设置墙厚标注? - 数码区
  10. 【MyBatis】MyBatis分页插件PageHelper的使用