gpt4 book ai didi

c - 双核 AMP 系统中的简单 C 互斥实现

转载 作者:太空宇宙 更新时间:2023-11-04 00:01:41 27 4
gpt4 key购买 nike

我正在使用 Zynq-7000 SoC - 开发双核(CPU0、CPU1)应用程序。我想使用禁用缓存的共享片上内存 (OCM) 来进行内核之间的双向数据交换。我的想法是按以下方式设置数据共享:

typedef struct
{
uint8_t mstatus;
uint8_t[10] mdata;
} mailbox;

mailbox core0mbox;
mailbox core1mbox;

结构 mailbox 拥有一个缓冲区,用于存储数据 (mdata) 及其状态 (mstatus)。状态可能等于01(一般情况下——零值表示数据已被接收方处理,新数据可能写入缓冲区;非零值表示接收方尚未处理数据)。有两个邮箱——core0mbox(存放core 0从core 1收到的数据)和core1mbox(存放core 1从core 0收到的数据),都存放在强制症。

当核心0要发送数据时,它会轮询状态标志core1mbox.mstatus

  • 如果等于0,核心用数据填充与core1mbox关联的缓冲区,然后将与core1mbox关联的标志设置为1
  • 如果它有一个非零值,核心就不能发送数据

当核心1要发送数据时,它会轮询状态标志core0mbox.mstatus

  • 如果等于 0,核心用数据填充与 core0mbox 关联的缓冲区,然后将与 core0mbox 关联的标志设置为 1
  • 如果它有一个非零值,核心就不能发送数据

核心 0 定期轮询 core0mbox.mstatus - 如果它具有非零值,则核心 0 处理数据并在完成后设置 core0mbox.mstatus0.

核心 1 定期轮询 core1mbox.mstatus - 如果它具有非零值,则核心 1 处理数据并在完成后设置 core1mbox.mstatus0.

我的问题是 - 由于并发访问引起的问题,此方案是否会导致系统的不确定行为(例如数据损坏)?我知道如果状态标志可能有更多的值(由于非原子写入/读取操作引起的问题)或者系统中有更多的内核,则此方案无法工作,但它似乎适用于描述的情况。

最佳答案

互斥锁不仅涉及对直接受影响的数据的控制,而且还涉及保证线程相互一致地看到其他数据。 C11 之前的 C 甚至没有定义和工具来谈论这个,你将完全依赖于架构特定的行为。

在您的设置中可能发生的情况,例如,由于某些架构偏差,对 status 字段的更改可能对另一个线程可见,其中对 mdata字段的更改可能尚未传输(想想缓存层次结构、字对齐......)。

所以,不,您不应该这样做,除非您确切知道将为您的平台实现数据一致性模型。

任何平台上进行这项工作的最低要求是将您的变量限定为volatile,否则优化编译器可能会假装任何数据都无法更改从当前函数之外发生。

关于c - 双核 AMP 系统中的简单 C 互斥实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40634614/

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