AUTOSAR-Fee模块

news2024/10/6 20:39:32

(73条消息) AUTOSAR-Fee模块_一ye残雪的博客-CSDN博客_fee 配置

0 前言

Fee模块全称Flash EEPROM Emulation Module,属于ECU抽象层

Fee模块本身是脱离硬件的,但是Fee模块可能会引用的Fls模块定制API,所以只能算半抽象

本文中,由于Fls模块提供的API都是Fls_17_Dmu打头的非标准API,所以Fee模块也必须使用英飞凌的定制版本

Fee模块最精简任务包括:

1 Fee模块的设计原理

1.1 逻辑扇区和双扇区算法

在【AUTOSAR-Fls模块】2.1 Flash Emulation EEPROM已经介绍在Fls模块层面上的Flash Emulation EEPROM原理

在Fee模块层面上,首先将所管辖的Flash分为分区(Partition),每个Fls模块的FlsSector为一个Partition(通常只有1个)

每个Partition分为2个逻辑扇区(FeeLogicalSector),也称为Virtual Sector,等价于Fls模块的FlsPhysicalSector

Fee模块以FeeLogicalSector为单位进行Erase操作

双扇区算法换扇区过程在英飞凌中称为GC(Garbage Collection)

过程:

1.2 逻辑块和地址空间

Fee模块向上层提供32位虚拟地址空间(Virtual Linear Address Space),其中

Fee模块地址最小单位为Virtual Page,当前AUTOSARVirtual Page必须为8 byte

每个Logical Block首地址必须与一个VirtualPage首地址对齐,Logical Block尾地址如果不与一个Virtual Page对齐,则自动添加unused地址,对齐到最近的VirtualPage尾地址

Logical Block的Block Number是由NvM模块决定的,唯一但不连续

1.3 立即数据和阈值空间

包含即时数据(Immediate Data)的块必须即时写入,不允许出现Immediate Data写到一半,突然发现FeeLogicalSector0写不下,要等待换扇区的情况

为了避免这一情况,在FeeLogicalSector上设定阈值空间(Threshold Value),当FeeLogicalSector上剩余空间小于Threshold Value时,自动触发换扇区操作

显然Threshold Value必须大于所有包含Immediate Data的Logical Block的和

Immediate Write是最高优先级操作,NvM模块会取消正在进行的低优先级Read/Erase/Write或Compare作业

1.4 配置指针和状态指针

Fee模块作为ECU抽象层的模块,需要在Fls模块后初始化

Fee模块需要一个用const修饰的静态外部变量Fee_Config存放模块初始化时所需的配置参数,Fee_Config保存在数据段(.data)

Fee模块需要一个静态外部变量FeeStateVar存放模块状态参数,FeeStateVar保存在未初始化段(.bss)。Fee模块每一个操作中都需要读取或修改FeeStateVar

2 Fee模块的C语言实现

2.1 C文件架构

2.2 使用到的类定义和状态枚举

2.3 配置指针和状态指针

const Fee_ConfigType Fee_Config =

{

  /* State结构体指针,未赋值 */

  .FeeStatePtr = &(Fee_StateDataType)FeeStateVar,

  /* Pointer to Logical Block configuration */

  .FeeBlockConfigPtr = &(Fee_BlockType)Fee_BlockConfig[0],

 

  /* Fee Job End Notification Api */

  .FeeNvMJobEndNotificationPtr = &(Fee_NotificationPtrType)NvM_JobEndNotification,

  /* Fee Job Error Notification Api */

  .FeeNvMJobErrorNotificationPtr = &(Fee_NotificationPtrType)NvM_JobErrorNotification,

 

  /* Fee threshold value */

  .FeeThresholdLimit = (uint32)1024U,

  /* Number of block configurated */

  .FeeBlkCnt = (uint16)81U,

 

  /* Fee settings for unconfigured blocks and GC restart */

  .FeeGCConfigSetting =

  {

    /* Treatment to unconfigured blocks */

    .FeeUnconfigBlock = FEE_UNCONFIG_BLOCK_IGNORE,

    /* when Garbage Collection restart */

    .FeeGcResertPoint = FEE_GC_RESTART_INIT,

    /* Enable or disable Erase Suspend feature */

    .FeeUseEraseSuspend = FEE_ERASE_SUSPEND_DISABLE,

    /* Reserved */

    .unused = 0U,

  }, // Fee_GCConfigType

 

  /* Fee Illegal State Notification */

  .FeeNvMIllegalStateNotification = (Fee_NotificationPtrType)NULL_PTR,

  /* Fee QS Illegal State Notification */

  .FeeQsIllegalStateNotification = (Fee_NotificationPtrType)NULL_PTR,

  /* Fee Hardening Error Notification */

  .FeeQsHardenErrorNotification = (Fee_NotificationPtrType)NULL_PTR,

 

  /* Enable or disable Erase All feature */

  .FeeEraseAllEnable = (boolean)True

}

typedef struct

{

  /* Fee Sector Info */

  Fee_SectorInfoType FeeSectorInfo[FEE_SECTORS];

  /* Fee Cache Info */

  Fee_CacheType FeeBlockInfo[FEE_TOTAL_BLOCK_COUNT];

  /* Last Written Block Info */

  Fee_LastWrittenBlkInfoType FeeLastWrittenBlkInfo;

  /* Current Block Being Written during GC */

  Fee_GcBlkInfoType FeeGcCurrBlkInfo;

 

  //以下省略

}Fee_StateDataType;

2.4 Fee模块提供的API

Fee_Init

void Fee_Init(Fee_ConfigType* Fee_Config)

由EcuM模块调用Fee_Init完成对Fee模块的初始化

Fee_Init需要排在Fls_17_Dmu_Init的后面

初始化所需参数在配置指针Fee_Config中,初始化包括对DMU寄存器的初始化和对状态指针FeeStateVar的初始化

初始化后,Fee模块的Module Status==MEMIF_IDLE,Job Result=MEMIF_JOB_OK

Fee_MainFunction

void Fee_Mainfunction (void)

Fee_MainFunction在Default_BSW_Async_Task_Core0中以10ms周期被调用,负责执行异步job

Fee_MainFunction根据FeeStateVar->FeeMainJob确定当前任务,FeeStateVar->FeeMainJob有以下状态:

FeeMainJob

FEE_MAIN_UNINIT

FEE_MAIN_INITGC

FEE_MAIN_CACHEUPDATE

FEE_MAIN_READ

FEE_MAIN_WRITE

FEE_MAIN_GC

Fee_MainFunction在一次周期中处理的数据量取决于配置的Processing Mode = Fast Mode / Slow Mode

Fee_MainFunction在处理完一个job后,将调用Job End Notification,或者如果发生错误,将执行Job Error Notification

Fee_Read

Std_ReturnType Fee_Read

(

uint16 BlockNumber,

uint16 BlockOffset,

uint8* DataBufferPtr,

uint16 Length

)

Fee_Read设置状态FeeMainJob=FEE_MAIN_READ

Fee_MainFunction执行后检测到FEE_MAIN_READ,开始处理

将BlockNumber转为BlockId,通过BlockOffset、Length获取数据的虚拟地址

虚拟地址转换为Block Instance在Flash中的实际地址

调用Fls_17_Dmu_Read,将实际地址上的数据存入DataBufferPtr指向的RAM区域

异步Job,在Fee_MainFunction中执行

此Job只有在Module Status==MEMIF_IDLE才能请求

Fee_Write

Std_ReturnType Fee_Write

(

uint16 BlockNumber,

uint8* DataBufferPtr

)

Fee_Write设置状态FeeMainJob=FEE_MAIN_WRITE

Fee_MainFunction执行后检测到FEE_MAIN_WRITE,开始处理

将BlockNumber转为BlockId,转换为Block Instance在Flash中的实际地址

调用Fls_17_Dmu_Write

异步Job,在Fls_17_Dmu_MainFunction中执行

此Job只有在Module Status==MEMIF_IDLE才能请求

Fee_Cancel

void Fee_Cancel (void)

Fee_GetStatus

MemIf_StatusType Fee_GetStatus (void)

返回Fee模块的Module Status

同步job,立即执行

Fee_GetJobResult

MemIf_StatusType Fee_GetJobResult (void)

返回最近或当前处理的Job Result

同步job,立即执行

Fee_SetMode

void Fee_SetMode (MemIf_ModeType Mode)

调用Fls_SetMode

同步job,立即执行

此job只有在Module Status==MEMIF_IDLE才能请求

Set Mode supported决定是否启用API

2.5 Fee模块提供的Callback

Fee_JobEndNotification

void Fee_JobEndNotification (void)

当Fls模块成功处理一个Job时,向Fee模块返回此回调函数

Fee_JobEndNotification会调用Fls_17_Dmu_GetNotifCaller,获取状态&FlsStateVar->NotifCaller,从而知道哪个Job返回此Callback Function

Fee_JobErrorNotification

void Fee_JobErrorNotification (void)

当Fls模块处理一个Job失败时,向Fee模块返回此回调函数

Fee_JobErrorNotification会调用Fls_17_Dmu_GetNotifCaller,获取状态&FlsStateVar->NotifCaller,从而知道哪个Job返回此Callback Function

2.6 Fee模块使用的外部API

Det_ReportError

Std_ReturnType Det_ReportError

(

uint16 ModuleId,

uint8 InstanceId,

uint8 ApiId,

uint8 ErrorId

)

来自Det模块的API,检测并报告开发错误,由Dev Error Detect启用

ModuleId==FEE_MODULE_ID或21

InstanceId=0

ApiId如下

ErrorId有7个,示例如下

FEE_E_UNINIT

FEE_E_INVALID_BLOCK_NO

Mcal_ReportSafetyError

Std_ReturnType Mcal_ReportSafetyError

(

uint16 ModuleId,

uint8 InstanceId,

uint8 ApiId,

uint8 ErrorId

)

来自MCAL的API,检测并报告安全错误,由Safety Enable启用

安全错误是指DMU寄存器中记录的错误,由内联函数读取,其中部分错误和开发错误相同

ModuleId,InstanceId,ApiId同 Det_ReportError

ErrorId有8个,示例如下

FEE_SE_UNINIT

FEE_SE_INVALID_BLOCK_NO

2.7 Fee模块使用的外部Callback

NvM_JobEndNotification

void NvM_JobEndNotification (void)

Fee模块接收到Fls模块发送的Fee_JobEndNotification后,向NvM模块返回此回调函数

NvM_JobEndNotification会在当前NVRAM块信息中写入NVM_REQ_OK

NvM_JobErrorNotification

void NvM_JobErrorNotification (void)

Fee模块接收到Fls模块发送的Fee_JobErrorNotification后,向NvM模块返回此回调函数

NvM_JobErrorNotification会在当前NVRAM块信息中写入NVM_REQ_NOT_OK、NVM_REQ_NV_INVALIDATE或NVM_REQ_INTEGRITY_FAILED

3 Fee模块的DaVinci Configurator配制

3.1 Fee\FeeBlockConfigurations

每个Logical Block都有一个FeeBlockConfiguration页面,配制Logical Block的基本属性

属性

说明

Device Index

将当前Block关联到Fls\FlsGeneral

Blcok Number

根据NvM模块配制自动生成,无法修改

Blcok Size

• 自动生成,系统在NvM模块定义的Block Length基础上加CRC长度(32位CRC则加4byte)

• CRC长度取决于NvM模块的Crc Type

Immediate Data

• Immediate Data开启表明Block包含Immediate Data

依据NvM模块自动生成

Number Of Write Cycles

• Block的最大Write寿命

• 选择1200000

Quasi Static Manager

Block Type Configured选择FEE_SECTOR_AND_QUASI_STATIC_DATA或者FEE_QUASI_STATIC_DATA_ONLY才有意义

Qs Block Address

Block Type Configured选择FEE_SECTOR_AND_QUASI_STATIC_DATA或者FEE_QUASI_STATIC_DATA_ONLY才有意义

Qs Block Instances

Block Type Configured选择FEE_SECTOR_AND_QUASI_STATIC_DATA或者FEE_QUASI_STATIC_DATA_ONLY才有意义

4.2 Fee\FeeGeneral

FeeGeneral部分主要对应Fee_Cfg.h文件中的常量宏定义和开关宏定义

属性

说明

Main Function Period [s]

Fee_MainFunction调用周期,要和NvM_MainFunction一致,通常为0.01

Virtual Page Size

Virtual Page Size必须是Flash Page的整数倍

在AUTOSAR中已经被限制只能填8

Polling Mode

开启则选择Polling Mode,关闭则选择Callback Mode

选择False

Block Type Configured

使用NvM模块则必须选择FEE_DOUBLE_SECTOR_DATA_ONLY

Nvm Job End Notification

NvM模块提供NvM_JobEndNotification回调函数

不填则给Fee_Config.FeeNvMJobEndNotification 赋值NULL_PTR

Nvm Job Error Notification

NvM模块提供NvM_JobErrorNotification回调函数

不填则给Fee_Config.FeeNvMJobErrorNotification 赋值NULL_PTR

Qs Job End Notificatio

Block Type Configured选择FEE_SECTOR_AND_QUASI_STATIC_DATA或者FEE_QUASI_STATIC_DATA_ONLY才有意义

Qs Job Error Notification

Block Type Configured选择FEE_SECTOR_AND_QUASI_STATIC_DATA或者FEE_QUASI_STATIC_DATA_ONLY才有意义

Dev Error Detect

宏定义开关,是否启用Det模块检测开发错误

如果启用Dev Error Detect,则添加#include Det.h并启用APIDet_ReportError

选择False

Safety Enable

宏定义开关,是否启用MCAL层检测安全错误

如果使用Safety Enable,则模块添加#include Mcal_SafetyError.h,启用APIMcal_ReportSafetyError

选择False

Init Check Api

宏定义开关,是否启用API Fee_InitCheck,返回Fee模块是否完成初始化

选择False

Set Mode supported

宏定义开关,是否启用API Fee_SetMode

选择False

Version Info Api

宏定义开关,是否启用APIFee_GetVersionInfo

选择False

3.3 Fee\FeeIfxSpecificConfig

此页操作英飞凌特有的配制信息

属性

说明

Cancel All Api

宏定义开关,是否启用API Fee_17_CancelAll

开启则允许取消所有当前任务,优先Write high priority quasi static data

Block Type Configured选择FEE_SECTOR_AND_QUASI_STATIC_DATA才有意义

选择False

Erase All Enable

给Fee_Config->FeeEraseAllEnable赋值

True:当Sector处于illegal state时,将DF0_EEPROM格式化然后恢复之前的数据

False:当Sector处于illegal state时无法恢复,陷入死循环

选择True

Gc Restart

给Fee_Config->FeeGCConfigSetting->FeeGcResertPoint赋值

FEE_GC_RESTART_INIT:当Fee模块初始化后,restart GC

FEE_GC_RESTART_WRITE:当Fee模块初始化且第一个Read/Write/Invalidate请求后,restart GC

选择FEE_GC_RESTART_INIT

Get Cycle Count Api

宏定义开关,是否启用API Fee_17_GetCycleCount获取block cycle和erase cycle

选择True

Get Prev Data Api

宏定义开关,是否启用API Fee_17_GetPrevData获取上一个Block Instance数据

选择Fals

Max Block Count

配制的Block数量

Max Bytes Per Cycle

一个Fee_MainFunction周期内最大数据处理量

选择FEE_MAX_BYTES_512

Nvm Illegal State Notification

Fee模块提供Fee_NvMIllegalStateNotification回调函数

不填则给Fee_Config.NvMIllegalStateNotification 赋值NULL_PTR

一般不填

Qs Harden Error Notification

Block Type Configured选择FEE_SECTOR_AND_QUASI_STATIC_DATA或者FEE_QUASI_STATIC_DATA_ONLY才有意义

Qs Illegal State Notification

Block Type Configured选择FEE_SECTOR_AND_QUASI_STATIC_DATA或者FEE_QUASI_STATIC_DATA_ONLY才有意义

State Var Struct

定义Fee模块状态指针名称,默认的就够用了

Threshold Value

Sector中剩余内存小于Threshold Value时触发garbage collect和sector change

Um Config Blk Overflow Handler

FEE_CONTINUE: GC时遇到unconfigurated block直接跳过

FEE_STOP_AT_GC: GC时遇到unconfigurated block短暂进入只读状态

选FEE_CONTINUE

Um Config Block

FEE_UNCONFIG_BLOCK_IGNORE: GC时不复制unconfigurated block

FEE_UNCONFIG_BLOCK_KEEP: GC时赋值unconfigurated block

选FEE_UNCONFIG_BLOCK_IGNORE

Use Erase Suspend

启用时,Fee模块可以中断GC操作,优先进行Read/Write请求

这是TC389的硬件功能

选择False

Virgin Flash Illegal State

选择False

3.4 Fee\FeeDemEventParamterRefs

本页是Error后Dem模块对应的Action,不填代表FEE_DISABLE_DEM_REPORT

E GC ERASE

E GC INIT

E GC READ

E GC TRIG

E GC WRITE

E INVALIDATE

E READ

E UNCONFIG BLK EXCEEDED

E WRITE

E WRITE CYCLES EXHAUSTED

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/14119.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库高级 III

数据库高级 III 二叉排序树在极端情况下存在的问题 二叉排序树在极端情况下会产生失衡二叉树 失衡二叉树其实是不希望存在的,因为它失去了二叉排序树的查询优势,现在这种失衡二叉树的查询效率和单向链表一样,此时它就是单向链表 数据结构…

14.4、SpringWebFlux-1

14.4、SpringWebFlux-1 14.4.1、前置知识 SpringMVC,SpringBoot,Maven,Java8 新特性 14.4.2、基本介绍 官方文档 Web on Reactive Stack (spring.io) 是 Spring5 添加新的模块,用于 web 开发的,功能 SpringMVC 类…

网络热传App鉴定 |「得物」疑私删用户视频?从技术角度还原事件始末

声明:本文更注重于原理知识的普及,因此文中不会有大量实际代码的展示,如果想从代码层面上了解「应用存储分区」的内容,欢迎阅读我两年前写过的技术文章《Android 10 应用分区存储适配实践》 近日,有网友爆料&#xff0…

MySQL 分库分表

MySQL分库分表 概念 读写分离优化了互联网读多写少场景下的性能问题,考虑一个业务场景,如果读库的数据规模非常大,除了增加多个从库之外,还有其他的手段吗?实现数据库高可用,还有另外一个撒手锏&#xff…

Python性能优化指南--让你的Python代码快x3倍的秘诀

Python性能优化指南 Python最为人诟病的就是其执行速度。如何让Python程序跑得更快一直是Python核心团队和社区努力的方向。作为Python开发者,我们同样可以采用某些原则和技巧,写出性能更好的Python代码。本文将带大家深入探讨Python程序性能优化方法。…

99页4万字XX大数据湖项目建设方案

目 录 1. 项目综述 1.1. 项目背景 1.2. 项目目标 1.3. 项目建设路线 2 需求分析 2.1功能需求 2.1.1 统一数据接入 2.1.2 数据迁移 2.1.3 数据范围与ETL 2.1.4 报表平台 2.1.5 安全管理 2.1.6 数据治理 2.2非功能需求 2.2.1运维保障需求 2.2.2可用性需求 2.2.3可…

MQTT 具备那些特征?

目录 1、MQTT 中的 QoS(消息服务质量) (1)为什么服务质量(QoS)很重要? (2)QoS 在 MQTT 中是如何工作的? (3)如何选择正确的 QoS 级别 (4&a…

Java开发中Word转PDF文件5种方案横向评测

Java开发中Word转PDF文件5种方案横向评测 前段时间接了个项目,需要各种处理Word模板、转PDF、签章等等,非常头疼,其中光是一个word转PDF就折磨我好久,实现转换很简单,但是效果总是达不到满意,于是我把市面…

【Linux】关于普通用户无法使用sudo指令的解决方案

文章目录前言解决方案结语前言 在这篇博客中,测试 rm -rf 删除文件时无视权限暴力删除的效果时,使用了 sudo 指令。 但是sudo指令是不能直接使用的,需要修改一些设置。 当时我遇到这个问题时,困惑了许久,查找解决方…

JVM执行引擎

文章目录学习资料执行引擎概述工作过程Java代码编译和执行的过程什么是解释器(Interpreter),什么是JIT编译器?为什么说Java是半编译半解释型语言?机器码、指令、汇编语言、高级语言机器码指令指令集汇编语言高级语言字…

UE5实现PS图层样式投影效果

一、PS图层样式投影效果 1、创建材质函数 MF_PS_Style_Shadow 公开到库(可选) 定义 function input。 Shadow代码: /** PS图层样式投影效果param {UVs} texture coordinateparam {TextureObject} texture objectparam {TextureSize} …

十、children的深入用法-React.Children对象上的方法

目标 理解什么是children掌握React.Children对象上的方法 知识点 什么是children上图中我们看到了,我们之前学过的React.createElement方法,现在大家发现jsx的内容,全部都体现在了该方法上;那么React.createElement其实是有三个…

专精特新企业数据集两份数据

专精特新企业数据集 一、三批专精特新上市、非上市公司数据分布 1、时间截止至2021年8月 2、区域范围:上市和非上市公司两大板块,涵盖申万一级行业 3、指标说明: 包含如下内容:专精特新上市公司名单汇总、第一批专精特新上市公…

opencv 入门学习

opencv 演示 输入说明 原图在顶层后然后再去按键,不然会失效(未知原因) 1.roberts 边缘检测 2.sobel算子 3.Canny算子 4.Laplace算子 5.Canny算子,轮廓显示 空格 人脸检测准备一张图片效果 默认显示原图和灰阶图 roberts 边缘…

MySQL版本号6和7去哪了

问题 MySQL版本号6和7去哪了 详细问题 笔者起初误以为MySQL版本号6和7可能由于存在诟病不受欢迎或由于MySQL版本迭代过快导致未能在市场上流行 但是在浏览MySQL官网注意到 MySQL在2017年发布了新的版本8.0,但是在此之前的上一一个版本是5.7,40,那么中间的6和7去哪…

并发编程永远绕不开的难题,跟着大牛带你Java并发编程从入门到精通

我们知道,很多框架或者自研组件的底层,都或多或少涉及到并发编程方面的技术点。 比如:在一些本地缓存组件中,当本地缓存过期后,需要从数据库加载数据,这个阶段中就会涉及到线程并发请求的处理;在…

微信小程序云开发

概念 小程序云开发,让前端程序员拥有后端的能力云函数 (nodejs)云数据库 (mogodb)云存储前端写好云函数 > 上传到云服务器 >实现自定云部署前端去调用云函数>间接通过云函数对数据库的操作前端>全栈 注意…

DSP之寄存器映射和CDM文件

DSP之寄存器映射和CDM文件 RAM:程序运行速度快,关掉电源,程序会丢失。 Flash:程序运行速度慢,关掉电源,程序不会丢失。 所以,程序一般存到Flash中,在运行的时候,由CPU将…

2010-2019年208个地级市城乡收入差距泰尔指数

2010-2019年208个地级市城乡收入差距泰尔指数 1、数据来源:各省的统计NJ以及部分地级市的NJ(主要是地级市的城镇化率) 城镇化率为常驻人口城镇化率而非户籍人口城镇化率。附件中也包含各个地级市的城镇化率,农村人均可支配收入2…

Linux开发工具(1)——yum

文章目录软件包管理器 —— yum安装软件的三个问题Linux开源生态yum查找软件yum下载软件yum删除软件配置yum源Linux下的工具本质也是指令 , 下面我会介绍几个常用的工具 , 分别是yum(相当于是手机上的应用商店 , 可以在里面下载工具 ) vim(多模式编辑器)…