为何要谈MemMap?
MemMap模块会生成内存映射的头文件给BSW和SWCs使用,换言之;
MemMap目的是预先定义一些关键字(宏),进而来指定OsApplication里面相关Code和RAM怎么存放。
至于实际存放在单片机的那个位置,需要vLinkGen来指定了(链接器),其他章节来讲。
MemMap代码实施过程分析
参考文档
C:\vector\CBD2201338_D00\Doc\UserManuals\UserManual_MemoryMapping.pdf
CBD2201338_D00是基于Renesa U2A8 (R7F702301BEBBA-C#BC6)开发的APP-SIP包。
相关缩写
xxx_MemMap.h索引关系
请牢记这张图的索引关系
考虑Vector也在迭代更新,不同SIP包的MemMap.h相关的包含关系有所不同
搜索 "MemMap_Common.h" (3个文件中匹配到13次,总计查找4次)
C:\vector\CBD2000298_D00\Applications\SipAddon\StartApplication\Appl\Include\MemMap_Common.h (匹配9次)
C:\vector\CBD2201337_D00\Demo\DemoHsm\Appl\GenData\MemMap_Common.h (匹配2次)
C:\vector\CBD2201338_D00\Applications\SipAddon\StartApplication\Appl\GenData\MemMap_Common.h (匹配2次)
搜索 "MemMap_Compatibility.h" (2个文件中匹配到4次,总计查找2次)
C:\vector\CBD2201337_D00\Demo\DemoHsm\Appl\GenData\MemMap_Compatibility.h (匹配2次)
C:\vector\CBD2201338_D00\Applications\SipAddon\StartApplication\Appl\GenData\MemMap_Compatibility.h (匹配2次)
搜索 "MemMap.h" (3个文件中匹配到6次,总计查找4次)
C:\vector\CBD2000298_D00\Applications\SipAddon\StartApplication\Appl\Include\MemMap.h (匹配2次)
C:\vector\CBD2201337_D00\Demo\DemoHsm\Appl\Include\MemMap.h (匹配2次)
C:\vector\CBD2201338_D00\Applications\SipAddon\StartApplication\Appl\Include\MemMap.h (匹配2次)
举例说明:SWC模块
因为除了SWC模块,其他l类似于BSW等模块也存在MemMap相关宏的声明,及引用MemMap_Common.h,所以我们先以SWC模块来举例。
1、在DavinciDeveloper中创建一个SWC模块,名称为IPC,且定义相关runnable,如下图:
2、到DacinciCfg中执行Generate SWC,它会生成对应的SWC文件,IPC.c文件就是是其中一个;
它位于:Driver\CDD\IPC\IPC.c,当然路径是用户指定的
接下来我们开始盘它!
3、IPC.c的实现过程:
首先它包含了一个Rte_IPC.h
#include "Rte_IPC.h"
#include "TSC_IPC.h"
而Rte_IPC.h写法如下:
# define IPC_START_SEC_CODE
# include "IPC_MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */
FUNC(Std_ReturnType, IPC_CODE) IPC_DataSend_If_Operation(P2VAR(uint8, AUTOMATIC, RTE_IPC_APPL_VAR) p_msg, uint16 len, uint8 priority); /* PRQA S 0786, 3449, 0624 */ /* MD_Rte_0786, MD_Rte_3449, MD_Rte_0624 */
FUNC(void, IPC_CODE) IPC_Init(void); /* PRQA S 0786, 3449, 0624 */ /* MD_Rte_0786, MD_Rte_3449, MD_Rte_0624 */
FUNC(void, IPC_CODE) IPC_MainFunction(void); /* PRQA S 3451, 0786, 3449 */ /* MD_Rte_3451, MD_Rte_0786, MD_Rte_3449 */
FUNC(void, IPC_CODE) IPC_STB_MainFunction(void); /* PRQA S 3451, 0786, 3449 */ /* MD_Rte_3451, MD_Rte_0786, MD_Rte_3449 */
# define IPC_STOP_SEC_CODE
# include "IPC_MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */
因此它的作用我们可以总结为:对我们创建的runnable声明,且runnable是位于,以IPC_START_SEC_CODE开始,IPC_STOP_SEC_CODE结束的区间内
接着,我们回到IPC.c文件,发现相关runnable确实是被定义到了上面提到的字段中,如下图:
那么问题来了,START / STOP区间是如何实现的呢?
此时我们就要看IPC_MemMap.h这个文件,
它位于Davinci\Gen\Appl\GenData\Components\IPC_MemMap.h,也属于DavinciCfg生成的文件
逼不得已,我们需要看IPC_MemMap.h它的写法,写法如下
#ifdef IPC_START_SEC_CODE
# undef IPC_START_SEC_CODE /* PRQA S 0841 */