本文主要是介绍【Autosar】MCAL - FLS(NXP - S32K14x),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- MCAL - FLS(NXP - S32K14x)
- 1. 概述
- 1.3 内存介绍
- 1.2 虚拟内存
- 1.3 任务处理
- 1.4 Access Code
- 2. API
- 3. 配置介绍
- 3.1 General
- 3.1.1 FlsConfigSet
- 3.1.2 FlsGeneral
- 3.2 FlsSector
MCAL - FLS(NXP - S32K14x)
MCAL - 汇总
- 配置工具:EB Tresos Studio
- 芯片类型:S32K146
1. 概述
1.3 内存介绍
Flash组成:Code Falsh(program flash) / Data Flash(FlexNVM)。Data Flash一般用来储存数据,通过配置也可以用作模拟EEPROM的备份。
从下图可以看到,S32K146you 1M的Code Flash和64K的Data Flash:
从下面的配置表界面可以看到,Fls Physical Sector
中已经设定好了32个FLS DATA(2k)
和256个FLS CODE(4k)
供用户选择:
1.2 虚拟内存
从配置界面下可以看到,有Fls Physical Sector
和Fls Sector
两个配置,分别对应物理内存
和虚拟内存
。
如下图所示,假设用户配置了3个扇区的虚拟内存(每个扇区大小4K),用户在配置的时候将虚拟内存对应到物理内存,在软件操作的时候,用户都是面向虚拟内存,FLS模块底层会根据配置信息将虚拟内存对应到实际的物理内存。
1.3 任务处理
FLS所有的提交任务都是以异步的方式处理的,它的原理就是通过Fls_MainFunction
函数轮询当前的任务状态,当有任务时就去处理,处理完成后触发回调函数。Fls_MainFunction
就是一个状态机,Fls_Erase
、Fls_Write
、Fls_Read
等函数都是用来提交任务,将当前需要处理的数据的信息(起始地址、大小、读/写等)"提交"后(公共变量复制
),由Fls_MainFunction
去处理。(当前任务处理未完成的情况下,新的任务不能提交)。FLS回调函数没有参数,上层用户无法通过回调获取当前执行的任务信息,所以用户需要自己保存任务信息,当FLS触发回调之后,再根据信息去处理接下去的任务。
按照这种异步的设计方式,上层用户使用FLS的时候有两种方式:
- 上层提交任务后,通过FLS的完成回调函数通知上层,上层再根据本地保存信息处理后续任务。
- 上层提交任务后,通过轮询的方式查看FLS的状态来判断是否完成任务。
1.4 Access Code
Access Code是一段专门用于擦/写操作的代码,这部分代码独立在Fls_Ac.c
中。由于不规范的Flash操作可能会导致RWW(Read while write)问题出现,RWW问题意思就是在同一时刻对同分区内存既读
又(擦/写),这里的读
不是指用户从内存读数据,而是MCU从内存中取指令。由于硬件(flash访问接口)的原因,假设你的代码运行在FLASH - A中,在这期间你是不能执行(写/擦)操作的,但是你可以去(擦/写)FLASH- B。因此FLS模块的设计包含将AC代码搬移到其他区执行的功能(用户根据自己的内存分配来决定是否开启该功能)。下图为不同分区内存之间允许同时进行的操作描述图:
S32k146的内存分区如下所示(此图没有画出P-RAM),从下图我们可以看到,Code Flash有2个分区,每个分区512k,Data Flash是一个分区,FlexRam是一个分区,P-RAM是一个分区。
例 - 1:程序设计将数据保存在Data Flash中,(擦 / 写)代码运行在Code Flash中,那么不需要开启AC搬移的功能,因为这是两个不同的分区。
例 - 2:程序设计将数据保存在Code Flash中,恰好与(擦 / 写)代码所处于同一分区,那么此时要开启AC搬移功能,先将AC搬移到指定的内存(其他分区)中再执行。
2. API
函数 | 描述 |
---|---|
Fls_Init | 初始化FLS模块 |
Fls_Erase | 擦除内存数据 |
Fls_Write | 写入内存数据 |
Fls_Read | 读取内存数据 |
Fls_Cancel | 取消当前操作 |
Fls_GetStatus | 获取当前工作状态 |
Fls_GetJobResult | 获取任务执行结果 |
Fls_Compare | 数据比较 |
Fls_SetMode | 设置工作模式 |
Fls_MainFunction | 任务处理函数(状态机) |
3. 配置介绍
3.1 General
3.1.1 FlsConfigSet
Fls Access Code Erase:
RAM地址
Fls Access Code Write:
RAM地址
AC code加载地址,当Fls Load Access Code On Job Start 开启时需要关注
Fls Access Code Erase Pointer:
NULL_PTR
Fls Access Code Write Pointer:
NULL_PTR
除非用户要自己实现擦/写函数,如果自己实现,并且开启AC搬移,需注意代码的地址无关
Fls Default Mode:
FLASH初始运行模式
Fls AC Callback:
Access Code回调函数
Fls Job End Notification:
任务执行完成回调
Fls Job Error Notification:
任务执行错误回调
Fls Start Flash Access Notification:
AC代码执行前回调
Fls Finished Flash Access Notification:
AC代码执行后回调
Fls Max Read FastMode:
快速模式下单次数据读取最大长度
Fls Max Read Normal Mode:
普通模式下单次数据读取最大长度
读取数据,不要超过FLASH大小
Fls Max Write Fast Mode:
快速模式下单次数据写入最大长度
Fls Max Write Normal Mode:
普通模式下单次数据写入最大长度
数据写入,必须大于0且是8的倍数
3.1.2 FlsGeneral
Fls Load Access Code On Job Start
:AC代码搬移
当未开启的时候,配置项中(擦/写)函数直接引用AC函数,存放的是函数地址,如下图所示:
当开启的时候,配置项中存放的是用户配置的RAM地址,在(擦/写)操作开始之前,将ROM中的AC代码搬移到这个RAM地址中去,如下图所示:
因此用户需要合理的指定RAM的地址,并且将AC代码固定到指定的地址,这样才能进行数据搬移。AC代码固定到指定的地址,S32DS就去改写ld文件,IAR就去改写icf文件等。
注意:
开启了该选项后,在程序和擦除地址在同一分区的情况下,(擦/写)模式不能配置为异步操作,必须是同步操作。
3.2 FlsSector
Fls Physical Sector Unlock:
在初始化的时候对扇区解锁
Fls Physical Sector:
物理扇区选择
Fls Physical Sector Size:
物理扇区大小
Fls Number Of Sector:
仅针对于外部Flash描述相同且连续的扇区,内部FLASH只能填1
Fls Page Size:
扇区页大小
Fls Sector Size:
扇区大小
Fls Sector Start Address:
扇区起始位置
Fls Sector Erase Asynch:
擦除(异步模式)
Fls Page Write Asynch:
写入(异步模式)
异步模式:擦/写动作执行完成后,不是阻塞等待结果,通过Fls_MainFunction轮询查询结果
参考资料:
S32K-RM.pdf - NXP
AUTOSAR_MCAL_FLS_UM[1].pdf - NXP
这篇关于【Autosar】MCAL - FLS(NXP - S32K14x)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!