在不同处理器之间共享内存时需要哪些东西?

时间:2014-04-14 17:17:34

标签: c++ c arm signal-processing shared-memory

所以我有一个ARM处理器和一个DSP处理器。一些数据将使用共享内存在这两个处理器之间共享。数据可以包含数据结构,例如C ++的结构和类。哪些事情对于使应用程序使用这种共享内存非常重要。想到的一件事就是字节序,即处理器应该是小端或大端。还有什么其他的东西,这对确保正确的共享内存访问也是必要的吗?

3 个答案:

答案 0 :(得分:2)

除了Endianness之外,以下内容可能很重要,

  1. 标准API的实施可能会有所不同,并可能对共享数据产生负面影响,例如: ARM上的memcpy()是以一种独特的方式在内部实现的,至少我还记得在将一个RTOS移植到ARM时遇到的困难。我不记得确切的细节,但通过一点搜索肯定能找到。

  2. 严格使用由工具链对齐的类型和结构。因为每个体系结构的对齐和填充可能完全不同。因此,如果尝试使用指针/数组索引对结构内的值进行索引,那么您会感到惊讶。

答案 1 :(得分:2)

除了Fayyazki的答案之外,你所描述的安排还有几个额外的障碍。

  1. 同步:很可能,您需要一对门铃中断,以便CPU和DSP可以相互中断以通知对方通信。另一种选择是轮询 - 这不太可能导致高吞吐量。
  2. 原子性:将多字结构(例如C ++类)写入共享内存是有问题的,因为您没有在其他情况下可能使用的同步机制,例如总线锁定或禁用中断。如果您坚持将多字结构写入共享内存,则可以使用自旋锁来控制读写访问。控制结构的内存包装实际上可能导致更多多字访问。
  3. 并发内存访问 - 如果使用真正的多端口SRAM,则同一地址上的并发写入将是不可预测的。因此,你不能这样做。
  4. 内存/指令顺序障碍:您需要使用内存屏障来确保按照您期望的顺序在内存总线上观察到写入(许多Cortex A系列ARM CPU具有无序执行和存储行为) 。这是使内存的地址范围无法访问或刷新缓存的补充。
  5. 到目前为止,实现两个处理器之间通信的最简单方法是使用ring buffer,其中写头和尾指针是内存的自然字大小,由写处理器和读取器维护处理器分别。在将数据写入缓冲区并更新磁头指针之后,您将需要屏障(存储器和指令顺序),以确保在更新磁头指针之前由内存观察写入缓冲区。读取工作相反。

答案 2 :(得分:2)

ARM的弱排序内存模型意味着如果您使用可缓存内存,您可能必须非常小心同步和一致性 - 如果是这种情况,我建议彻底阅读大脑融化内存模型ARM ARM的章节(可能还有障碍附录)。

此外,如果两个处理器具有相同内存的不同视图(àla Raspberry Pi),那么在共享数据中使用指针可能很有趣* ...

*用于“fun”的某些给定值