中文原始鏈接: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”這個文檔,我們下載查閱一下。


具體是什么意思呢?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一致性維護異常和中斷異常等問題。
