zenq系列的兩個arm處理器核心可以分別工作,其公用資源有cache、ddr、所有外設、ocm儲存器等。
可以將其看成是兩個執行緒,實際使用時,可以通過執行緒同步、互斥的方式來實現裸機情況下的簡單雙核排程與使用。
由於兩個核心的記憶體空間是公用的,硬體上不作區分,也就是說每個核心都可以訪問到完整的ddr空間。
因此,需要在邏輯上將兩個核心使用的記憶體空間區分開來。例如
cpu
ddrcpu0
0 ~ 200mb
cpu1
200m ~ 512mb
對於arm架構而言,不區分程式空間和資料空間,因此程式載入時也應該載入到各自對應的空間中。對於bootloader而言,需要完成4件事情。
1. 晶元自檢,載入驅動
2. 載入bit stream,並通過vcap模組寫入fpga
3. 載入cpu0的程式和cpu1的程式
4. 將cpu0 hand off 到cpu0的使用者程式上
對於cpu0和cpu1的工程而言,需要將其生成的elf可執行檔案的載入位址改為各自空間的首位址。通過修改linker script來實現。例如
cpu0 linker script
the system */
memory
cpu1 linker script
the system */
memory
上面的例子中
將cpu0的記憶體基位址改為1mb,記憶體大小改為149mb,即cpu0的邏輯記憶體空間為1mb~150mb
將cpu1的記憶體基位址改為150mb,記憶體大小改為50mb,即cpu1的邏輯記憶體空間為150mb~200mb
系統實際記憶體空間為512mb,剩餘的312mb留給fpga使用
zenq系列的雙核arm必須由cpu0先啟動,再通過cpu0來啟動cpu1。cpu0的程式需要將cpu1的程式入口位址設定好,再啟動cpu1。實現**如下
#define
sev() __asm__("sev");
#define cpu1_start_addr (0xfffffff0)
#define share_ram_base_addr (0xffff0000)
xil_settlbattributes(share_ram_base_addr, 0x14de2);
xil_out32(cpu1_start_addr, 0x09600000);
dmb();
sev();
在彙編指令sev執行以後,cpu1即開始從0xfffffff0存放的位址處開始執行。
需要注意的是,由於cache是共享資源,因此兩塊cpu不能同時使用。在**中,只能有乙個cpu**執行
xil_icacheenable();
xil_dcacheenable();
由於ocm記憶體為兩塊cpu公用,且訪問速度較快,可以將ocm記憶體區看作類似於ipc的「共享記憶體」,用於兩塊cpu程式之間的同步和互斥等。例如
struct dual_core_ctrl_stru
然後在cpu0和cpu1的程式中分別應用這塊記憶體區域
#define share_ram_base_addr (0xffff0000)
struct dual_core_ctrl_stru *stdualctrl =
(struct dual_core_ctrl_stru*) share_ram_base_addr;
具體的訊號量處理介面不再贅述,請自己造輪子 : ) FPGA開發之IP核
從ip 核的提供方式上,通常將其分為軟核 硬核和固核這3 類。從完成ip 核所花費的成本來講,硬核代價最大 從使用靈活性來講,軟核的可復用使用性最高。軟核 soft ip core 軟核在 eda 設計領域指的是綜合之前的暫存器傳輸級 rtl 模型 具體在 fpga 設計中指的是對電路的硬體語言描述...
FPGA開發之呼叫FFT IP核
有三種fft 1 流水線,streaming i o 結構 允許連續的資料處理 2 基 4,burst i o 結構 提供資料匯入 匯出階段和處理階段。此結構擁有較小的結構,但轉換時間較長 3 基 2,burst i o 結構 使用最少的邏輯資源,同 radix 4 相同,提供兩階段的過程。第一種結...
8核 6核 4核 雙核CPU是什麼意思
對於初學者來說,cpu是什麼 什麼是雙核 4核 6核 8核等。下面,就以上的問題,我們做出一一解答。概念 cpu是什麼 做什麼用 一般cpu是接在 的,我們先來看看cpu是什麼,cpu既 處理器 電腦中乙個最重要,最核心的東西,市面上能買到的cpu只有兩種,一種是intel公司生產的,另一種是amd...