目录
关键词
嵌入式、C语言、autosar、OS、BSW
平台说明
项目 | Value |
---|---|
OS | autosar OS |
autosar厂商 | vector , EB |
芯片厂商 | TI 英飞凌 |
编程语言 | C,C++ |
编译器 | HighTec (GCC) |
autosar版本 | 4.3.1 |
参考文档 | AUTOSAR_SWS_NVRAMManager.pdf AUTOSAR_TPS_SoftwareComponentTemplate.pdf AUTOSAR_EXP_NVDataHandling.pdf AUTOSAR_SWS_NVRAMManager.pdf |
>>>>>>>>>>>>>>>>>>>>>>>>>回到总目录<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
缩写 | 描述 |
---|---|
EEPROM | Electrically Erasable Programmable read only memory |
NVM | NVRAM Manager |
MEMIF | Memory Abstraction Interface |
EA | EEPROM Abstraction |
EEP | internal/external EEPROM DRIVER |
FEE | Flash EEPROM Emulation |
FLS | internal/external Flash Driver |
FCFS | First come first served |
一、定义及说明
1.1 per_instance memories(PIM)
定义在ASWC中,理解为专属于这个ASWC 的RAM block ,属于RAM。在生成代码中为
(NvM_RamAddressType)&Rte_CpDemo_1_PIM_seatposition /* NvMRamBlockDataAddress */
1.2 Service NvBlockNeeds (SN)
Service NvBlockNeeds 可以存在于ASWC或者NVBlockSwComponent。
可以理解为一个标准NVRAM block 加上 在ASWC层级上 对BSW 的需求。
其中,NVM_AC3_SRBS_Defs 中,AC3= Nvm API class 3.SRBS = SetRamBlockStatus API used. Defs = there is a rom default and additional operation "restoreBlockDefaults"exists.
其中:
默认值会生成
配置同步到 Davinci cfg中则生成一个相应的NV block,如下图所示:blcok name = swc名+SN名。
1.3 NVBlockSwComponent
如下图所示,通过davinci developer 创建component。
NVBlockSwComponent 存在的目的有以下原因:
- 1.其他ASWC可以通过NV port 将RAM数据集中传到此component 集中处理,类似于COM模块。
- 2.为NVRAM 的fan_in 和fan_out 提供缓存。
Fan_in /Fan_out 是指 多个ASWC对同一个NVblock 的读写。例如一个nvblock 为结构体,结构体中有三个元素,ASWC1 对元素1写,同时ASWC2对元素2/元素3写。 - 3.可以使多个ASWC 访问同一个NV block。
- 4.可以防止RTE 的并发访问。
1.4 NvblockDescriptor
存在于NVBlockSwComponent中,可以理解为一个完整的NVblock,和NV block 是1:1 的映射关系,包含了RAM mirror和默认 ROM 数据,其中还包含一个nv needs。
配置同步到 Davinci cfg中则生成一个相应的NV block,如下图所示:blcok name = component名+descriptor名。
可以在下图中选择写入的触发方式:轮询或者事件触发。
二、NVM 的常用现方式
在autosar标准中,NvM模块没有指定它的用户实际如何访问RAM block。如何实现数据的准确性,实时性和完整性是用户自己的职责。
2.1 不使用PIM 不经过RTE 访问NV block
2.1.1 描述
最简单粗暴的一种方式,在davinci cfg中的NVM 和FEE 手动配置NV block ,ASWC 直接通过NvM_Write/ReadBlock API进行访问。
这种方式需要用户自行判定当前block 是否pending或者有错误。
在标准中对这种方式强调过:无法在多个ASWC 中访问同一个NV block,但是实际上可以强制实现,只需要包含头文件到相应SWC,把NVRAM 当成一个全局变量使用。但是不建议这么玩,因为没有经过RTE,无法保护其并发访问时的数据没错误。
2.1.2 实现
参考[AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试
2.2 使用PIM 且经过RTE 访问NV block
2.2.1 描述
如上图所示,与2.1 相比,多了一个PIM(Per_instance) 。ASWC 对nvblock 的操作都是通过Rte_Pim API 来实现的,如Rte_Pim_writeblock。
RTE不能保证访问每实例内存的数据一致性。APP 端负责访问数据的一致性。为了数据一致性。
APP不应该在调用NvM_ReadBlock / NvM_WriteBlock之后立即访问NV数据,应该直到它被通知(通过JobFinished回调)作业成功。
perinstancemmemory在RTE中被分配为RAM块,只能由该SW-C访问。因此,相同的数据不能在两个或多个SW-C之间共享。在这个用例中,“访问NVRAM块”不应该在多核环境中使用。
2.2.2 实现
2.2.2.1 需求
创建一个ASWC = CtApDemo_1,一个10ms 的runnable操作一个PIM_seatposition 的PIM 和NvBlockNeed_seat_position 的needs。
2.2.2.2 developer中创建SWC
2.2.2.3 SWC 实现
2.2.2.4 创建PIM
2.2.2.5 创建server needs 并添加server port 映射
2.2.2.6 创建10ms runnable 并添加C/S access
添加AC3_SRBS 后可在10ms runnable 中添加invoke C/S 口。
2.2.2.7 保存后同步到 davinci cfg 并mapping
在davinci cfg 较老版本中,需要手动进行memory mapping。
而在较新版的软件中直接配置自动同步就行,如下图所示:
2.2.2.8 选择memory block 对应的fee 或者EA
一般这儿会出现unrelated 的block,需要手动解决链接到FEE。
2.2.2.9 server mapping
确保ASWC 中的服务mapping到了NVM。
2.2.2.10 F7 F8 生成 代码
包括 RTE OS FEE NVM
2.2.3 code
2.2.3.1 NvM_Cfg.c
2.2.3.2 Rte.c
默认值
2.2.3.3 CtApDemo_1.c
2.2.3.4 CtApDemo_1.h
nvblock ID 定义如下
2.3 使用NvBlockSwComponentType
2.3.1 描述
也就是在ASCW 和NVM 之间新增一个Non-Vlolatile Memory block 类型的NvBlockSwC。RTE 中的NvBlockSwComponent用于创建RAM。
ASWC通过Nv Port(与Sender/Receiver Port类似)将数据传给NvBlockSwC,NvBlockSwC收到数据后再通过C/S接口去调用NvM_WriteBlock API向NvM请求写数据,再由NvM写入数据到Fls或Eep。
当ASWC需要读取NV block 数据的时候,可以让ASWC 通过C/S port 触发NvBlockSwC调用NvM_ReadBlock 获取数据并通过NV Port 传输到ASWC。
注意:
在dirtyFlag=TRUE的情况下,NvM_WriteBlock/NvM_SetRamBlockStatus不通过C/S请求。在dirtyFlag=FALSE的情况下,所有服务都是通过C/S请求的。
vector 中 dirtyFlag=TRUE 指定RTE是否应该控制NvM函数的调用,以便对可能修改的RAM进行写入和/或状态控制块,代码见最后一节。
建议使用显示同步,也就是有一个RAM mirror的。
使用这种方式可以实现多个ASWC 对同一个NV block 的读写,也能保护RTE 的并发访问并抱枕数据的一致性。
2.3.2 实现
2.3.2.1 需求
创建一个CtNvProcess 名称的 NVcomponent SWC ,用于CtApDemo_1来存放 window_position 的数据用于控制车窗位置。包含属性为:CtApDemo_1 每10ms存放一次数据。显式同步,下电写入,上电读取,没有ROM block,开启dirty flag = true。
2.3.2.2 创建NV interface 和NV SWC CtDemo_1并实现
2.3.2.3 配置NV interface
2.3.2.4 配置 NV SWC
这里注意server 还是client
2.3.2.5 配置demo_1 SWC
添加触发
2.3.2.6 在developer 中连线或者 cfg中进行port mapping
2.3.2.7 保存并同步到cfg
参照 2.2.2.7 —2.2.2.10 解决错误并生成代码。
2.3.3 Code
2.3.3.1 CtApDemo_1.c
2.3.3.2 CtApDemo_1.h
2.3.3.3 Rte.c
2.3.3.3.1 写入顺序
调用 NvM_SetRamBlockStatus 设置mark ,下电write all 的时候写入。
2.3.3.3.1 读取顺序
由于是显式同步,有一个mirror,在写入的时候会提供一个副本到mirror或者上电的时候也会通过callback 从RAM block 获取一个副本。
>>>>>>>>>>>>>>>>>>>>>>>>>回到总目录<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<