[英]What is the best way for interprocessor communication in Linux?
我在芯片上有兩個CPU,它們有一個共享內存。 這不是SMP體系結構。 芯片上只有兩個CPU具有共享內存。
第一個CPU上有一個類似Unix的操作系統,第二個CPU上有一個Linux操作系統。
第一個CPU做一些工作,此工作的結果是一些數據。 在第一個CPU完成其工作后,應告訴另一個CPU該工作已完成,第二個CPU必須處理該數據。
處理處理器間通信的方式是什么? 我應該使用哪種算法來做到這一點?
任何有關該文章的參考將不勝感激。
一切都取決於硬件。 如果您擁有的只是共享內存,而沒有其他通信方式,則您必須使用某種輪詢。
您的兩個處理器都運行Linux嗎? 他們如何處理共享內存? 一個好的解決方案是將鏈接列表用作fifo。 在此fifo上放置數據描述符,例如地址和大小。
例如,您可以有一個輸入和輸出fifo,如下所示:
環
處理器B等待輸出fifo上的數據描述符
當然,最困難的部分是鎖定。 也許您應該重新編寫您的問題,以強調這不是“標准” SMP。
如果您沒有原子測試並設置了內存上的可用位操作,那么我想您必須采用一種方案,其中某個內存區域僅對一個處理器寫入,而對另一個處理器僅讀取。
編輯:有關將消息從一個處理器傳遞到另一個處理器的方法,請參見Hasturkun答案,使用有序寫入而不是原子性來提供對某些預定義數據的序列化訪問。
好。 我理解這個問題。我已經解決了此類問題。
現在,您需要了解的第一件事是2個CPU之間存在的共享內存的工作。 由於可以通過不同的方式訪問這些共享內存,因此您需要確定最適合您的內存。
大多數情況下,將在共享內存中提供硬件信號燈以及硬件中斷,以通知從一個處理器到另一處理器的消息傳輸。
因此,首先看一下。
一個非常好的方法是僅使用套接字來回發送IP數據包。 這樣做的好處是您可以在芯片外進行測試-例如,如果您有網絡連接,則可以在PC上運行一個進程的測試版本。
如果兩個處理器都由一個操作系統管理,那么您可以使用任何標准IPC進行相互通信,因為操作系統可以處理所有事情。 如果它們在不同的操作系統上運行,那么套接字將是您的最佳選擇。
編輯
快速單向版:
在里面:
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;
}
如何使用共享內存?
我現在沒有很好的鏈接,但是如果您用google搜索IPC +共享內存,我敢打賭,您會找到一些不錯的信息:)
您確定需要這樣做嗎? 以我的經驗,最好讓編譯器和操作系統管理進程如何使用多個CPU。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.