gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 14:51:46 25 4
gpt4 key购买 nike

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

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

  • Master 这是默认模式。它将作为 RS485 总线上的总线主控轮询数据,然后将其发送到具有不同协议(protocol)的另一 block 板。

  • Slave,它响应串行端口上的 PC 应用程序。

程序将处于主模式或从模式,因为同一个 RS-485 总线在 PC 应用程序和其他从板之间共享。

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

我尝试搜索 Code Composer Studio 的内存覆盖功能,但没有成功。


基本上,我有这个:

char Slaverxbuffer[2048];
char Masterrxbuffer[2048];

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

所以我需要一种方法让 SlaverxbufferMasterrxbuffer 使用相同的内存区域,比如:

char Sharedbuffer[2048];

最佳答案

您能否只拥有一个缓冲区并在两种操作模式之间共享它?这可能是最简单的解决方案。

否则,在 C 和 C++ 中,您可以通过将两个缓冲区设为 union 类型的字段来实现此目的。 union 体中的每个成员在内存中都有相同的基地址, union 体的总大小是最大成员的大小。

代码看起来像这样:

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();
}

请注意,如果您使用 union ,您应该始终读取最近写信给的成员。写入一个成员,然后从另一个成员读取是 undefined behavior ,很可能会导致错误代码。例如代码:

overlay.Slaverxbuffer[i] = 1; 
overlay.Masterrxbuffer[i] = 2;
x = overlay.Slaverxbuffer[i];

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

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

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

关于embedded - 如何通过在同一位置映射两个变量来重用物理内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32018982/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com