我的芯片上有两个 CPU,它们有一个共享内存。这不是 SMP 架构。芯片上只有两个具有共享内存的 CPU。
第一个 CPU 上有一个类 Unix 操作系统,第二个 CPU 上有一个 Linux 操作系统。
第一个 CPU 做了一些工作,这个工作的结果是一些数据。在第一个 CPU 完成其工作后,它应该告诉另一个 CPU 工作已完成,并且第二个 CPU 必须处理此数据。
处理处理器间通信的方法是什么?我应该使用什么算法来做到这一点?
任何关于它的文章的参考将不胜感激。
我的芯片上有两个 CPU,它们有一个共享内存。这不是 SMP 架构。芯片上只有两个具有共享内存的 CPU。
第一个 CPU 上有一个类 Unix 操作系统,第二个 CPU 上有一个 Linux 操作系统。
第一个 CPU 做了一些工作,这个工作的结果是一些数据。在第一个 CPU 完成其工作后,它应该告诉另一个 CPU 工作已完成,并且第二个 CPU 必须处理此数据。
处理处理器间通信的方法是什么?我应该使用什么算法来做到这一点?
任何关于它的文章的参考将不胜感激。
这完全取决于硬件。如果您只有共享内存,没有其他通信方式,那么您必须使用某种轮询。
你的两个处理器都运行 linux 吗?他们如何处理共享内存?一个好的解决方案是使用链表作为 fifo。在这个 fifo 上放置数据描述符,例如地址和大小。
例如,您可以有一个输入和输出 fifo,然后像这样:
环形
处理器 B 等待输出 fifo 上的数据描述符
当然,困难的部分在于锁定。也许您应该重新提出您的问题,以强调这不是“标准”SMP。
如果您在内存上没有可用的原子测试和设置位操作,我想您必须采用一种方案,其中某些内存区域仅对一个处理器写入,而对另一个处理器只读。
编辑:请参阅 Hasturkun 答案,了解一种将消息从一个处理器传递到另一个处理器的方法,使用有序写入而不是原子性来提供对某些预定义数据的序列化访问。
好的。我理解这个问题。我已经解决了这种问题。
现在,您需要了解的第一件事是 2 个 CPU 之间存在的共享内存的工作方式。因为这些共享内存可以通过不同的方式访问,所以您需要找出最适合您的方式。
大多数情况下,硬件信号量将与硬件中断一起在共享内存中提供,以通知从一个处理器到另一个处理器的消息传输。
所以先看看这个。
编辑
快速单向版本:
在里面:
init()
{
ready = 0;
done = 1;
}
作家:
send()
{
while (!done)
sleep();
/* copy data in */
done = 0;
ready = 1;
}
读者:
poll()
{
while (1)
{
if (ready)
{
recv();
}
sleep();
}
}
recv()
{
/* copy data out */
ready = 0;
done = 1;
}
通过共享内存构建一个消息传递系统(这应该是一致的,或者通过对两个处理器不缓存,或者通过使用缓存刷新/无效调用)。
您的共享内存结构应该(至少)具有以下字段:
流程可能是这样的:(假设发送/接收同步不会同时运行)
poll()
{
/* you're better off using interrupts instead, if you have them */
while(1)
{
if (current_owner == me)
{
if (active)
{
recv();
}
else if (!request[me] && request[other])
{
request[other] = 0;
current_owner = other;
}
}
sleep();
}
}
recv()
{
/* copy data... */
active = 0;
/* check if we still want it */
if (!request[me] && request[other])
{
request[other] = 0;
current_owner = other;
}
}
send()
{
request[me] = 1;
while (current_owner != me || active)
{
sleep();
}
request[me] = 0;
/* copy data in... */
/* pass to other side */
active = 1;
current_owner = other;
}
一个非常好的方法是来回发送 IP 数据包(使用套接字)。这样做的好处是您可以在芯片外测试东西——例如,如果您有网络,可以在 PC 上运行一个进程的测试版本。
如果两个处理器都由一个操作系统管理,那么您可以使用任何标准 IPC 相互通信,因为操作系统会处理所有事情。如果它们在不同的操作系统上运行,那么套接字将是您最好的选择。
使用共享内存怎么样?
我现在没有好的链接,但如果你用谷歌搜索 IPC + 共享内存,我敢打赌你会找到一些好的信息 :)
你确定你需要这样做吗?根据我的经验,您最好让您的编译器和操作系统管理您的进程如何使用多个 CPU。