Autosar Cp Memrory Stack详解

Memrory Stack

存储栈包含NvM、MemIf、Fee、Ea、Fls、Eep等模块。NvM接受外部的读、写等请求,随后通过接口层MemIf将请求下发至Fee、Ea模块,最后调用到驱动Fls、Eep模块进行实际读、写存储器操作。
Autosar Cp Memrory Stack详解_第1张图片

NvM

NvM属于autosar cp架构中的服务层,它对外提供读、写等接口供其他模块(DcM、Dem等)或应用层(通过RTE)调用,以实现将数据写入非易失性存储器件(或从非易失性存储器件读出数据),达到数据掉电不丢失的目的。这里的非易失性存储器通常有片内/外的flash、外部的eeprom等。

读写机制

NvM的读、写均为异步操作,用户通过NvM_ReadBlock或NvM_WriteBlock等函数只能发出请求,真正的读、写操作由NvM_MainFunction执行。由于同一时间NvM只能处理一个任务(或读、写或其他等),故在内部实现了队列,可按优先级方式将请求加入队列或按先到先处理的方式将请求加入队列。

单块及多块任务

单块任务使用NvM_ReadBlock、NvM_WriteBlock等函数发出请求,而多块任务使用NvM_ReadAll、NvM_WriteAll等函数发出请求,那么二者的区别在于:
1.单块任务只能操作某一个block,通过参数中的Block Id去选择块,而多块任务则可以操作所有配置了(ReadAll或WriteAll)属性的块。
2.应用场景不同,ReadAll、WriteAll主要用于上电与下电的过程。ReadBlock与WriteBlock则相对灵活。
3.NvM_ReadAll、NvM_WriteAll函数无传参,NvM_ReadBlock、NvM_WriteBlock有传参。

块类型

块类型包含3种分别为:NATIVE、REDUNDANT、DATASET,分别为:标准类型、冗余类型、数组类型。标准类型块没什么好说的,冗余类型块在存储器中包含两个映射,这两个块中的内容相同,保证了数据安全性。至于数组类型块,在存储器中包含多个映射,用户可根据索引选择使用哪个映射,通过NvM_SetDataIndex函数设置该索引。

块ID及与Fee/Ea模块的链接方式

块ID

NvM的块Id占16个bit,即范围在0-65535之间。但是id为0和id为1的块有特殊作用,不对用户开放,敲黑板!!!id为0的块不会被映射到非易失性存储器件中,仅用作标识多块任务(ReadAll、WriteAll等)的状态。说到块的状态,常用的几个就是NVM_REQ_PENDING(请求已接受,未执行或正被执行)、NVM_REQ_OK(请求处理成功)、NVM_REQ_NOT_OK(请求处理失败),每个块都具有一个状态变量标识它的工作状态,通过块ID索引就能找到对应的状态变量。对于多块任务来说,会依次操作所有配置成该属性的块,单纯用哪一个块的状态变量去与它绑定都不准确,故虚构了一个Block ID为0的块专门用来标识多块任务的状态。块1的话就不说了,既繁琐又不常用。

链接方式

NvM有块的概念,Fee、Ea同样有块的概念。NvM需要将数据传递给Fee、Ea等模块,那么Fee、Ea的块必然与NvM的块存在某种联系。

未完。。。抽空继续写

你可能感兴趣的:(Autosar,Cp,汽车,mcu,安全)