使用在共享内存中创建的队列进行imx8mm的m4和A53之间的IPC

问题描述 投票:0回答:1

我想在 imx8mm 的 2 个处理器核心(即 A53 和 M4)之间创建 IPC 通信堆栈,但我不想使用中断。我有两种类型的消息要在核心之间共享, 一种是每 10ms 读取一次的循环数据,因此它只是一个放置在共享内存中的简单结构体,由 m4 写入并由 a53 读取。

我的问题是关于另一种消息类型,即非循环数据,所以它不是一个固定的结构,它是某种类型的数据包,最大大小为 128 字节,我还将附加一些标头、页脚、datalen、消息 ID,假设总大小为 136 字节(字对齐)

我的想法是定义一个队列,

struct packet
{
uint8 Packet[136];
}

struct Queue
{
u32 Read;
u32 Write;
Packet Msg[10];
}

我将把队列对象放在共享内存中 队列 M4toA53QHandle @“SM_segment”

读和写都是32位的,因此读和写是原子的。此外,两个核心都不会写入队列中的元素。 A53只会修改读索引,m4只会修改写和Packet数据。

我的问题涉及更广泛的范围,您认为这种方法有任何并发或排序问题吗?我读到了有关无序内存操作的信息,这可能会导致我的写入索引在数据包完全复制到队列槽之前更新,但“DMB”将解决该问题。

embedded ipc message-queue shared-memory imx8
1个回答
0
投票

对于任何给定的共享内存位置,只要一侧始终读取,一侧始终写入,那么只要您在更新“可读取”索引/指针之前更新消息内容,它就应该可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.