如何通过在同一位置映射两个变量来重用物理内存?

5 c embedded

我正在使用MSP430F2619和Code Composer Studio 6.1为串行通信网关编写代码.

网关有两种不同的操作模式:

  • 掌握这是默认模式.它将数据轮询为RS485总线上的总线主控器,然后将其发送到具有不同协议的另一个板.

  • 从站响应串口上的PC应用程序的从站.

程序将处于主模式或从模式,因为PC应用程序和其他从属板之间共享相同的RS-485总线.

我试图弄清楚两个缓冲区是否可以使用相同的物理内存,而不是为每种模式使用2个不同的内存缓冲区.

我试图搜索Code Composer Studio的内存覆盖功能但没有成功.


基本上,我有这个:

char Slaverxbuffer[2048];
char Masterrxbuffer[2048];
Run Code Online (Sandbox Code Playgroud)

我希望这两个缓冲区共享相同的内存,以便使用2KB内存而不是4KB内存.

所以,我需要一种方式Slaverxbuffer,并Masterrxbuffer使用相同的内存区域,是这样的:

char Sharedbuffer[2048];
Run Code Online (Sandbox Code Playgroud)

Nia*_* C. 10

您可以只使用一个缓冲区并在两种操作模式之间共享吗?这可能是最简单的解决方案.

否则,在C和C++中,您可以通过将两个缓冲区作为联合类型中的字段来实现此目的.联合中的每个成员在内存中具有相同的基址,并且联合的总大小是最大成员的大小.

代码看起来像这样:

union OverlaidBuffer
{
    char Slaverxbuffer[2048];
    char Masterrxbuffer[2048];
};

union OverLaidBuffer  overlay;

/* Code to use the slave buffer */
for(unsigned int index = 0; index < 2048; ++index)
{
     overlay.Slaverxbuffer[index] = some_slave_value();
}

/* Code to use the master buffer */
for(unsigned int index = 0; index < 2048; ++index)
{
     overlay.Masterrxbuffer[index] = some_master_value();
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您使用联合,则应始终从最近写入的成员中读取.写入一个成员,然后从另一个成员读取是未定义的行为,并可能导致错误的代码.例如,代码:

overlay.Slaverxbuffer[i] = 1; 
overlay.Masterrxbuffer[i] = 2; 
x = overlay.Slaverxbuffer[i];
Run Code Online (Sandbox Code Playgroud)

可能设置x为1,因为它"显然"是存储的最后一个值overlay.Slaverxbuffer[i],即使该内存地址现在包含值2.

另一种实现此目的的方法是使用编译器和链接器指令将两个缓冲区放在内存中的特定位置.大多数嵌入式工具链允许您通过#pragma源代码中的指令执行此操作.指令的确切格式取决于特定的工具链; 下面是几个例子.

然后在链接器文件中添加指令以将符号放在特定位置: