AUTOSAR —— S32K144 的 Fls 和 Fee 模块配置

2023-05-16

本文来简要介绍一下如何在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 < 4)
                {
                    FeeBankIdx++;
                    FeeState = FEE_ERASE_STATE;
                }
//                CONSOLE_MESSAGE("Fee task ended OK.", 0);
            }
        }
        break;

        case FEE_ERROR_STATE:
        {

        }
        /*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的简单测试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AUTOSAR —— S32K144 的 Fls 和 Fee 模块配置 的相关文章

  • 3.Adaptive AUTOSAR 架构详解

    3 1 逻辑层架构 下面显示了AP的逻辑架构 xff0e AA xff08 adaptive application 在ARA AUTOSAR Runtime for Adaptive Applications 上运行 ARA包含了所有功能
  • CP AUTOSAR 简介

    嵌入式系统不支持硬件抽象 xff0c 使得我们每次在进行新的处理器更换之后 都需要进行重新进行底层软件的开发 2003年建立autosar 组织 autosar官方文档非常长2万多页 xff0c 从这里可以看出什么 xff1f 1 auto
  • CP AUTOSAR 通信

    现在汽车中 xff0c 车内网络普遍采用CAN LIN FlexRay总线 xff0c CAN FD和车载以太网也将在未来得到更多应用 作为汽车电子软件的主要标准 xff0c AUTOSAR在总线网络通信方面提供了完整的架构 AUTOSAR
  • Autosar 软件中间件

    我们都知道手机 xff0c 电脑啥的在应用之下 xff0c 硬件之上 xff0c 还有一个东西叫操作系统 xff0c 车辆里也有类似的东西 操作系统 xff0c 中间件 xff0c 应用软件 各司其职分工不同 操作系统 我负责对硬件 xff
  • Adaptive AUTOSAR----Adaptive studio

    Adaptive studio Adaptive Studio 是包含在 RTA VRTE SK 中的 AUTOSAR 编辑器 Adaptive studio 通过高级抽象支持所有 adaptives autosar arxml 元素的配置
  • 一文搞懂AUTOSAR的DEM模块

    Dem全称为Diagnostic Event Manager xff0c 负责故障事件的处理 故障数据的存储和管理 简单说其功能是故障事件确认前的故障debounce xff0c 故障事件确认时的故障数据存储 xff0c 故障发生后的故障老
  • AP AUTOSAR——Security Management

    11 Security Management 11 1 What is Security Management 安全管理是自适应平台体系结构中的一个功能集群 作为一个功能集群 xff0c 安全管理由多个模块组成 xff0c 这些模块向在Ad
  • Adaptive AUTOSAR——Execution Management(VRTE 3.0 R21-11)

    ChatGPT回答 xff1a Adaptive AUTOSAR Execution Management 模块是用于管理软件执行的模块 xff0c 其主要功能包括 xff1a 任务调度 xff1a 支持对任务进行调度和执行 xff0c 以
  • Adaptive AUTOSAR——State Management(VRTE 3.0 R21-11)

    状态管理是自适应平台服务中的一个功能集群 在自适应平台中 xff0c 状态决定了一组活动的自适应应用程序 特定于项目的应用程序 xff0c 即状态管理器 xff0c 决定何时请求状态更改 xff0c 从而更改当前活动的应用程序集 状态管理器
  • ETAS-AUTOSAR学习-0.1Task配置思考

    span class token function TASK span span class token punctuation span OsTask BSW span class token punctuation span span
  • Autosar Configuration(五) Security之Csm配置

    本系列教程是根据实际项目开发中总结的经验所得 如发现有不对的地方 还请指正 目录 Autosar Configuration 一 Davinci Developer 工具介绍 Autosar Configuration 二 Davinci
  • Adaptive Autosar通讯层:ARA::COM中的Instance Identifiers

    一般概念 实例标识符 在收发两端都是要用的 是很核心的概念 proxy端用来搜索服务 xff0c skeleton端用来创建服务实例 站在API的角度来看 xff0c 这样的识别符是和特定的技术绑定的 所以 xff0c 标识符的结构和内容都
  • PHY- PHY芯片概述

    1 PHY概述 关于Internet Protocal的分层模型可以参考文章 Internet Protocal OSI模型中的网络分层模型 下面我们讲讲底层以太网控制器和收发器的知识 其主要是处理OSI模型中的物理层和链路层的事情 在CA
  • AutoSAR 学习笔记2:AutoSAR架构

    1 应用层 ASW 2 运行时环境层 RTE RTE 是专门为应用软件 AutoSAR 软件组件和 或 AutoSAR 传感器 执行器组件 提供通信服务的层 在 RTE 之上 软件架构风格从 分层 转变为 组件风格 AutoSAR 软件组件
  • 标定CCP协议在S32K144上的移植实战

    文章目录 目录 文章目录 前言 一 CCP是什么 二 移植步骤 1 准备工作 2 移植 3 测试验证 总结 前言 CCP协议在新能源汽车电子领域发挥着重要作用 CCP观测和标定作用对开发工程师起着重要作用 疫情宅在家无聊 把这块的知识重新梳
  • IPC-核间通讯

    1 IPC通讯是AUTOSAR体系结构中的核心组成部分 它使得不同的软件组件可以相互通信 协同工作 从而实现整车系统的功能 IPC可以理解为核间通讯 就是一个芯片有多个核 现在想让多核之间通信 达到下面几个目的 数据共享 不同的软件组件之间
  • 【AUTOSAR】CCP协议的代码分析与解读(二)----CCP协议格式和命令代码

    CCP协议介绍 CCP的全称是CAN Calibration Protocol CAN标定协议 是基于CAN总线的ECU标定协议规范 CCP协议遵从CAN2 0通信规范 支持11位标准与29位扩展标识符 CCP通信方式 CCP协议采用主从通
  • 数据类型:C++中的基本数据类型

    数据类型 C 中的基本数据类型 在C 中 数据类型是用于存储不同种类数据的变量类型 C 提供了多种基本数据类型 包括字符型和数值类型 本篇博客将详细介绍C 中的基本数据类型 并提供相应的示例代码 目录 引言 字符型数据类型 2 1 char
  • 在 WooCommerce 中为特定产品类别添加费用,但仅当相关类别也存在时

    我想为类别 A 添加费用 但仅当订单中有其他类别 B C D 等 的产品时才计算 但如果仅订购 A 类产品 则不适用该税 在我的代码中 这两种情况都会添加费用 您能指导我找到更好的解决方案吗 我在我的网站上添加此代码 add action
  • Woocommerce 根据购物车中的商品总数累进额外费用

    我正在寻找一些代码 可以根据购物车中的商品总数收取额外费用 例如 如果购物车中的商品数量 gt 6 gt 额外费用 5 如果购物车中的商品数量 gt 12 gt 额外费用 10 我努力了这段代码 https stackoverflow co

随机推荐

  • 将Mircrosoft Store下载的Ubuntu安装到指定位置方法,同时解决“你需要来自System的权限才能对此文件进行更改”问题

    一 概述 最近使用到WIndows的WSL功能 xff0c 需要安装ubuntu这个子系统进行仿真环境搭建 xff0c 但是又不愿意使用虚拟机 xff0c 不太方便 在安装过程中发现本身就岌岌可危的C盘经常突然爆满 xff0c 经过检查发现
  • 本地安装WSL的发行版后,导出到另一台计算机安装的办法

    一 步骤 1 首先你要在你的计算机上安装成功了WSL子系统 xff0c 然后才能导出对应版本的tar文件 xff0c 复制到另一台计算机中进行安装 2 例如我的电脑安装了Ubuntu 20 04 5这个版本 xff0c 如图 xff1a 3
  • Pixhawk基础—认识Pixhawk

    Pixhawk简介 pixhawk是由3DR联合APM小组与PX4小组于2014年推出的飞控PX4的升级版 xff0c 它同时拥有PX4和APM两套固件和相应的地面站软件 该飞控是目前全世界飞控产品中硬件规格最高的产品 Pixhawk基础
  • 关于 adb命令编辑器中无法找到设备:error: device not found 问题的解决办法

    adb命令编辑器中无法找到设备 xff1a error device not found 问题原因解决办法问题来了 解决办法 今天接手一个施乐的设备 xff0c 想要连接到电脑上进行调试 xff0c 调试程序已写好 xff0c 准备用adb
  • LinearLayout中layout_weight属性占比计算方法

    假设一个布局中有三个子布局 xff0c 三个子布局的layout weight属性占比我2 3 4 此时有两种情况 xff1a 1 wrap content比较简单 直接就按比例得了 2 fill content match content
  • 利用POI实现json数据的Excel导出

    首先需要POI jar包 xff0c 相关jar包已经分享到个人网盘 xff0c 有需要可以进行下载 链接 xff1a https pan baidu com s 1N9Cc8UgHuHIMZbWfurmm3w 提取码 xff1a cc6p
  • 基于springboot的简单restful服务demo

    这篇文章主要是本人学习springboot时一个简单的测试demo xff0c 仅供参考 springboot的介绍 xff1a 由Pivotal团队提供的全新框架 xff0c 设计的目的是简化spring新应用搭建的过程 xff0c 使用
  • leetcode刷题 Day23(LRU缓存机制)

    题目 xff1a 思路 xff1a java用LinkHashMap解决 xff0c 在LRUCache中获取缓存容量 xff0c 在put方法中 xff0c 难点在于怎么进行判断最新数据和最不常用的数据 xff0c 这里采取这种办法 xf
  • 野火&洋桃STM32开发版学习指导完整版

    该文章是我历时一个月整理总结而成 xff0c 专门针对想要通过野火 amp 洋桃STM32开发板入门stm32的读者 由于csdn编辑限制 xff0c 该学习指导只包含文字信息 如需查看含图片的完整版可进入我的博客下载页 完整版内容详实 x
  • sumo学习——sumo的路网介绍

    2 sumo路网 这里的记录的内容 xff0c 并不以如何绘制或者如何建立一个路网体系为主 xff0c 而是较为详细的介绍 xff0c 在sumo中是如何定义路网格式的 这里所有的内容都是来自于sumo的软件说明翻译 xff0c 其中部分夹
  • webpack之devtool

    关于Devtool 该选项控制是否以及如何生成源映射 官网上给出的可选值有 xff1a 其中一些值适合开发 xff0c 一些用于生产 对于开发 xff0c 您通常需要快速的Source Maps xff0c 以bundle的大小为代价 xf
  • 汽车UDS诊断详解及Vector相关工具链使用说明——总述

    1 什么是诊断 车辆在运行过程中 xff0c 不可避免地会发生一些故障 xff0c 为了确保行车安全 xff0c 我们要求车上的ECU能够实时监测部件的运行状态 xff0c 一旦发现异常情况 xff0c 能通过点亮报警灯等方式提示驾驶员 但
  • 汽车UDS诊断详解及Vector相关工具链使用说明——2.2.7 动态定义DID(0x2C)

    1 概述 动态定义DID服务允许诊断仪在ECU内部动态定义一个临时的DID 可以通过该DID读取一段内存的数据 也可以通过改DID一次性读取多个原有DID的数据 动态定义DID既可以是支持22服务的DID 也可以是支持2A服务的周期性读取
  • 关于RTOS中信号量、互斥量、邮箱、消息队列的一些理解

    1 信号量 信号量有两种 xff1a 计数性信号量和二值信号量 xff0c 计数性信号量可以被获取多次 xff0c 二值信号量只有0和1两种状态 xff0c 只能被获取一次 信号量可以用来对资源进行保护 xff0c 防止多个任务同时访问某个
  • 英飞凌 AURIX 系列单片机的HSM详解(1)——何为HSM

    本系列的其它几篇文章 xff1a 英飞凌 AURIX 系列单片机的HSM详解 xff08 2 xff09 与HSM相关的UCB和寄存器 英飞凌 AURIX 系列单片机的HSM详解 xff08 3 xff09 开发方法 英飞凌 AURIX 系
  • DoIP(一)——基础概念

    1 DoIP概述 DoIP xff08 Diagnostic communication over Internet Protocol xff09 是基于车载以太网的诊断 xff0c 在OSI 七层模型中属于传输层 xff0c 其传输的诊断
  • DoIP(二)——报文类型

    我们上一篇文章提到 xff0c DoIP报头中有两字节的数据类型 xff08 Payload Type xff09 xff0c 代表DoIP报文类型 xff0c 本文就来详细介绍一下每一种报文类型 标准中对报文类型的定义如下 xff1a 数
  • AUTOSAR —— CAN网络管理(CanNm)

    1 网络状态 AUTOSAR网络管理节点内部有两个状态 xff0c 一个是Requested 被请求状态 xff0c 另一个是Released 被释放状态 xff0c 当节点的应用层需要使用总线进行通讯的时候 xff0c 会调用接口使得节点
  • S32K1XX系列单片机 ——(1)开发环境搭建

    本文介绍一下NXP S32系列单片机开发环境的搭建方法 xff0c 分两种 xff1a S32DS和Keil 1 S32DS S32DS是NXP开发的一款IDE xff0c 编译器是GCC xff0c 支持Lauterbach P amp
  • AUTOSAR —— S32K144 的 Fls 和 Fee 模块配置

    本文来简要介绍一下如何在EB中配置AUTOSAR Fls和Fee模块 Fls模块是Flash的驱动 xff0c 执行具体的Flash擦写读取等操作 Fee模块的全称是FlashEEPROMEmulation xff0c 即Flash模拟EE