1. 程式人生 > >lpc43xx雙核處理器之雙核通訊

lpc43xx雙核處理器之雙核通訊

從去年10月份開始學習lpc4357雙核開發板,雙核最主要的難點就是如何實現M4與M0的通訊。nxp提供了3種通訊機制,結合自己的理解整理如下:

1.Interrupt

M4與M0各自有自己的NVIC控制機器,自然就有自己的中斷向量表,與以往單核不同的是,M4的中斷向量表裡面多了一個M0CORE_IRQHandler(稱之為來自m0的中斷),M0多了一個M4CORE_IRQHandler(稱之為來自m4的中斷)。也就是說M4可以中斷M0,M0也可以中斷M4。這種中斷方式的通訊只是作為簡單的通知事件,並沒有實際的資料傳輸。如果一個核想要中斷另一個核,它只需要執行一個SEV指令(由Cortex結構提供)。那麼遠方的核(執行SEV指令的的核稱之為local core)就會跳轉到中斷處理函式去執行。在中斷處理函式中,我們可以做一些簡單的操作,比如點亮或者關閉led。

2.Message queue

這種方式我們稱之為訊息佇列,在記憶體區域中分配2個buffer,一個為CMD_BUFFER,一個為MSG_BUFFER。每個buffer都有以下4個量進行定義,QstartAddress、QendAddress、RdPtr、WrPtr。CMD_BUFFER只允許M4往裡面寫,M0從裡面讀;MSG_BUFFER只允許M0往裡面寫,M4從裡面讀。每寫完一次WrPtr++、每讀完一次RdPtr++。由於M4與M0讀寫的地址不一樣,這樣就不出會出現同時往同一個地址寫所產生的衝突。再往佇列寫之前都要先檢視下佇列的狀態,若佇列不是滿的(判斷佇列的狀態分好幾種情況,這裡只簡單介紹一種,如果WrPtr+size>=RdPtr,就認為佇列為滿,不能插入新的資料),那麼就往裡面寫資料,並WrPtr++,然後通知遠方的處理器。規定WrPtr==RdPtr時,佇列的狀態為空。遠方的處理器在接收到來自另外的一個處理器發來的中斷後,就從佇列裡讀出資料(首先先判斷佇列不為空)。從M4發出的command的形式有以下2種:

第一個為讀命令,沒有實際的資料傳遞,只作為通知事件使用。第二個命令為寫命令,後跟一個32bit的引數。

從M0發出的message的型別有以下幾種:

實際使用中只需要關心第二個帶引數的msg即可。

3.Mailbox

這種通訊方式的命名來源於生活中的郵箱,因為它們非常相似。每個處理器可以有一個或者多個郵箱。每個郵箱有以下幾個引數進行定義:

Message type(訊息的型別)
Message id(訊息的ID號)
32- bit parameter(32位的引數)
Callback function(回撥函式)

每個郵箱有幾下幾種狀態:

1.READY(郵箱處於就緒狀態,可以往裡面寫訊息)
2.PROCESS(書寫訊息完成)
3.BUSY(正在處理訊息)
4.ERROR(錯誤)

每個處理器只能從自己的郵箱裡讀資料,向另外一個處理器的郵箱裡寫資料(就像我們只能往別人家的信箱投遞信件,而只能從自己家的信箱取信件一樣)。在寫資料之前首先要詢問郵箱的狀態,如果為ready,即可寫入,否則不能寫。寫完之後就通過中斷通知remote core讀取資料。

以上三種通訊方式,中斷只是用於簡單的通知時間,郵箱和訊息佇列才是雙核之間相互傳遞資料的方法。