AUTOSAR

您所在的位置:网站首页 wage和fee AUTOSAR

AUTOSAR

2024-07-09 10:11:41| 来源: 网络整理| 查看: 265

本文来简要介绍一下如何在EB中配置AUTOSAR Fls和Fee模块。Fls模块是Flash的驱动,执行具体的Flash擦写读取等操作。Fee模块的全称是FlashEEPROMEmulation,即Flash模拟EEPROM,是为了解决Flash擦写寿命比较短的问题,通过算法实现各个Flash块的交替擦写,以延长寿命。

1. Fls (1)FlashSector(扇区)

Fls模块中最重要的一点就是配置FlsSector,如下图所示,一共配置了8个Sector,每个Sector可以选择对应的Flash物理扇区,配置好后,这几个Sector就会被用来模拟EEPROM。S32K1XX系列芯片带有专门用来存储数据的Flash——FlexNVM,地址从0x10000000处开始。每个扇区的大小是2K。

在这里插入图片描述

(2)回调函数

注意结合Fee模块一起使用的时候,要配置以下两个回调函数,否则数据存储会有问题: 在这里插入图片描述

2. Fee

Fee模块是基于Fls模块的,不可单独使用。

配置Fee时首先要配置Fee Cluster,每个Cluster可以包含一个以上的FlashSector。

Cluster越多,Flash的平均擦写次数越少;每个Cluster包含的Sector越多,能够同时存储的数据量越大。 (上面是我初步分析的,大家有不同的看法可以交流一下,互相学习) 在这里插入图片描述 配置完Cluster之后就可以配置Block了,如下图所示,每个Block有一个唯一的序号——BlockNumber,作为该Block的索引,用于写入数据和读取数据。写入数据时要整个Block一起写入,读取的时候可以指定偏移量和数据长度,读取该Block中某个地址处的某几个字节数据。

每个Block可以分别配置大小,即可存储的数据长度。 在这里插入图片描述 如果结合Nvm模块一起使用的话,要配置下面两个回调函数: 在这里插入图片描述 再注意一下Fee Buffer Size这个概念,可以参考下面的注释,简单说就是Buffersize越大性能越好。 在这里插入图片描述

3. 测试代码

下面的测试代码参考了NXP官方提供的Mcal Sample中的代码。

创建一个Task,每100ms调度一次,代码如下:

static CONST (uint8, AUTOMATIC) FeeTest_WriteBuff[32]={0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA}; static VAR (uint8, AUTOMATIC) FeeTest_ReadBuff[32]={0}; TASK( OsTask_FeeTest ) { volatile StatusType status; /* variable to check system status */ Std_ReturnType stdRet = E_NOT_OK; MemIf_StatusType memif_status; memif_status = Fee_GetStatus(); /* state-machine logic */ switch(FeeState) { case FEE_ERASE_STATE: { if (MEMIF_IDLE == memif_status) { stdRet = Fee_EraseImmediateBlock(FeeBankIdx); if (stdRet != E_OK) { // CONSOLE_MESSAGE("FEE Error %d returned by Fee_EraseImmediateBlock()", stdRet); Can_PduInfo_0_0.sdu[0] = 0x01; /*CONSOLE_MESSAGE("FEE state-machine state:%d", FeeState);*/ FeeState = FEE_ERROR_STATE; } else { /* change the state */ FeeState = FEE_ERASE_BUSY_STATE; Can_PduInfo_0_0.sdu[0] = 0x00; stdRet = E_OK; } } else { stdRet = E_OK; } } break; case FEE_ERASE_BUSY_STATE: if (MEMIF_IDLE == memif_status) { FeeState = FEE_WRITE_STATE; } stdRet = E_OK; break; case FEE_WRITE_STATE: { if (MEMIF_IDLE == memif_status) { stdRet = Fee_Write(FeeBankIdx, (uint8 *)FeeTest_WriteBuff); if (stdRet != E_OK) { // CONSOLE_MESSAGE("FEE Error returned by Fee_Write()", stdRet); Can_PduInfo_0_0.sdu[0] = 0x02; /*CONSOLE_MESSAGE("FEE state-machine state:", FeeState);*/ FeeState = FEE_ERROR_STATE; } else { /* change the state */ FeeState = FEE_WRITE_BUSY_STATE; stdRet = E_OK; } } else { stdRet = E_OK; } } break; case FEE_WRITE_BUSY_STATE: if (MEMIF_IDLE == memif_status) { FeeState = FEE_READ_STATE; } stdRet = E_OK; break; case FEE_READ_STATE: { if (MEMIF_IDLE == memif_status) { stdRet = Fee_Read(FeeBankIdx, 0, FeeTest_ReadBuff, 32u); if (stdRet != E_OK) { // CONSOLE_MESSAGE("FEE Error %d returned by Fee_Read()", stdRet); Can_PduInfo_0_0.sdu[0] = 0x03; /*CONSOLE_MESSAGE("FEE state-machine state:", FeeState);*/ FeeState = FEE_ERROR_STATE; } else { /* change the state */ FeeState = FEE_READ_BUSY_STATE; } } else { stdRet = E_OK; } } break; case FEE_READ_BUSY_STATE: if (MEMIF_IDLE == memif_status) { FeeState = FEE_VALIDATE_STATE; } stdRet = E_OK; break; case FEE_VALIDATE_STATE: { /* compare the read FeeTest_WriteBuffer with the written one */ stdRet = SampleAppFee_memcmp((uint8 *)FeeTest_WriteBuff, FeeTest_ReadBuff, 32u); if (stdRet != E_OK) { Can_PduInfo_0_0.sdu[0] = 0x04; // CONSOLE_MESSAGE("FEE Error %d returned by SampleAppFee_memcmp()", stdRet); /*CONSOLE_MESSAGE("FEE state-machine state:%d", FeeState);*/ FeeState = FEE_READ_ERROR_STATE; // CONSOLE_MESSAGE("Fee task READ ERROR!", 0); } else { /* change the state */ FeeState = FEE_FINAL_STATE; Can_PduInfo_0_0.sdu[0] = 0xFF; if(FeeBankIdx } /*break;*/ default: { /* if we got here, something went terribly wrong*/ stdRet = E_NOT_OK; } break; } status = TerminateTask(); }

在main函数中初始化Fls和Fee模块:

…… Fls_Init(&FlsConfigSet_0); Fee_Init(); FeeState = FEE_ERASE_STATE; FeeBankIdx = 1; StartOS( Mode01 ); /* jump to OS startup */

在一个5ms为周期的函数中调用两个模块的主调度函数:

TASK( OsTask_5ms ) { volatile StatusType status; /* variable to check system status */ …… Fls_MainFunction(); Fee_MainFunction(); status = TerminateTask( ); }

即可完成4个Fee Block的简单测试。



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭