久久久国产精品视频袁燕,99re久久精品国产,亚洲欧美日韩国产综合v,天天躁夜夜躁狠狠久久,激情五月婷婷激情五月婷婷

ZYNQ-雙核AMP通信(一)

學(xué)習(xí)內(nèi)容

本文首先介紹了雙核AMP通信的相關(guān)內(nèi)容,接著進(jìn)行設(shè)計(jì)AMP雙核通信的工程,完成功能驗(yàn)證。

開發(fā)環(huán)境

vivado 18.3&SDK,PYNQ-Z2開發(fā)板。

雙核通信

多核處理器從結(jié)構(gòu)上劃分:同構(gòu)多核: 同構(gòu)多核處理器是指系統(tǒng)中的處理器在結(jié)構(gòu)上是相同的,在軟硬件設(shè)計(jì)上較為簡(jiǎn)單,通用性高。異構(gòu)多核: 異構(gòu)多核處理器是指系統(tǒng)中的處理器在結(jié)構(gòu)上不同的,在特定場(chǎng)合中可以進(jìn)行加速,提高性能。

Xilinx 的 ZYNQ SOC 融合了這兩種架構(gòu), ZYNQ SOC 芯片包含兩個(gè)獨(dú)立的 Cortex-A9 處理器,這兩個(gè)處理器核在結(jié)構(gòu)上是相同的,同時(shí)又包括了可編程的邏輯單元( PL),使得 ZYNQ 整體系統(tǒng)成為了一個(gè)異構(gòu)多核系統(tǒng),同時(shí)具有較高的通用性和性能。

多核處理器軟件運(yùn)行方式

多核處理器的運(yùn)行模式有 AMP(非對(duì)稱多處理)、 SMP(對(duì)稱多處理)和 BMP(受約束多處理)三種運(yùn)行模式。AMP(非對(duì)稱多處理): 多個(gè)內(nèi)核相對(duì)獨(dú)立的運(yùn)行不同的任務(wù),每個(gè)內(nèi)核相互隔離,可以運(yùn)行不同的操作系統(tǒng)。SMP(對(duì)稱多處理): 多個(gè)處理器運(yùn)行一個(gè)操作系統(tǒng),這個(gè)操作系統(tǒng)管理多個(gè)內(nèi)核。BMP(受約束多處理): BMP運(yùn)行和SMP運(yùn)行模式類似,開發(fā)者可以指定將某個(gè)任務(wù)僅在某個(gè)指定內(nèi)核上執(zhí)行。下圖為SMP和AMP的示意圖:

AMP非對(duì)稱多處理運(yùn)行

詳細(xì)介紹

由于AMP多用于裸機(jī)開發(fā),在兩個(gè)CPU上可以運(yùn)行不同的應(yīng)用程序,所以本次工程主要使用該方式進(jìn)行雙核通信。對(duì)于AMP的相關(guān)設(shè)計(jì)這里可以參考XAPP1079的文檔進(jìn)行設(shè)計(jì)驗(yàn)證。

ZYNQ-7000 AP SoC 提供兩個(gè)共享通用內(nèi)存和外設(shè)的 Cortex-A9 處理器。非對(duì)稱多處理 (AMP) 是一種機(jī)制,允許兩個(gè)處理器運(yùn)行自己的操作系統(tǒng)或裸機(jī)應(yīng)用程序,并可以通過共享資源松散耦合這些應(yīng)用程序。

在AMP模式中,每個(gè)CPU可以訪問自己獨(dú)立的程序任務(wù),但是需要注意的是要防止CPU在共享資源上發(fā)生沖突,否則會(huì)發(fā)生錯(cuò)誤。

資源分布

對(duì)于該架構(gòu),CPU會(huì)有一些私有資源和共享資源,具體如下:私有資源:

  1. L1 cache
  2. Private peripheral interrupts (PPI)(私有外設(shè)中斷)
  3. Memory management unit (MMU)(內(nèi)存管理單元)
  4. Private timers

共享資源:

  1. Interrupt control distributor (ICD)(中斷控制分配器)
  2. DDR memory(DDR內(nèi)存)
  3. On-chip memory (OCM)(片上資源)
  4. Global timer(全局時(shí)鐘)
  5. Snoop control unit (SCU) and L2 cache
  6. UART0(串口)

兩個(gè)處理器都使用 OCM 來相互通信。與 DDR 內(nèi)存相比,OCM 提供了非常高的性能和來自兩個(gè)處理器的低延遲訪問。通過禁用兩個(gè)處理器對(duì) OCM 的緩存訪問,進(jìn)一步確保了確定性訪問。此設(shè)計(jì)為防止共享資源出現(xiàn)問題而采取的措施包括:

  • DDR 內(nèi)存:CPU0 使用 0x00100000 到 0x001FFFFF 的內(nèi)存。CPU1 使用從 0x00200000 到 0x002FFFFF 的內(nèi)存用于其裸機(jī)應(yīng)用程序。
  • L2 緩存:CPU1 不使用L2 緩存。L2 緩存是共享資源,CPU0 擁有此資源。如果 CPU1 使用 L2 緩存,則需要從 CPU0 請(qǐng)求 L2 緩存刷新和失效,而 CPU0 將執(zhí)行該操作。包含使 CPU1 能夠請(qǐng)求 L2 緩存交互的通信通道超出了本示例設(shè)計(jì)的范圍。
  • ICD:來自PL 內(nèi)核的中斷被路由到CPU1 的PPI 控制器。通過使用 PPI,CPU1 可以自由地處理中斷,而無需訪問 ICD。
  • 定時(shí)器:CPU1 使用專用定時(shí)器。
  • OCM:每個(gè)CPU 都非常小心地處理對(duì)OCM 的訪問以防止?fàn)幱?。單個(gè) OCM 地址位置用作標(biāo)志以在兩個(gè)處理器之間進(jìn)行通信。CPU0 在啟動(dòng) CPU1 之前將標(biāo)志初始化為 0。當(dāng)標(biāo)志為零時(shí),CPU0 擁有 UART。當(dāng)標(biāo)志不為零時(shí),CPU1 擁有 UART。只有 CPU0 設(shè)置標(biāo)志,只有 CPU1 清除它。

參考設(shè)計(jì)

參考設(shè)計(jì)為賽靈思的官方文檔xapp1079,這個(gè)文檔設(shè)計(jì)的AMP架構(gòu)是運(yùn)行在ISE軟件下,但是對(duì)我們進(jìn)行AMP架構(gòu)開發(fā)依舊有參考意義。

參考設(shè)計(jì)硬件部分

PL塊包含一個(gè)自定義的嵌入式核心,連接到ChipScope分析儀VIO核心的同步輸出。VIO核心為用戶提供了與ChipScope分析儀硬件交互的機(jī)制。

在這個(gè)設(shè)計(jì)中,當(dāng)VIO產(chǎn)生一個(gè)脈沖時(shí),自定義核心將一個(gè)中斷轉(zhuǎn)發(fā)給PS Core1_nlRQ引腳。核心還連接到PS主通用端口(M AXI_GP0),通過一個(gè)允許CPU0和CPU1訪問核心內(nèi)的控制寄存器的AXI互連。在中斷服務(wù)程序期間,CPU1訪問控制寄存器以清除中斷請(qǐng)求(IRQ)。CPU0可以選擇使用控制寄存器來創(chuàng)建一個(gè)指向CPU1的中斷。Core1_nlRQ引腳直接連接到CPU1 PPI塊,因此不需要修改共享ICD的配置。還包括一個(gè)ChipScope分析儀axis監(jiān)視器核心,允許用戶測(cè)量正在服務(wù)的IRQ的延遲。

參考設(shè)計(jì)軟件設(shè)計(jì)

該軟件可以分為三個(gè)部分:

  1. 第一階段引導(dǎo)加載程序(FSBL)
  2. 用于CPU0的裸機(jī)應(yīng)用程序
  3. 用于CPU1的裸機(jī)應(yīng)用程序

FSBL總是在CPU0上運(yùn)行,是PS上電復(fù)位后第一個(gè)運(yùn)行的軟件應(yīng)用程序。FSBL負(fù)責(zé)編程PL,并將應(yīng)用程序可執(zhí)行文件和可鏈接格式(ELF)文件復(fù)制到DDR內(nèi)存。在將應(yīng)用程序加載到DDR內(nèi)存后,F(xiàn)SBL然后開始執(zhí)行加載的第一個(gè)應(yīng)用程序。

參考設(shè)計(jì)讓CPU0和CPU1運(yùn)行它們自己的裸機(jī)應(yīng)用程序代碼。CPU0負(fù)責(zé)初始化共享資源并且啟動(dòng)CPU1。CPU0的應(yīng)用程序位于從地址0x00100000開始的內(nèi)存中。鏈接器腳本用于設(shè)置起始地址。CPU0的設(shè)計(jì)步驟:

  1. 配置MMU對(duì)0xFFFF0000 ~ oxfffffe地址范圍內(nèi)的OCM訪問關(guān)閉緩存功能。OCM的地址映射是不變的,所以O(shè)CM存在于地址0x00000000到0x0002FFFF和地址0xFFFF0000到0XFFFFFFFF。示例設(shè)計(jì)只使用了高64kb的OCM,因此在地址0xFFFFo000到oxfffffe上禁用緩存。
  2. 初始化ICD;
  3. CPU1開始啟動(dòng);
  4. 打印到UART;
  5. 在OCM中設(shè)置一個(gè)用作信號(hào)量標(biāo)志的內(nèi)存位置;
  6. 等待OCM中用作信號(hào)量標(biāo)志的內(nèi)存位置被清除。CPUO應(yīng)用程序無限期地重復(fù)步驟3到步驟6。

PS啟動(dòng)后,內(nèi)部 boot ROM完成執(zhí)行,CPU1被重定向到0xFFFFFE00的OCM中的一小段代碼。這段代碼是一個(gè)連續(xù)循環(huán),它等待一個(gè)事件,檢查地址位置0xFFFFFFF0的非零值,然后繼續(xù)循環(huán)。如果0xFFFFFFF0包含一個(gè)非零值,CPU1將跳轉(zhuǎn)到獲取的地址。

CPU0通過將Ox00200000的值寫入地址0xFFFFFFF0,然后運(yùn)行Set Event (SEV)命令來啟動(dòng)CPU1(兩者都運(yùn)行裸機(jī)程序)。SEV喚醒CPU1,從地址0xFFFFFFF0讀取值0x00200000,然后跳轉(zhuǎn)到地址0x00200000。FSBL負(fù)責(zé)將CPU1 ELF放置在0x00200000。

CPU1應(yīng)用程序位于從地址Ox00200000開始的內(nèi)存中。鏈接器腳本用于設(shè)置起始地址。CPU1應(yīng)用程序執(zhí)行以下操作:

  1. 配置MMU對(duì)地址范圍為0xFFFF0000 --0XFFFFFFFF的OCM訪問關(guān)閉緩存功能。OCM的地址映射是不變的,因此OCM存在于地址0x00000000到0x0002FEEF和地址0xFFEF0000到xFFFFFFFE。這個(gè)應(yīng)用程序筆記只使用了OCM的高64kb,所以緩存在地址0xFFFF0000到0XFFFFFFFF上被禁用。
  2. 初始化PPl中斷控制器和中斷子系統(tǒng)。
  3. 等待OCM中用于設(shè)置信號(hào)量標(biāo)志的內(nèi)存位置。
  4. 打印到UART。打印的字符串的選擇取決于中斷服務(wù)例程是否增加了一個(gè)全局變量。如果全局變量irq_count不為零,CPU1將該值設(shè)置為零
  5. 清除OCM中用作信號(hào)量標(biāo)志的內(nèi)存位置。CPU1應(yīng)用程序無限期地重復(fù)步驟3到步驟5。

一些細(xì)節(jié)

啟動(dòng)CPU1

CPU 0負(fù)責(zé)在CPU 1上啟動(dòng)代碼執(zhí)行。BootROM將CPU 1設(shè)置為Wait for Event模式。什么都沒有啟用,只有少數(shù)通用寄存器被修改,以將其置于等待WFE指令的狀態(tài)。

CPU0在CPU1上啟動(dòng)應(yīng)用程序需要少量的協(xié)議。CPU 1收到系統(tǒng)事件后,立即讀取地址0xFFFFFFF0的內(nèi)容并跳轉(zhuǎn)到該地址。如果SEV在更新目的地址位置(0xFFEEFFE0)之前發(fā)出,CPU1繼續(xù)處于WFE狀態(tài),因?yàn)?xFFFFFFF0將WFE指令的地址作為安全網(wǎng)。如果編寫0xFFFFFFF0地址的軟件無效或指向未初始化的內(nèi)存,則結(jié)果是不可預(yù)測(cè)的。

CPU 1上的初始跳轉(zhuǎn)只支持Arm-32 ISA代碼。在跳轉(zhuǎn)的目的地不支持Thumb和Thumb-ll代碼。這意味著目的地址必須是32位對(duì)齊的,并且必須是有效的Arm-32指令。如果不滿足這些條件,結(jié)果是不可預(yù)測(cè)的。CPU0在CPU1上啟動(dòng)應(yīng)用的步驟如下:

  1. 將cpu1的應(yīng)用程序地址寫入0xFFFFFFF0。
  2. 執(zhí)行SEV指令,喚醒CPU1并跳轉(zhuǎn)到應(yīng)用程序。

地址范圍0xFFFFEE00到0xFFFFFFF0是保留的,在第1階段或以上的應(yīng)用程序完全可用之前不能使用。在第二個(gè)CPU成功啟動(dòng)之前對(duì)這些區(qū)域的任何訪問都會(huì)導(dǎo)致不可預(yù)測(cè)的結(jié)果。

軟件中斷

前面提到兩個(gè)處理器都使用 OCM 來相互通信。而OCM屬于兩個(gè)CPU共用的資源,如果同時(shí)調(diào)用會(huì)出現(xiàn)問題,所以為了防止共享資源出現(xiàn)問題,可以進(jìn)行使用中斷的辦法進(jìn)行控制。也即讓CPU0在完成對(duì)OCM的相關(guān)操作并完成釋放OCM后,產(chǎn)生軟件中斷,CPU1接收到軟件中斷即可知道CPU0完成對(duì)OCM的操作,即可進(jìn)行CPU1的對(duì)OCM的相關(guān)操作。

每個(gè)CPU都有一組私有外設(shè)中斷(PPls),它們使用存儲(chǔ)的reqisters進(jìn)行私有訪問。PPls包括全局定時(shí)器、私有看門狗定時(shí)器、私有定時(shí)器和來自PL的FIQ/IRQ。軟件生成的中斷(SGIs)被路由到一個(gè)或兩個(gè)cpu。SGIs是通過寫入通用中斷控制器(GIC)中的寄存器而生成的。共享外圍中斷(SPls)是由PS和PL中的各種I/O和內(nèi)存控制器產(chǎn)生的。它們被路由到其中一個(gè)或兩個(gè)cpu。來自PS外圍設(shè)備的SPI中斷也被路由到PL。

通過一個(gè)SGI (software generated interrupt,軟件生成中斷),每個(gè)CPU可以中斷自己,也可以中斷另一個(gè)CPU,也可以中斷兩個(gè)CPU。軟件生成中斷共有16個(gè),如表所示。

通過將SG中斷號(hào)寫入ICDSGIR寄存器并指定目標(biāo)CPU,生成一個(gè)SGl。這個(gè)寫操作通過CPU自己的私有總線進(jìn)行。每個(gè)CPU都有自己的一組SGl寄存器,用于生成16個(gè)軟件生成的中斷中的一個(gè)或多個(gè)。通過讀取ICCIAR(中斷確認(rèn))寄存器或在ICDICPR(中斷清除等待)寄存器的相應(yīng)位寫一個(gè)1來清除中斷。所有的SGis都是邊緣觸發(fā)。sgl的靈敏度類型是固定的,不能改變;ICDICFRO寄存器是只讀的,因?yàn)樗付怂?6個(gè)sgl的敏感類型。

OCM

OCM模塊包含256kb的RAM和128kb的ROM (BootROM)。它支持兩個(gè)64位的axis從接口端口,一個(gè)專用于通過APU snoop控制單元(SCU)的CPU/ACP訪問,另一個(gè)由處理系統(tǒng)(PS)和可編程邏輯(PL)中的所有其他總線主共享。BootROM內(nèi)存只被引導(dǎo)進(jìn)程使用,用戶不可見。

OCM分布

OCM分布在兩個(gè)區(qū)域,一個(gè)是地址的開始端,有連續(xù)的3個(gè)64k字節(jié)的存儲(chǔ)空間,另外一個(gè)在最后,用戶可以根據(jù)自己的傳輸交互的數(shù)據(jù)量大小進(jìn)行選擇使用哪一塊存儲(chǔ)空間。

程序設(shè)計(jì)

見下篇 ZYNQ-雙核AMP通信(二)。

聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場(chǎng)。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請(qǐng)聯(lián)系:editor@netbroad.com
覺得內(nèi)容不錯(cuò)的朋友,別忘了一鍵三連哦!
贊 2
收藏 3
關(guān)注 15
成為作者 賺取收益
全部留言
0/200
成為第一個(gè)和作者交流的人吧