在多核異構CPU中,多個(gè)內核就如同多個(gè)大腦,而外設和內存等資源就如同手足,那么多個(gè)大腦該如何控制手足才能保證它們正常有序地運行呢?以[color=inherit !important]NXP [color=inherit !important]i.MX8M Plus處理器的A核和M核為例,其實(shí)只有少部分外設被指定了屬于哪個(gè)核,而大部分的外設都能被A核和M核同時(shí)使用。如下圖所示: 這里我們通過(guò)[color=inherit !important]飛凌嵌入式OKMX8MP-C[color=inherit !important]開(kāi)發(fā)板上的UA[color=inherit !important]RT3進(jìn)行演示,同時(shí)編寫(xiě)A核和M核程序控制UAR[color=inherit !important]T3打印信息,通過(guò)UART3將開(kāi)發(fā)板與電腦鏈接,在電腦串口調試界面可以看到A核和M核同時(shí)輸出了信息。 A核和M核同時(shí)輸出信息 那么在實(shí)際應用中,當某個(gè)外設需要被指定的內核獨占或被多核同時(shí)使用時(shí),該如何合理安排時(shí)序才能避免外設輸出異常呢?接下來(lái),小編就以[color=inherit !important]飛凌[color=inherit !important]嵌入式OKMX8MP-C開(kāi)發(fā)板為例,將多核異構處理器對共享外設和資源的調配方法介紹給大家。 飛凌嵌入式OKMX8MP-C開(kāi)發(fā)板所搭載的NXP [color=inherit !important]i.MX8MPlus處理器具備強悍的性能,集成4個(gè)主頻最高可達1.8GHz (工業(yè)級主頻為1.6GHz)的Arm [color=inherit !important]Cortex-A53多任務(wù)核和1個(gè)Cortex-M7實(shí)時(shí)核,不管是對數據的高速吞吐、處理,還是復雜的[color=inherit !important]人機交互界面處理,都能從容應對。 一、A核獨占外設這種情況比較簡(jiǎn)單,在設備樹(shù)中定義設備節點(diǎn),編譯新的設備樹(shù),將生成的OK8MP-C.dtb和Image拷貝至以下目錄:開(kāi)發(fā)板/run/media/mmcblk2p1/ ,重啟[color=inherit !important]iMX8MP開(kāi)發(fā)板,同時(shí)M核程序中不初始化UART3即可。以UART3為例: 二、M核獨占外設 對于NXP [color=inherit !important]i.MX8M Plus處理器而言,由于A(yíng)核和M核對內存和外設的訪(fǎng)問(wèn)都是共享且平等的,為了確保不產(chǎn)生資源沖突會(huì )通過(guò)資源域(resource domains)控制器從硬件層面來(lái)對指定內存和外設的訪(fǎng)問(wèn)權限進(jìn)行保護。 i.MX8M Plus處理器允許定義最多4個(gè)資源域并將不同的內存和外設資源指定到這些資源域中。默認情況下,A核和相關(guān)外設被指定于域0;當M核程序運行后,M核以及相關(guān)外設最初也是域0,但馬上被重新指定于域1。 因此若一個(gè)外設需要被M7內核單獨使用,首先要修改A核設備樹(shù),刪除外設節點(diǎn);其次在M核程序中將域0改為域1;最后再將外設初始化,這樣就可以單獨控制了。域轉換代碼如下: 三、多核共享外設如果多核想共享某個(gè)外設,但在某段時(shí)間又需要獨占,后續再釋放;或者多核的開(kāi)發(fā)人員不是同一人,為了避免出錯,在自己的程序中強制獨占某個(gè)核,是否可以實(shí)現呢?答案是肯定的——使用RDC功能即可。RDC全程為Resource Domain Controller,即資源域控制器,可以通過(guò)寄存器和信號量?jì)煞N方式實(shí)現某個(gè)域對外設的獨占和釋放。 1. 寄存器RDC_PDAPn 由于i.MX8M Plus處理器最多支持4個(gè)域,因此對寄存器后8比特位寫(xiě)入不同數值,將允許相應的域對某個(gè)管腳和內存的讀寫(xiě)使能,如禁止A核域0讀寫(xiě)某個(gè)管腳,則設置寄存器為0xFC即可,后兩個(gè)比特位為0,表示禁止域0讀寫(xiě)此外設;其他六個(gè)比特位為1,表示允許從域1到域3讀寫(xiě)此外設。 每個(gè)共享外設在RDC資源表中均有一個(gè)序號,用于區別其他外設,如UART3在RDC中定義如下:kRDC_Periph_UART3 = 104U, /**< UART3 RDC Peripheral */ 在M核程序中可如下修改程序,實(shí)現M核獨占UART3的目的。
修改程序驗證,此時(shí)只有M核控制UART3打印信息。 僅M核輸出信息 注意: 因為在設備樹(shù)中沒(méi)有刪除UART3,所以在A(yíng)核啟動(dòng)內核解析設備樹(shù)生成設備文件時(shí),需對UART3操作。因M核程序中禁止A核的訪(fǎng)問(wèn)UART3,此時(shí)內核將無(wú)法正常啟動(dòng)?梢约10秒延時(shí)等待內核啟動(dòng)完成,也可在A(yíng)核啟動(dòng)后,通過(guò)雙核通信告知M核啟動(dòng)RDC外設獨占。 2. 信號量RDCSEMA42 RDC SEMA42是一個(gè)專(zhuān)門(mén)配合RDC功能的信號量,當某個(gè)域獲取某個(gè)外設的SEMA42鎖后,其他的域將無(wú)法訪(fǎng)問(wèn)此外設,只能等待域釋放該外設鎖,才能再訪(fǎng)問(wèn)。RDC SEMA42數據鎖的開(kāi)啟配置如下: M核對UART3上鎖,獲取管腳的使用權: M核釋放UART3的RDC SEMA42鎖,放棄管腳的使用權: 修改程序后驗證,發(fā)現和RDC寄存器一樣,M核上鎖后獲取UART3使用權,僅可獨自發(fā)送,A核訪(fǎng)問(wèn)UART3會(huì )出錯。釋放SEMA42鎖后,A核和M核就均能訪(fǎng)問(wèn)UART3了。 以上就是小編基于OKMX8MP-C開(kāi)發(fā)板為大家帶來(lái)的多核異構處理器對外設和內存資源的使用方法,各位工程師小伙伴可以根據自己的需求靈活設置策略,以滿(mǎn)足不同場(chǎng)景的需要。
|