前言:
The Memory Mapping (MemMap) module is used to map code and data to specific memory sections via memory
mapping files. MemMap generates specific header files which contain memory mapping preprocessor defined
for MemorySection elements and compiler-specific instructions.
(内存映射(MemMap)模块用于通过内存映射文件将代码和数据映射到特定的内存部分。MemMap生成特定的头文件,其中包含为MemorySection元素和编译器特定指令定义的内存映射预处理器。)
上面是比较官方的回答,说人话就是把数据和代码放在ECU内指定的地址。
初级应用:软件中的bss,data,rodata,code,text段需要在memory layout中划分具体的物理地址,对于多核系统,要将执行的数据和代码放在目标核的RAM和ROM。
高阶应用:出于功能安全的考虑,通常需要对不同作用的模块(Cdd,BSW,MCAL,SWC)制定ASIL等级,不同等级他们对应的内存分区也不一样。QM级别模块是不能访问ASIL级别的模块内容的。更进阶的可以应用MPU,对不同等级的模块做内存保护,防止跨域访问。
配置过程中使用到的工具如下:
Compiler:Tasking
MCU: Infinenon TCxxx
BSW configuration Tools: EB tresos 28.2.0
RTE configuration Tools: AUTOSAR builder
配置步骤:
1.ld链接文件的修改及定义
TCxxx系列的MCU主要可以使用内存资有Pflash,DSPR,PSPR,DLMU,GLMU,DataFlash,UCB DataFlash,官方推荐的使用如下:
如果说追求效率,那么最好把对应核运行的数据和代码放在对应核的地址,下图展示不同地址的访问周期。
对于需要跨核访问的数据,博主是建议放在GLMU,内存分配是个细致活儿,需要根据实际需求设计,下面是一个例子。
设计好memory layout后,下面就要去修改链接文件,我们用的是tasking,所以格式如下:
其他内存的格式定义大致相同,这里不做过多描述。
这种格式是待会儿需要在memmap模块中使用的,目的就是将中间的内容(xxxx)放在固定的地址,具体如何定义可以参考tasking的手册。
#pragma section fardata core0_dspr
xxxx
#pragma section fardata restore
2.SWC中添加MemorySection
创建好的SWC通常需要port,Runable,interface,Implementation等,我们需要在Implementation下添加我们需要的Memory Sections.每一个Memory Sections都需要reference一个Sw Addr method,对于具有LOCAL特性还需要配置option.
3.Memmap模块的配置
3.1.导入Memmap模块
3.2.导入生成的swc_xxx>arxml
3.3MemMap模块内的配置
这里主要的作用是将Memory Sections和ld中定义的块关联起来。
3.3.1 General
3.3.2 MemMapAddressingModeSet
MemMapSupportedSectionType这里选择当前Section的类型。
MemMapAddressingMode 这里就是前面提到的需要填充的申明格式,特别要注意的是MemMapAlignmentSelector一定要和reference 的Sw Addr method一致。
3.3.3 MemMapAllocation
这里需要将定义好的Addressingmodef分配给不同的sections.可以根据AUTOSAR分层定义多个Allication.
下图中将SWC中定义section和Addressingmode关联在一起,对于通用的分区,可以在GenericMapping中定义。
以上配置好,检验配置,不报错就可生成代码,下面是实际生成的代码效果。
4.在SWC代码添加MemMap宏
其他section类似,这里要注意的是一定要将内容加载固定格式中间,定义好可以开始编译,编译后在map中检查是否在固定地址。