我正在用MSP430F2619和CodeComposerStudio6.1为串行通信网关编写代码。
网关有两种不同的操作方式:
该程序将处于主从模式,因为PC应用程序和其他从板之间共享相同的RS-485总线。
与其为每种模式使用两个不同的内存缓冲区,我还试图弄清楚两个缓冲区是否可以使用相同的物理内存。
我试图搜索的内存覆盖特性,但没有成功。
基本上,我有这样的想法:
char Slaverxbuffer[2048];
char Masterrxbuffer[2048];我希望这两个缓冲区共享相同的内存,这样我将使用2KB内存而不是4KB内存。
因此,我需要一种让Slaverxbuffer和Masterrxbuffer使用相同内存区域的方法,比如:
char Sharedbuffer[2048];发布于 2015-08-06 17:06:38
您能不能只有一个缓冲区,并在这两种操作模式之间共享它?这可能是最简单的解决办法。
否则,在C和C++中,可以通过让两个缓冲区是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();
}请注意,如果您使用的是工会,则应该始终从您最近写信给的成员那里阅读。向一个成员写入,然后从另一个成员读取是undefined behavior,可能会导致错误代码。例如,代码:
overlay.Slaverxbuffer[i] = 1;
overlay.Masterrxbuffer[i] = 2;
x = overlay.Slaverxbuffer[i];可以很好地将x设置为1,因为这“显然”是存储在overlay.Slaverxbuffer[i]中的最后一个值,尽管该内存地址现在包含值2。
实现这一目标的另一种方法是使用编译器和链接器指令将两个缓冲区放置在内存中的特定位置。大多数嵌入式工具链将允许您通过源代码中的#pragma指令执行此操作。指令的确切格式将取决于特定的工具链;下面是几个示例。
然后在链接器文件中,添加将符号放置在特定位置的指令:
发布于 2015-08-06 19:17:47
如果,正如您所说的,您不需要一个联合,那么您只需要一个单独的缓冲区和一个单独的变量来记录您所处的模式?
char rxBuffer[2048];
bool rxMode; // false = master, true = slave这样,您就可以将缓冲区放在固定的内存位置(由链接器定义)并链接到缓冲区。
https://stackoverflow.com/questions/32018982
复制相似问题