首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过在同一位置映射两个变量来重用物理内存?

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

Stack Overflow用户
提问于 2015-08-06 17:00:44
回答 2查看 249关注 0票数 5

我正在用MSP430F2619和CodeComposerStudio6.1为串行通信网关编写代码。

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

  • --这是默认模式。它将轮询RS485总线上的总线主站数据,然后将其发送到另一个具有不同协议的板上。
  • 中响应串行端口上的PC应用程序。

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

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

我试图搜索的内存覆盖特性,但没有成功。

基本上,我有这样的想法:

代码语言:javascript
运行
复制
char Slaverxbuffer[2048];
char Masterrxbuffer[2048];

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

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

代码语言:javascript
运行
复制
char Sharedbuffer[2048];
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-06 17:06:38

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

否则,在C和C++中,可以通过让两个缓冲区是union类型的字段来实现这一点。联盟中的每个成员在内存中都有相同的基本地址,而联盟的总体大小是最大成员的大小。

代码应该如下所示:

代码语言:javascript
运行
复制
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();
}

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

代码语言:javascript
运行
复制
overlay.Slaverxbuffer[i] = 1; 
overlay.Masterrxbuffer[i] = 2; 
x = overlay.Slaverxbuffer[i];

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

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

  • TI Composer (参考MSP430 Optimizing C/C++ Compiler User's Guide) #语用DATA_SECTION(Slaverxbuffer,"some_section")字符Slaverxbuffer2048;
  • IAR嵌入式工作台(参考IAR C/C++ Development Guide) #语用部分= "some_section“字符Slaverxbuffer2048;

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

  • TI Composer (参考MSP430 Assembly Language Tools User's Guide) 节{ .some_section : load = 0x12345678 }
  • IAR嵌入式工作台(参考IAR C/C++ Development Guide) 地址mem:0x12345678 {ReadW区some_section };
票数 10
EN

Stack Overflow用户

发布于 2015-08-06 19:17:47

如果,正如您所说的,您不需要一个联合,那么您只需要一个单独的缓冲区和一个单独的变量来记录您所处的模式?

代码语言:javascript
运行
复制
char rxBuffer[2048];
bool rxMode;  // false = master, true = slave

这样,您就可以将缓冲区放在固定的内存位置(由链接器定义)并链接到缓冲区。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32018982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档