ZYNQ開發雙核運行原理及過程

2020-12-06 電子發燒友
 

圖3 程序測試

利用軟體中斷做通訊的例子

該例子中,cpu0和cpu1都註冊兩個軟體中斷,將1號軟體中斷註冊給cpu1,表示cpu0發送中斷給cpu1,將2號軟體中斷註冊給cpu0,表示cpu1發送中斷給cpu0;然後在程序運行時,cpu0觸發1號軟體中斷,此時cpu1正在運行主程序被該中斷中斷,進入中斷服務函數,其處理完中斷後觸發2號軟體中斷,此時該中斷會中斷cpu0,進入中斷服務函數,cpu0處理完中斷後回到主函數,再觸發1號軟體中斷,往復運行。

Cpu0代碼:

/*

* app_cpu0.c

*

* Created on: 2019年3月27日

* Author: dz

*/

#include "xil_cache.h"

#include "xparameters.h"

#include "xil_mmu.h"

#include "xil_misc_psreset_api.h"

#include "xil_exception.h"

#include "xscugic.h"

#include "xuartps.h"

#include "stdio.h"

#include "sleep.h"

volatile u8 software_intr_received = 0;

#define CORE0_TO_CORE1_INTR_ID 0x01

#define CORE1_TO_CORE0_INTR_ID 0x02

void sys_intr_init(void);

void Setup_Intr_Exception(XScuGic * IntcInstancePtr);

void Scu_Intr_Init(XScuGic* IntancePtr,int Scu_Int_ID);

void Init_Software_Intr(XScuGic *GicInstancePtr, Xil_InterruptHandler IntrHanedler, u16 SoftwareIntrId, u8 CpuId);

void Gen_Software_Intr(XScuGic *GicInstancePtr, u16 SoftwareIntrId, u32 CpuId);

void Cpu0_Intr_Hanedler(void *Callback);

void Cpu1_Intr_Hanedler(void *Callback);

XScuGic ScuGic;

void delay(unsigned int count)

{

int i = 0;

for(i = 0;i

}

int main(void)

{

sys_intr_init();

xil_printf("cpu0 start!/r/n");

while(1)

{

if(XPAR_CPU_ID == 0)

Gen_Software_Intr(&ScuGic, CORE0_TO_CORE1_INTR_ID, XSCUGIC_SPI_CPU1_MASK);

/*Gen_Software_Intr(&ScuGic, CORE0_TO_CORE1_INTR_ID, XSCUGIC_SPI_CPU0_MASK);*/

else

Gen_Software_Intr(&ScuGic, CORE1_TO_CORE0_INTR_ID, XSCUGIC_SPI_CPU0_MASK);

delay(200000000);

if(1 == software_intr_received)

{

xil_printf("cpu0_main/r/n");

software_intr_received = 0;

}

}

return 0;

}

void sys_intr_init(void)

{ Scu_Intr_Init(&ScuGic,XPAR_SCUGIC_SINGLE_DEVICE_ID);

// if(XPAR_CPU_ID == 0)

Init_Software_Intr(&ScuGic, Cpu0_Intr_Hanedler, CORE0_TO_CORE1_INTR_ID, 0);

// else

Init_Software_Intr(&ScuGic, Cpu1_Intr_Hanedler, CORE1_TO_CORE0_INTR_ID, 1);

Setup_Intr_Exception(&ScuGic);

}

void Setup_Intr_Exception(XScuGic * IntcInstancePtr)

{

//connect hardware interrupt

Xil_ExceptionInit();

Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,(void *)IntcInstancePtr);

//enable hardware interrupt

Xil_ExceptionEnable();

}

void Scu_Intr_Init(XScuGic* IntancePtr,int Scu_Int_ID)

{

XScuGic_Config *ScuConfigPtr;

//find device

ScuConfigPtr = XScuGic_LookupConfig(Scu_Int_ID);

//config scuint

XScuGic_CfgInitialize(IntancePtr, ScuConfigPtr,ScuConfigPtr->CpuBaseAddress);

}

void Cpu0_Intr_Hanedler(void *Callback)

{

xil_printf("receive interrupt from core1!/r/n");

software_intr_received = 1;

}

void Cpu1_Intr_Hanedler(void *Callback)

{

xil_printf("receive interrupt from core0!/r/n");

software_intr_received = 1;

}

void Init_Software_Intr(XScuGic *GicInstancePtr, Xil_InterruptHandler IntrHanedler, u16 SoftwareIntrId, u8 CpuId)

{

int Status;

// XScuGic_SetPriorityTriggerType(GicInstancePtr, SoftwareIntrId, 0xB0, 0x2);

XScuGic_SetPriorityTriggerType(GicInstancePtr, SoftwareIntrId, 0xd0, 0x3);

Status = XScuGic_Connect(GicInstancePtr, SoftwareIntrId,

(Xil_InterruptHandler)IntrHanedler, NULL);

if (Status != XST_SUCCESS) {

xil_printf("core%d: interrupt %d set fail!/r/n", XPAR_CPU_ID, SoftwareIntrId);

return;

}

XScuGic_InterruptMaptoCpu(GicInstancePtr, CpuId, SoftwareIntrId); //map the the Software interrupt to target CPU

XScuGic_Enable(GicInstancePtr, SoftwareIntrId);//enable the interrupt for the Software interrupt at GIC

}

void Gen_Software_Intr(XScuGic *GicInstancePtr, u16 SoftwareIntrId, u32 CpuId)

{

int Status;

Status = XScuGic_SoftwareIntr(GicInstancePtr, SoftwareIntrId, CpuId);

if (Status != XST_SUCCESS) {

xil_printf("core%d: interrupt %d gen fail!/r/n", XPAR_CPU_ID, SoftwareIntrId);

return;

}

}

Cpu1代碼:

/*

* app_cpu0.c

*

* Created on: 2019年3月27日

* Author: dz

*/

#include "xil_cache.h"

#include "xparameters.h"

#include "xil_mmu.h"

#include "xil_misc_psreset_api.h"

#include "xil_exception.h"

#include "xscugic.h"

#include "xuartps.h"

#include "stdio.h"

#include "sleep.h"

volatile u8 software_intr_received = 0;

#define CORE0_TO_CORE1_INTR_ID 0x01

#define CORE1_TO_CORE0_INTR_ID 0x02

void sys_intr_init(void);

void Setup_Intr_Exception(XScuGic * IntcInstancePtr);

void Scu_Intr_Init(XScuGic* IntancePtr,int Scu_Int_ID);

void Init_Software_Intr(XScuGic *GicInstancePtr, Xil_InterruptHandler IntrHanedler, u16 SoftwareIntrId, u8 CpuId);

void Gen_Software_Intr(XScuGic *GicInstancePtr, u16 SoftwareIntrId, u32 CpuId);

void Cpu0_Intr_Hanedler(void *Callback);

void Cpu1_Intr_Hanedler(void *Callback);

XScuGic ScuGic;

void delay(unsigned int count)

{

int i = 0;

for(i = 0;i

;

}

int main(void)

{

sys_intr_init();

// Gen_Software_Intr(&ScuGic, CORE1_TO_CORE0_INTR_ID, XSCUGIC_SPI_CPU1_MASK);

xil_printf("cpu1 start!/r/n");

while(1)

{

if(1 == software_intr_received)

{

software_intr_received = 0;

if(XPAR_CPU_ID == 0)

Gen_Software_Intr(&ScuGic, CORE0_TO_CORE1_INTR_ID, XSCUGIC_SPI_CPU1_MASK);

/* Gen_Software_Intr(&ScuGic, CORE0_TO_CORE1_INTR_ID, XSCUGIC_SPI_CPU0_MASK);*/

else

Gen_Software_Intr(&ScuGic, CORE1_TO_CORE0_INTR_ID, XSCUGIC_SPI_CPU0_MASK);

delay(200000000);

xil_printf("cpu1_main/r/n");

}

}

return 0;

}

void sys_intr_init(void)

{ Scu_Intr_Init(&ScuGic,XPAR_SCUGIC_SINGLE_DEVICE_ID);

// if(XPAR_CPU_ID == 0)

Init_Software_Intr(&ScuGic, Cpu0_Intr_Hanedler, CORE0_TO_CORE1_INTR_ID, 0);

// else

Init_Software_Intr(&ScuGic, Cpu1_Intr_Hanedler, CORE1_TO_CORE0_INTR_ID, 1);

Setup_Intr_Exception(&ScuGic);

}

void Setup_Intr_Exception(XScuGic * IntcInstancePtr)

{

//connect hardware interrupt

Xil_ExceptionInit();

Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,(void *)IntcInstancePtr);

//enable hardware interrupt

Xil_ExceptionEnable();

}

void Scu_Intr_Init(XScuGic* IntancePtr,int Scu_Int_ID)

{

XScuGic_Config *ScuConfigPtr;

//find device

ScuConfigPtr = XScuGic_LookupConfig(Scu_Int_ID);

//config scuint

XScuGic_CfgInitialize(IntancePtr, ScuConfigPtr,ScuConfigPtr->CpuBaseAddress);

}

void Cpu0_Intr_Hanedler(void *Callback)

{

xil_printf("receive interrupt from core1!/r/n");

software_intr_received = 1;

}

void Cpu1_Intr_Hanedler(void *Callback)

{

xil_printf("receive interrupt from core0!/r/n");

software_intr_received = 1;

}

void Init_Software_Intr(XScuGic *GicInstancePtr, Xil_InterruptHandler IntrHanedler, u16 SoftwareIntrId, u8 CpuId)

{

int Status;

XScuGic_SetPriorityTriggerType(GicInstancePtr, SoftwareIntrId, 0xB0, 0x2);

// XScuGic_SetPriorityTriggerType(GicInstancePtr, SoftwareIntrId, 0xd0, 0x3);

Status = XScuGic_Connect(GicInstancePtr, SoftwareIntrId,

(Xil_InterruptHandler)IntrHanedler, NULL);

if (Status != XST_SUCCESS) {

xil_printf("core%d: interrupt %d set fail!/r/n", XPAR_CPU_ID, SoftwareIntrId);

return;

}

XScuGic_InterruptMaptoCpu(GicInstancePtr, CpuId, SoftwareIntrId); //map the the Software interrupt to target CPU

XScuGic_Enable(GicInstancePtr, SoftwareIntrId);//enable the interrupt for the Software interrupt at GIC

}

void Gen_Software_Intr(XScuGic *GicInstancePtr, u16 SoftwareIntrId, u32 CpuId)

{

int Status;

Status = XScuGic_SoftwareIntr(GicInstancePtr, SoftwareIntrId, CpuId);

if (Status != XST_SUCCESS) {

xil_printf("core%d: interrupt %d gen fail!/r/n", XPAR_CPU_ID, SoftwareIntrId);

return;

}

}

將上述程序生成boot.bin文件,然後下載到flash,啟動後通過串口助手可以收到cpu0與cpu1的列印信息,每間隔兩秒列印一次,如圖4所示。

 

相關焦點

  • 詳細解讀Zynq的三種啟動方式(JTAG,SD,QSPI)
    本文介紹zynq上三種方式啟動文件的生成和注意事項,包括只用片上RAM(OCM)和使用DDR3兩種情況。 C/C++ applicaTIon(GDB)下沒有子項,這時雙擊Xilinx C/C++ applicaTIon(GDB)即可新建一個調試;這時右邊窗口會自動填充如上圖,若沒有則手動填入;在右邊ApplicaTIon窗口指定要下載調試的.elf文件;在右邊STDIO Connection可以指定標準輸入輸出串口,即printf列印串口,若這裡選擇開發板上
  • 斯福尼雙核集成採暖系統,拒絕紙上談兵快速致富
    斯福尼雙核集成採暖系統就是很好的選擇,它的優勢之處很明顯,滿足了消費者的需求,憑藉著自身的優勢,獲得了很高的口碑,並且還拒絕紙上談兵,可以讓更多的合作商快速致富。斯福尼雙核集成採暖系統是使用石墨烯發熱線纜,雙核集成系統,還被譽為是黑金,屬於新世紀之中的材料之王。同時石墨烯屬於混合晶體,形成了層次結構,上下兩層都是共同使用相同的自由電子。
  • 初學者必讀:六大平板主流雙核晶片解析
    比如當我們拿著平板電腦玩遊戲,中途需要發一封郵件,於是便通過多任務功能切換到郵箱界面,此時處理器不僅運行著郵箱應用而且還在運行著屏幕上沒顯示的遊戲,以便用戶隨時切換回來。如果處理器承受不了過多的任務,那麼輕則程序自動關閉重則死機。
  • 5吋夠大800W夠清 歐恩V8雙核子彈頭評測
    就配置來看,歐恩V8雙核子彈頭搭載Android4.0作業系統,採用5.0英寸的WVGA(800*480像素)解析度屏幕,該機運行1GHz雙核處理器,運行內存為512MB,機身存儲空間為4GB。支持WCDMA+GSM雙卡雙待,前置30萬像素攝像頭,後置主攝像頭為800萬像素,並配有LED閃光燈。電池容量為2000毫安時。這樣的配置對於普通消費者還是能夠滿足日常使用需求的。
  • 誰是雙核之王?七大平板處理器性能橫測
    x86架構較高的開發門檻,已經沒有第三家廠商敢站出來與Intel和AMD相抗衡。如果不是反壟斷法的制約可能曾經的好基友也早以成為獨守空房的小光棍了。而ARM架構處理器的開發成本較低,ARM公司把它的設計授權給多家像高通、德州儀器這些有實力的可以出產晶片的製造商們,並且通過對不同用戶的需要來設計出有針對性的晶片組。
  • 從ZYNQ晶片架構談談其為何如此誘人|fpga|處理器|控制器|arm_網易...
    它促進了具有總線結構及多控制器或組件的多核處理器設計開發。自成立以來,AMBA已廣為應用,遠遠超出了微控制器設備領域。如今,AMBA已廣泛用於各種ASIC和SoC部件,包括在現代可攜式行動裝置中使用的應用處理器。
  • 7寸雙核平板:不僅僅是小?!_索立信平板電腦_平板電腦新聞-中關村在線
    單手掌控,精彩盡在手心;索立信S18雙核Ⅱ,不僅僅是小!它還標配512MB內存8G存儲容量,運行安卓4.2系統,搭載瑞芯微高性能低功耗RK3026雙核晶片,RK3026採用了雙核Cortex-A9架構,峰值頻率高達1.0GHz,是目前運行最穩定的雙核處理器之一。如此配置,對於高清影音、時下主流的遊戲都可滿足。
  • ZYNQ系列FPGA使用,PS與PL接口設計和硬體設計
    隨著開源的MCU原始碼越來越多,也逐漸的影響著嵌入式系統開發的思路,出現了兩種以前不常見的設計思路。龍芯杯競賽至少反映了這些高校在CPU設計方向的課程設置已經沒有問題,設計CPU需要眾多課程的支撐,《計算機組成原理》、《編譯原理》、《作業系統》及FPGA設計開發等相關課程,相對而言,國內絕大多數高校雖然有相關的課程,可如果找到有能力設計CPU的學生組隊參賽的高校卻不多。
  • 編輯首推:優派VB100a Pro超廣角高清雙核平板
    全球視訊科技領導品牌美國優派(ViewSonic)最新推出的VB100a Pro雙核平板,一上市就以更強悍的雙核處理器,更精湛的顯示效果,更流暢的觸控操作體驗,更快的軟體運行速度,更易用的上網方式等優勢備受用戶青睞,成為市場上最火熱的10.1寸平板,同時也是各大網站編輯首推的平板電腦,被眾多網友稱之為「超寬屏雙核王」。
  • BOOX C67ML雙核閱讀器十月首發 僅649元
    (中關村在線廣州辦事處)onyx旗下的首款採用雙核心處理器的BOOX C67ML智能電子書在出色的電子閱讀功能上,首次與強大的Android智能系統完美結合,憑藉著強勁的ARM雙核架構處理晶片以及大內存、以及數千種Android平臺強大軟體擴展,在市場上掀起一輪新的電子書搶購狂潮。
  • 摘要:在程序開發運行過程中,通常會遇到當前埠「XX」被佔用的...
    在程序開發運行過程中,通常會遇到當前埠「XX」被佔用的情況,怎麼查詢這個埠到底此時被哪裡程序佔用呢?明確那個埠出現了佔用,比如「80」,那麼就要查詢80埠被哪些程序佔用著,點擊「開始」-->「運行」或者windows+R快捷鍵,打開運行窗口,如下圖在運行窗口中輸入cmd命令,然後點擊確定按鈕,出現如下cmd命令符窗口,如下圖在命令符窗口中輸入下列查找埠命令:netstat -ano|findstr 「80」然後敲回車,出現如下查詢結果第一列是協議
  • 10.1吋超寬屏雙核平板優派VB100a Pro重磅上市
    9月初,全球視訊科技領導品牌美國優派(ViewSonic)旗下的全新雙核系列Android平板一經發布,就憑藉強悍的性能優勢俘獲了知名媒體和消費者青睞的目光。近日,優派雙核平板軍團中主打超廣角寬屏高清體驗的VB100aPro正式上市。
  • 基於Zynq-7000面向小型微型自動化監測系統的BSP設計與實踐
    BSP開發目的在於屏蔽底層硬體,提供作業系統與硬體驅動,使作業系統能穩定運行於主板環境[6-7]。由於傳統BSP設計存在不可或不易修改、難以復用以及設計流程複雜等問題,本文面向工業監測領域中的自動化系統,採用Xilinx提供的Vivado集成開發套件及用於構建和部署嵌入式系統到Xilinx全可編程處理器平臺的PetaLinux工具,完成了基於Zynq-7000 AP SoC的BSP設計與實現。
  • 兩種可控矽整流器的運行原理
    在今天的文章中,小編將會從他們的運行原理入手,為大家簡析一下他們的不同之處。本文引用地址:http://www.eepw.com.cn/article/201808/387058.htm首先要為大家介紹的是6脈衝可控矽整流器的運行工作原理。這裡所謂的6脈衝,指的是以6個可控矽組成的全橋整流,由於有6個開關脈衝對6個可控矽分別控制,所以我們一般稱之為6脈衝整流。
  • 蘋果A7處理器是怎樣用雙核擊敗八核的
    蘋果A7處理器是怎樣用雙核擊敗八核的 出處:愛活網  2013-09-24 13:33:20     編輯:雪花[爆料] 收藏文章 隨著蘋果在iPhone 5s上祭出「業界首枚64bit手機處理器」,果粉們似乎找到了新一輪嘲諷Android的武器:Anandtech等權威媒體測試表明,運行頻率僅 1.3GHz的雙核A7處理器,性能堪比安卓手機中的四核Cortex A15處理器。
  • 獲得一張照片的過程-相機的基礎原理
    按照學術性的解釋是:照相機是一種利用光學成像原理形成影像並使用底片記錄影像的設備那麼一個簡單的相機原理圖就可以這麼畫出來了。光學成像原理有哪些呢,(以下是初中物理複習環節)小孔成像:由於光是直線傳播的,所以在成像面上是一個倒立的實像。
  • P8700雙核win7系統 惠普4311s不足7000
    這款本本是4311s系列中配置最為出色的一款,擁有性能優秀的酷睿2雙核P8700處理器,搭載HD 4330獨顯,同時還有高速內存、高速硬碟和和指紋識別器的配備。 圖為:惠普4311s(VX603PA)    配置上,該機擁有主頻為2.53GHz的低功耗酷睿2雙核
  • 斯福尼雙核集成採暖系統,刷出溫暖陽光大眾讚嘆不已
    傳統取暖設備相信都應該挺熟悉的,由於在製作的過程中會產生很多的煤煙,從而導致對環境造成汙染,從而產生出許多的霧霾,因此很多人都希望綠色環保。其中斯福尼雙核集成採暖系統就是很好的選擇,它是一款養生的取暖品牌,沒有毒氣,沒有難聞的味道,也沒有對身體有害的電磁輻射,有效預防燙傷,不會漏電,有效告別使用安全隱患。
  • 9.7英寸雙核標杆 原道N90雙擎S十大看點_原道平板電腦_平板電腦...
    原道9.7英寸雙核新品N90雙擎S在保證1024×768解析度、RK3066雙核1.6GHz CPU+四核心Mali400圖形處理器等主流配置的情況下,售價僅為過去的一半,成為性價比最高的9.7英寸雙核平板,在大幅度拉低消費門檻的同時,力求使雙核9.7英寸平板成為大眾消費產品。
  • 入門雙核也玩大屏 華為G510聯通版評測(全文)_華為 G510_手機...
    2012年12月,華為G510聯通版順利發布,中規中矩的黑色機身,融入了之前Ascend D1、榮耀+設計上的元素,力求符合更多用戶對雙核手機的審美。MSM8225處理器,輔以512MB運行內存以及4GB機身存儲空間,支持最高32GB容量擴展。