autosar嵌入式环境中共享内存的链接器和内存映射

问题描述 投票:0回答:1

我正在尝试理解 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

由于我对这些链接器和内存映射概念不熟悉,我想了解这段代码在内存中到底做了什么。

  1. 链接器文件中的

    MEMORY
    GROUP
    标签是什么?
    *(.CoreIpcRAM_noinit)
    变量的用途是什么?

  2. 在Memap文件中,为什么

    CoreIpcRAM_noinit
    定义了两次?

    #pragma 节 DATA "" "CoreIpcRAM_noinit"

    #pragma 节 SDATA "" "CoreIpcRAM_noinit"

  3. 在memmap文件中,为什么在

    CoreIpcRAM_noinit
    M1_START_SEC_CONST_UNSPECIFIED
    定义中使用
    M2_START_SEC_IPC_MEMORY_VAR_NOINIT_32BIT

  4. #pragma use_section DATA m2_Ipc_Memory
    命令有什么用?

如果有人知道,这将有助于理解这些概念。

c memory-management linker embedded autosar
1个回答
0
投票

我也是关于编译指示、链接器和编译器部分概念的新手。我自己学习并试图弄清楚这些部分是如何运作的。 (请参阅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 的部分中。

© www.soinside.com 2019 - 2024. All rights reserved.