我正在尝试理解 Autosar 内存映射概念。我有两个核心微控制器,它们会互相发送一些数据。所以我有一个用于IPC通信的共享内存。在我的项目中,我可以看到他们为共享内存保留的一些区域。
链接器文件:
MEMORY {
CORE_SHARED_RAM : org = 0x200C1020, len = 0x00000FA0
}
GROUP : {
__CORE_SHARED_RAM_START = .;
.CoreIpcRAM_noinit ALIGN(4): { *(.CoreIpcRAM_noinit) }
__CORE_SHARED_RAM_END = .;
} > CORE_SHARED_RAM
MemMap.h
#ifdef M1_START_SEC_CONST_UNSPECIFIED
#undef M1_START_SEC_CONST_UNSPECIFIED
#undef MEMMAP_ERROR
#pragma section DATA "" "CoreIpcRAM_noinit"
#pragma section SDATA "" "CoreIpcRAM_noinit"
#endif
#ifdef M2_START_SEC_IPC_MEMORY_VAR_NOINIT_32BIT
#undef M2_START_SEC_IPC_MEMORY_VAR_NOINIT_32BIT
#undef MEMMAP_ERROR
#pragma section DATA "" ".CoreIpcRAM_noinit"
#pragma use_section DATA m2_Ipc_Memory
#endif
由于我对这些链接器和内存映射概念不熟悉,我想了解这段代码在内存中到底做了什么。
链接器文件中的
MEMORY
、GROUP
标签是什么?*(.CoreIpcRAM_noinit)
变量的用途是什么?
在Memap文件中,为什么
CoreIpcRAM_noinit
定义了两次?
#pragma 节 DATA "" "CoreIpcRAM_noinit"
#pragma 节 SDATA "" "CoreIpcRAM_noinit"
在memmap文件中,为什么在
CoreIpcRAM_noinit
和M1_START_SEC_CONST_UNSPECIFIED
定义中使用M2_START_SEC_IPC_MEMORY_VAR_NOINIT_32BIT
?
#pragma use_section DATA m2_Ipc_Memory
命令有什么用?
如果有人知道,这将有助于理解这些概念。
我也是关于编译指示、链接器和编译器部分概念的新手。我自己学习并试图弄清楚这些部分是如何运作的。 (请参阅GNU LD Linker,以及其他文档)
链接器文件中的 MEMORY、GROUP 标记是什么以及 *(.CoreIpcRAM_noinit) 变量的用途是什么?
MEMORY
部分定义了微控制器上可用的内存区域。每个内存区域都有一个起始地址(org)和长度(len)。
GROUP
应放置在特定内存区域中的部分或变量。
.CoreIpcRAM_noinit ALIGN(4)
部分包含应放置在 CORE_SHARED_RAM 中并对齐到 4 字节的变量。
在Memap文件中,为什么CoreIpcRAM_noinit定义了两次?
这是针对嵌入式系统中不同数据类型或用例处理内存部分的方式。
在memmap文件中,为什么M1_START_SEC_CONST_UNSPECIFIED和M2_START_SEC_IPC_MEMORY_VAR_NOINIT_32BIT定义中都使用了CoreIpcRAM_noinit?
两个内核可能通过处理器间通信 (IPC) 共享数据,并且需要访问同一内存区域。
#pragma use_section DATA m2_Ipc_Memory 命令有什么用?
它告诉编译器将所有后续变量声明放置在名为 m2_Ipc_Memory 的部分中。