現(xiàn)在業(yè)界的許多解決方案都包含多個(gè)處理器,或者是硬核處理器,如Arm A9、A53或R5,軟核如MicroBlaze、Arm Cortex-M1/M3,或者是兩者的組合。
Arm Cortex-M1被稱(chēng)為軟核處理器,這主要是因?yàn)樗谠O(shè)計(jì)和應(yīng)用上具有更大的靈活性。首先,軟核處理器是可以根據(jù)需要進(jìn)行定制的。在設(shè)計(jì)上,Arm Cortex-M1可以根據(jù)特定應(yīng)用的需求進(jìn)行定制。例如,在硬件資源有限的情況下,如FPGA設(shè)備,Cortex-M1能通過(guò)優(yōu)化設(shè)計(jì)來(lái)滿足面積預(yù)算要求。它采用了三階段32位RISC處理器架構(gòu),并且使用了高效的指令集,例如Thumb-2指令集,這樣就可以在有限的硬件資源下實(shí)現(xiàn)更高的性能。其次,軟核處理器在應(yīng)用上也更加靈活。它們可以集成到各種不同的硬件平臺(tái)中,比如FPGA、ASIC等。同時(shí),軟核處理器可以使用不同的編程語(yǔ)言進(jìn)行編程和控制,這樣就可以適應(yīng)更多的應(yīng)用場(chǎng)景和需求。由于其靈活性和適應(yīng)性,軟核處理器在各種應(yīng)用領(lǐng)域中更加受歡迎。
當(dāng)我們實(shí)施多處理器解決方案時(shí),通常我們會(huì)在可用的內(nèi)核之間劃分任務(wù),利用每個(gè)內(nèi)核來(lái)最大限度地提高其性能屬性。例如,在PL中使用MicroBlaze或Cortex內(nèi)核來(lái)執(zhí)行專(zhuān)用的實(shí)時(shí)卸載任務(wù),同時(shí)使用硬核應(yīng)用程序處理器來(lái)執(zhí)行更高級(jí)別的功能。
如果你做過(guò)復(fù)雜Soc相關(guān)的項(xiàng)目,應(yīng)該對(duì)于這個(gè)肯定有所了解,用一個(gè)客制化的小核去協(xié)助主處理器做很多的事情,或者是多核SMP架構(gòu)中,都會(huì)常看到這種核間通信的機(jī)制。
當(dāng)然,要正確實(shí)施多處理器解決方案應(yīng)用程序,解決方案中的所有處理器都需要能夠安全可靠地通信和共享可用的系統(tǒng)資源。
這就是處理器間通信(IPC)的作用所在;如果正確實(shí)施,它可以實(shí)現(xiàn)處理器之間的安全可靠通信,同時(shí)也允許多個(gè)處理器共享公共資源,例如UART,而不會(huì)導(dǎo)致?lián)p壞的沖突。
mailbox和MUTEX在我們的IPC解決方案中扮演不同的角色:
這個(gè)字母一大寫(xiě)一小寫(xiě)突然看的我好難受但是又不想改哈哈哈
mailbox-允許使用基于FIFO的消息傳遞方法在多個(gè)處理器之間進(jìn)行雙向通信。
MUTEX-實(shí)現(xiàn)互斥鎖,這允許處理器鎖定共享資源,防止同時(shí)進(jìn)行多次訪問(wèn)。
無(wú)論我們使用異構(gòu)SoC還是FPGA,mailbox和MUTEX都在可編程邏輯(PL)中實(shí)現(xiàn)。
異構(gòu)SoC(System on Chip)處理器是一種集成多個(gè)不同架構(gòu)處理單元核心的SoC處理器。例如,TI的OMAP-L138(DSP C674x + ARM9)和AM5708(DSP C66x + ARM Cortex-A15)SoC處理器,以及Xilinx的ZYNQ(ARM Cortex-A9 + Artix-7/Kintex-7可編程邏輯架構(gòu))SoC處理器等。異構(gòu)多核SoC處理器結(jié)合了不同類(lèi)型處理器的優(yōu)點(diǎn)。例如,ARM處理器廉價(jià)且耗能低,擅長(zhǎng)進(jìn)行控制操作和多媒體顯示;DSP天生為數(shù)字信號(hào)處理而生,擅長(zhǎng)進(jìn)行專(zhuān)用算法運(yùn)算;FPGA則擅長(zhǎng)高速、多通道數(shù)據(jù)采集和信號(hào)傳輸。同時(shí),核間通過(guò)各種通信方式,快速進(jìn)行數(shù)據(jù)的傳輸和共享,使得異構(gòu)多核SoC處理器能實(shí)現(xiàn)1+1>2的效果。
我們可以直接從Xilinx IP庫(kù)在設(shè)計(jì)中實(shí)現(xiàn)mailbox和MUTEX。由于兩者都用于兩個(gè)處理器之間的通信,因此它們有兩個(gè)從AXI輸入。
使用mailbox或MUTEX,為每個(gè)處理器提供一個(gè)從AXI接口。
在本示例中,我們將使用Zynq與PL中的MicroBlaze通信和共享資源。
MicroBlaze將連接到驅(qū)動(dòng)LED的GPIO。
要?jiǎng)?chuàng)建框圖,我們首先需要添加Zynq處理系統(tǒng)IP,并運(yùn)行塊自動(dòng)化以配置選定主板的Zynq。
這是添加的一個(gè)處理系統(tǒng)。對(duì)于第二個(gè),使用IP目錄添加MicroBlaze。一旦MicroBlaze IP出現(xiàn)在框圖中,雙擊重新自定義IP,選擇微控制器預(yù)設(shè),保持所有其他選項(xiàng)不變。
配置MicroBlaze IP后,下一步是運(yùn)行其塊自動(dòng)化以創(chuàng)建MicroBlaze解決方案。這將添加到塊RAM中,MicroBlaze將從中運(yùn)行和調(diào)試設(shè)施。
現(xiàn)在有了我們的兩個(gè)處理系統(tǒng)解決方案,我們已經(jīng)準(zhǔn)備好添加到mailbox和MUTEX中-這兩個(gè)解決方案都可以從Xilinx IP目錄中添加。
完成后,我們可以使用連接自動(dòng)化向?qū)⑺鼈冞B接到兩個(gè)處理器系統(tǒng)AXI連接。
mailbox使用FIFO傳輸消息,其深度可以通過(guò)重復(fù)使用mailbox IP來(lái)配置。為確保在接收處理器上有效處理消息,mailbox能夠在消息排隊(duì)時(shí)向相關(guān)處理器生成中斷。
與mailbox一樣,MUTEX非常相似,只是它不使用FIFO,而是為每個(gè)MUTEX使用寄存器來(lái)指示鎖定狀態(tài)。我們可以在多達(dá)8個(gè)處理器之間共享多達(dá)32個(gè)MUTEX。
為了防止處理器無(wú)意中或惡意地解鎖互斥體,使用CPU ID。
完成的框圖應(yīng)與下面的框圖相似。
我們現(xiàn)在可以構(gòu)建硬件并將設(shè)計(jì)導(dǎo)出到SDK,準(zhǔn)備編寫(xiě)軟件應(yīng)用程序。
MailBox
我們檢查了Vivado中實(shí)現(xiàn)處理器間通信(IPC)郵箱和互斥體所需的硬件構(gòu)建。
現(xiàn)在,我們將研究如何使用mailbox將數(shù)據(jù)從一個(gè)處理器傳輸?shù)搅硪粋€(gè)處理器。
請(qǐng)記住,在這個(gè)系統(tǒng)中,我們使用的是Zynq處理系統(tǒng)(PS) A9內(nèi)核之一和可編程邏輯(PL)中的MicroBlaze。
兩個(gè)處理器都使用AXI連接到mailbox,因此我們可以使用主板支持包(BSP)中提供的API很容易就實(shí)現(xiàn)了發(fā)送和接收消息。
將設(shè)計(jì)從Vivado導(dǎo)出到Xilinx SDK將將中的硬件規(guī)范導(dǎo)入到SDK。在硬件項(xiàng)目中檢查HDF文件將顯示MicroBlaze和Cortex-A9內(nèi)存映射。
導(dǎo)入硬件定義后,下一步是創(chuàng)建兩個(gè)應(yīng)用程序-一個(gè)用于Arm Cortex-A9,另一個(gè)用于MicroBlaze。當(dāng)我們創(chuàng)建這些應(yīng)用程序時(shí),請(qǐng)確保選擇適當(dāng)?shù)奶幚砥?,并啟用?yīng)用程序也創(chuàng)建BSP。
完成此操作后,我們應(yīng)在SDK項(xiàng)目資源管理器中包含以下內(nèi)容:
描述Vivado設(shè)計(jì)的硬件平臺(tái)-這應(yīng)用作所有應(yīng)用程序和BSP的參考硬件平臺(tái)。
兩個(gè)主板支持包-PS Arm A9和MicroBlaze應(yīng)用程序各一個(gè)。
兩個(gè)應(yīng)用程序-PS Arm A9和MicroBlaze各一個(gè)。
在此應(yīng)用程序中,MicroBlaze將報(bào)告何時(shí)啟動(dòng)并運(yùn)行,以及LED的打開(kāi)或關(guān)閉狀態(tài)。
為此,我們將使用BSP提供的mailbox API,兩者都提供相同的API供使用。
這些文件包含在xmbox.h文件中,使我們能夠初始化和配置mailbox 以使用。
要從mailbox 讀取和寫(xiě)入,有幾個(gè)功能:
XMbox_Read ( XMbox * InstancePtr, u32 * BufferPtr, u32 RequestedBytes, u32 * BytesRecvdPtr) XMbox_ReadBlocking ( XMbox * InstancePtr, u32 * BufferPtr, u32 RequestedBytes ) XMbox_Write(XMbox* InstancePtr,u32 * BufferPtr,u32 RequestedBytes, u32 * BytesSentPtr ) XMbox_WriteBlocking ( XMbox * InstancePtr, u32 * BufferPtr, u32 RequestedBytes )
在上述函數(shù)中,實(shí)例指針引用mailbox 聲明,緩沖區(qū)指針指向我們存儲(chǔ)TX或RX數(shù)據(jù)的位置。雖然請(qǐng)求的字節(jié)是傳輸?shù)拇笮?,但讀和寫(xiě)函數(shù)也報(bào)告實(shí)際發(fā)送或接收的字節(jié)數(shù),因?yàn)檫@可能與請(qǐng)求的字節(jié)數(shù)不同。
這里特別指出,對(duì)于所有函數(shù),發(fā)送或接收的字節(jié)數(shù)應(yīng)該是4的倍數(shù);如果不是,則需要一些填充。如果沒(méi)有請(qǐng)求4字節(jié)的倍數(shù),將生成斷言。
當(dāng)然,阻塞讀寫(xiě)不會(huì)報(bào)告實(shí)際發(fā)送或接收的字節(jié)數(shù),因?yàn)楹瘮?shù)實(shí)際上會(huì)阻塞,直到發(fā)送或接收請(qǐng)求的字節(jié)數(shù)。
除了發(fā)送和接收功能,還有許多內(nèi)部管理功能:
中斷使能、狀態(tài)和禁用
發(fā)送和接收中斷FIFO閾值定義
FFIO管理和控制,包括檢查空和滿、刷新和復(fù)位 通過(guò)使用這些功能,我們能夠?yàn)锳rm A9內(nèi)核和MicroBlaze創(chuàng)建簡(jiǎn)單的應(yīng)用程序。
A9程序很簡(jiǎn)單。一旦mailbox 初始化,它就會(huì)永遠(yuǎn)循環(huán)等待來(lái)自MicroBlaze的消息,然后再通過(guò)終端打印出來(lái)。
MicroBlaze應(yīng)用程序要復(fù)雜一些。它在啟動(dòng)時(shí)向A9內(nèi)核發(fā)送消息,然后每次切換LED時(shí),它還發(fā)送有關(guān)LED狀態(tài)的消息。
要在Zynq上運(yùn)行此操作,我們需要?jiǎng)?chuàng)建一個(gè)新的調(diào)試配置,該配置下載兩個(gè)處理器。為了確保在多處理器環(huán)境中取得成功,我們需要考慮兩個(gè)處理器的啟動(dòng)。在此調(diào)試配置中,選擇:
調(diào)試配置運(yùn)行時(shí),將配置設(shè)備,并下載兩個(gè)處理器的應(yīng)用程序。然后,兩個(gè)處理器將在main()的入口點(diǎn)暫停。
對(duì)于此示例應(yīng)用程序,請(qǐng)首先啟動(dòng)A9處理器,然后啟動(dòng)MicroBlaze處理器。
當(dāng)使用上面的示例代碼執(zhí)行此操作時(shí),就可以在終端窗口中看到了以下內(nèi)容:
兩個(gè)處理器都在通信!
接下來(lái),我們關(guān)注點(diǎn)放到互斥體。
MUTEX
當(dāng)我們的設(shè)備中有多個(gè)處理器時(shí),多個(gè)處理器可能希望同時(shí)共享公共資源(例如內(nèi)存或UART)。如果對(duì)這些資源的訪問(wèn)不受控制,它可能會(huì)迅速而容易地導(dǎo)致腐敗。比如說(shuō)串口打印,混淆在一起。
互斥似乎是最簡(jiǎn)單的問(wèn)題之一,當(dāng)然可以使用一個(gè)標(biāo)志,雙方都可以測(cè)試,如果是自由設(shè)置,則聲稱(chēng)對(duì)資源的訪問(wèn)。
然而,出現(xiàn)了一個(gè)問(wèn)題,即在一個(gè)處理器測(cè)試和設(shè)置標(biāo)志之間的時(shí)間內(nèi),對(duì)方處理器也可以將標(biāo)志視為空閑,并開(kāi)始其鎖定過(guò)程。
這通常被稱(chēng)為競(jìng)爭(zhēng)條件,圍繞相互排斥的其他潛在陷阱包括僵局和饑餓。處理器無(wú)法訪問(wèn)資源(饑餓)或系統(tǒng)鎖定,因?yàn)槊總€(gè)處理器都在等待不同的鎖定進(jìn)程進(jìn)行(死鎖)。
一般提到互斥,就會(huì)涉及到死鎖問(wèn)題。
有許多解決方案可以解決這些問(wèn)題,包括使用多個(gè)標(biāo)志。雖然,當(dāng)考慮到除了最簡(jiǎn)單的情況之外的任何事情時(shí),它們開(kāi)始變得非常復(fù)雜,簡(jiǎn)言之,它們并不容易擴(kuò)展。
解決競(jìng)爭(zhēng)條件的方法是確保測(cè)試和設(shè)置操作合并到一個(gè)操作中,也就是說(shuō),如果我們測(cè)試互斥標(biāo)記,并且它是自由的,那么它就會(huì)被設(shè)置。
這正是Xilinx互斥體的工作方式,當(dāng)我們寫(xiě)入互斥體時(shí),如果它是空閑的,處理器將被分配資源。
在我們的硬件設(shè)計(jì)中設(shè)計(jì)互斥體非常簡(jiǎn)單,每個(gè)處理器都有自己的AXI接口。由于互斥體能夠支持1到8個(gè)處理器,因此在使用操作系統(tǒng)和在同一處理器上運(yùn)行的任務(wù)之間共享資源時(shí),我們可以只使用一個(gè)接口。
在一個(gè)互斥體實(shí)例化中,我們最多能夠?qū)崿F(xiàn)32個(gè)互斥體。不過(guò),對(duì)于這個(gè)例子,我們只有一個(gè)。當(dāng)我們實(shí)施互斥體時(shí),如果我們?cè)敢?,我們還可以在AXI級(jí)別啟用硬件保護(hù)。
如果我們選擇啟用此功能,則可選AXI HWID字段用于鎖定和解鎖互斥體,防止CPU偽造CPU ID并錯(cuò)誤地解鎖。
每個(gè)互斥體還有一個(gè)可選的32位寄存器,如有必要,可用于在處理器之間共享配置數(shù)據(jù)。
當(dāng)談到在我們的軟件中使用互斥體時(shí),我們可以使用主板支持包(BSP)為兩個(gè)處理器提供的Xmutex API (xmutex.h)。在此API中,我們將找到函數(shù)類(lèi):
生命周期管理-初始化和狀態(tài)報(bào)告
用戶寄存器-設(shè)置和取消設(shè)置用戶寄存器
互斥鎖操作-鎖定和解鎖互斥鎖的功能
與我們上面看到的mailbox示例類(lèi)似,互斥操作提供阻止和非阻止調(diào)用。阻塞調(diào)用由函數(shù)XMutex_Lock()提供,而無(wú)阻塞函數(shù)調(diào)用是XMutex_Trylock()。
為了演示互斥體的應(yīng)用,我們將更新我們的SW應(yīng)用程序,以便MircoBlaze應(yīng)用程序在設(shè)置LED時(shí)鎖定互斥體,并在清除LED時(shí)解鎖互斥體。
然后,Zynq應(yīng)用程序?qū)y(cè)試互斥體,并報(bào)告它是否與LED狀態(tài)一起設(shè)置。一個(gè)簡(jiǎn)單但有效的示例,說(shuō)明互斥函數(shù)是如何工作的。
兩個(gè)處理器的代碼如下。
當(dāng)使用上面的代碼運(yùn)行應(yīng)用程序時(shí),在終端窗口中觀察到以下情況。這表示在訪問(wèn)LED資源時(shí),MicroBlaze正在按預(yù)期鎖定和解鎖互斥體。
-
處理器
+關(guān)注
關(guān)注
68文章
19896瀏覽量
235312 -
FPGA
+關(guān)注
關(guān)注
1645文章
22050瀏覽量
618625 -
ARM
+關(guān)注
關(guān)注
134文章
9353瀏覽量
377656 -
asic
+關(guān)注
關(guān)注
34文章
1247瀏覽量
122419 -
硬核處理器
+關(guān)注
關(guān)注
0文章
3瀏覽量
6860
原文標(biāo)題:MUTEX
文章出處:【微信號(hào):談思實(shí)驗(yàn)室,微信公眾號(hào):談思實(shí)驗(yàn)室】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
基于Sitara處理器工業(yè)以太網(wǎng)應(yīng)用的快速啟動(dòng)系統(tǒng)解決方案
核間通信(IPC)解決方案
優(yōu)化雙帶雙模手機(jī)的處理器間通信

深度探究處理器間通信和中斷控制方面基于SOPC的系統(tǒng)設(shè)計(jì)

基于雙MicroBlaze軟核處理器的SOPC系統(tǒng)

一種基于Mailbox核間機(jī)制的多核處理系統(tǒng)
如何在Zynq Cortex A9處理器之間執(zhí)行處理器間通信
Jacinto7 TDA4VM處理器的核間通信解決方案

Jacinto 7核間通信解決方案

核間通信可能的實(shí)現(xiàn)機(jī)制

評(píng)論