ZYNQ雙核AMP開發詳解(USE_AMP -DUSE_AMP=1 含義和作用詳解)


中文原始鏈接:https://www.codenong.com/cs106697858/

英文原始鏈接:https://www.programmersought.com/article/76044148229/

 

ZYNQ雙核AMP開發詳解(USE_AMP -DUSE_AMP=1 含義和作用詳解)

Zynq雙核AMP模式運行(Zynq雙核AMP模式運行演示視頻教程 :
https://www.ixigua.com/i6836328174431765005/),CPU1工程的bsp中需要增加編譯選項“-DUSE_AMP=1”,這個編譯選項有什么作用呢?是如何影響源碼的編譯的呢?

我們找到Xilinx相關的說明文檔,查看一下,我們在Xilinx官網搜索“-DUSE_AMP=1”,勾選“Design Tools”,如下圖所示我們會搜到“UG1186 - Libmetal and OpenAMP User Guide”這個文檔,我們下載查閱一下。

 

我們打開“UG1186”這個文檔,直接搜索“-DUSE_AMP=1”,如下圖所示,可以看到增加“-DUSE_AMP=1”編譯選項的作用是,“To disable initialization of shared resources when the master processor is handling shared resources initialization”。

具體是什么意思呢?CPU0先啟動運行初始化系統,然后啟動CPU1,這時CPU0已經初始化共享資源並且可能正在使用某些資源。但是CPU0和CPU1的工程使用的Bsp的源碼是一樣的,增加“-DUSE_AMP=1”編譯選項的作用就是使能預編譯指令,讓CPU1工程中涉及到共享資源初始化的代碼段不被編譯進應用程序,這樣CPU1啟動后就不會再進行共享資源的初始化了。

那么具體都涉及哪些共享資源,哪些代碼沒有被編譯呢?我們可以搜索工程源碼,如下圖所示,

 

 

這里需要說明一下我們在編譯器選項中添加的是“-DUSE_AMP=1”這個參數,那么在源碼中的預編譯指令是用“USE_AMP”定義的,也就是編譯器選項中的DUSE_AMP等價於源碼中的USE_AMP。

我們首先查看一下boot.S,如下圖所示,我們可以看到initialize L2 Cache的代碼段不被編譯,那么CPU1啟動后就不會初始化L2緩存。

我們再來查看一下xil_cache.c,如下圖所示,主要影響到CPU1對緩存的操作。

我們再查看一下xil-crt0.S,如下圖所示,主要影響到CPU1對全局時鍾的操作。

最后我們差看一下xscugic_hw.c和xscugic.c,當定義了USE_AMP等於1時,都是直接return,不對中斷進行配置。

 

 

那么總結一下就是,“-DUSE_AMP=1”編譯選項將影響到工程代碼里的USE_AMP預編譯指令,使得Cache操作函數、全局時鍾以及中斷控制器SCUGIC的初始化函數不被編譯進CPU1的應用程序中,避免可能會出現的CPU0和CPU1Cache一致性維護異常和中斷異常等問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM