前言

本文介绍CP AUTOSAR 架构下的MemIf组件,基于S32K312芯片、Vector提供的CBD包,使用DaVinci Configurator工具进行配置的经验。
MemIf组件位于Memory Hardware Abstraction层里,是Fee和Ea的抽象层,NVRAM组件通过MemIf来访问Fee和Ea。

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
上图为CP AUTOSAR存储架构。


一、术语

(一)、Fee

存储模块的FLASH驱动的抽象层。

(二)、Ea

存储模块的EEPROM驱动的抽象层。

(三)、Block

块,MemIf操作的最新单位,块的大小和块的数量需要在Fee和Ea里就要已经配好。

MemIf的存储类型就是FLASH和EEPROM,上层不需要关心存储设备的硬件特性,只需要调用MemIf接口,下层的存储模块会自己分配数据地址、维护合法性、优化存储空间,Fee和Ea的接口也是一样的,所以MemIf其实就是将这两个模块合起来再封装一层,用户通过MemIf选择访问哪一个存储类型。
MemIf不调用Fee和Ea的Init也不调用Fee和Ea的MainFunction,由系统软件来调用。

二、主要类型

(一)、MemIf_MemHwaApis

函数指针,用来存放Fee或Ea的函数地址。

(二)、MEMIF_BROADCAST_ID

广播,当调用MemIf_GetStatus()时输入该ID,则获取下面的所有存储抽象层状态:
MEMIF_IDLE:返回此状态时代表所有存储模块都处于该状态。
MEMIF_UNINIT:返回此状态时代表至少有一个存储模块是该状态。
MEMIF_BUSY:返回此状态时代表至少有一个存储模块是该状态。
MEMIF_BUSY_INTERNAL:返回此状态时代表至少有一个存储模块是该状态。

(三)、MemIf_StatusType

存储模块的状态。
MEMIF_UNINIT:存储模块还未初始化。
MEMIF_IDLE:存储模块需要处理的任务。
MEMIF_BUSY:存储模块正在处理任务,不能进行下一步任务。
MEMIF_BUSY_INTERNAL:存储模块没有需要处理的模块,但正在处理内部事务。

(四)、MemIf_JobResultType

存储模块处理完任务后的结果。
MEMIF_JOB_OK:任务处理完成并且成功。
MEMIF_JOB_FAILED:任务处理完成并且失败。
MEMIF_JOB_PENDING:当前正在处理任务。
MEMIF_JOB_CANCELED:正在处理的任务被取消。
MEMIF_BLOCK_INCONSISTENT:任务处理完成但数据不一致。
MEMIF_BLOCK_INVALID:任务处理完成但数据无效。

(五)、MemIf_ModeType

存储模块的处理模式。
MEMIF_MODE_SLOW:任务使用SLOW模式进行处理,意思允许数据读写耗时长。
MEMIF_MODE_FAST:任务使用FAST模式进行处理,意思需要数据读写耗时短。

三、主要代码描述

(一)、FUNC(Std_ReturnType, MEMIF_CODE) MemIf_Read(uint8 DeviceIndex, uint16 BlockNumber, uint16 BlockOffset, MemIf_DataPtr_pu8 DataBufferPtr, uint16 Length)
读取Fee或Ea模块里的块数据。

(二)、FUNC(Std_ReturnType, MEMIF_CODE) MemIf_Write(uint8 DeviceIndex, uint16 BlockNumber, MemIf_DataPtr_pu8 DataBufferPtr)
给Fee或Ea模块写入块数据。

(三)、FUNC(Std_ReturnType, MEMIF_CODE) MemIf_InvalidateBlock(uint8 DeviceIndex, uint16 BlockNumber)
给Fee或Ea模块中的某一块区标记为失效。

(四)、FUNC(Std_ReturnType, MEMIF_CODE) MemIf_EraseImmediateBlock(uint8 DeviceIndex, uint16 BlockNumber)
如果Fee模块中的某一块区的预留区已经写入数据了并且需要换页调用此函数则立即执行换页动作。
对于Fee来讲不会进行擦除,而是讲块标记为无效。

(五)、FUNC(void, MEMIF_CODE) MemIf_Cancel(uint8 DeviceIndex)
取消Fee或Ea正在执行的任务。

(六)、FUNC(MemIf_StatusType, MEMIF_CODE) MemIf_GetStatus(uint8 DeviceIndex)
获取Fee或Ea模块的状态。

(七)、FUNC(MemIf_JobResultType, MEMIF_CODE) MemIf_GetJobResult(uint8 DeviceIndex)
获取Fee或Ea模块的任务完成结果。

(八)、FUNC(void, MEMIF_CODE) MemIf_SetMode(MemIf_ModeType Mode)
设置Fee或Ea模块的操作模式,即读写是否快慢。

七、DaVinci Configurator配置

在这里插入图片描述
在这里插入图片描述用来配置有几个存储驱动并且选择存储类型,即Fee或Ea。

八、使用范例

(一)、初始化完后执行写、读任务,写入块数据、读出最新的块数据。

	/**忽略其他配置**/
	MemIf_StatusType status = MEMIF_IDLE;
	uint8 DataReceive[8] = {0x0};
	uint8 wdata[8]={
		1,2,3,4,5,6,7,8
	};
	
	Fls_Init(&Fls_Config_VS_0);
	Fee_Init(NULL_PTR);
	do
	{
		Fls_MainFunction();
		Fee_MainFunction();
		status = Fee_GetStatus();
	} while (status != MEMIF_IDLE);
	MemIf_Write(0, 0, wdata);
	do
	{
		Fls_MainFunction();
		Fee_MainFunction();
		status = MemIf_GetJobResult(0);
	} while (status != MEMIF_IDLE);
	MemIf_Read(0, 0, 0, DataReceive, 8);
	do
	{
		Fls_MainFunction();
		Fee_MainFunction();
		status = MemIf_GetJobResult(0);
	} while (status != MEMIF_IDLE);

九、参考资料

AUTOSAR_SRS_MemoryHWAbstractionLayer.pdf
AUTOSAR_SWS_MemoryAbstractionInterface.pdf
AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf


总结

MemIf给上层组件NVRAM使用,总的来说不复杂,只是在Fee和Ea的接口上再封装一层。
另外本文文字描述多点,更像是本人的使用笔记,仅供参考,如有不对地方欢迎指教。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐