在《玩轉MCU雙核(上)》文章里,我們給大家介紹了先楫HPM6000系列雙核的特性、使用方法以及工程編譯與調試。本文緊接上篇內容,給大家詳細闡述雙核的通信方式、資源分配以及雙核應用eRPC架構。如果大家在練手過程中,有其他的建議和想法,歡迎給我們留言互動。
雙核的通信方式
Communication
HPM雙核通信方式有那些?這里列舉如下:
A. 通信外設通信
如enet/uart/spi/can/i2c/gpio等等。Core0和Core1可通過通信外設相互之間發送消息來通信。
( 注意:此方案會浪費對應的通訊外設,且需要硬件上支持。)
B. 共享內存RAM通信
Core0和Core1通過訪問同一片內存RAM來達到通信。如:一個核寫,另一個和讀。
共享RAM要點
1. 雙核下的共享RAM區域地址及大小必須相同。
2. 為防止CPU cache的影響,共享的RAM區域在雙核下均要設置為nocache區域或者在訪問前后強制刷新cache。
注意:如果設置為nocache區域,core0和core1中均要調用初始化PMP。
例如:
HPM-SDK雙核例程下,雙核linker文件中,均已分配了SHARE_RAM區域。
Core0 linker文件中的SHARE_RAM區域分配:
Core1 linker文件中的SHARE_RAM區域分配:
工程中定義共享RAM區域,并訪問讀寫。
Core0工程下設定nocache區域,并初始化PMP。
Core1工程下同樣設定為nocache區域,并初始化PMP。
如下:
Core0工程
Core1工程
通過debug調試,在core1中打斷點,core1中寫共享區域。
通過串口發送數據,在core0中讀取共享區域。
運行結果如下:
從運行結果看,core1中寫入的共享區域的數據和core0中讀取的共享區域的數據是一致的。
C. 通信信箱MBX通信
HPM支持獨有的通信信箱MBX來進行處理器核間通信。主要特性如下:
● 每個接口支持 TX FIFO 和 RX FIFO
● 支持標志位反映 TX FIFO 和 RX FIFO 狀態
● 支持生成中斷
雙核MBX通信,參考HPM-SDK例程drivers/mbx。
(注意:當然也支持讀寫Flash來通信,考慮到并發讀寫Flash帶來的異常,此通信方案不推薦使用。)
在這里,推薦大家結合B和C方案,通過MBX做雙核間的消息傳遞,通過共享RAM的方式來達到大數據的通信。
當然通過雙核通信來實現雙核間的同步和互斥。例如:通過MBX通信,實現類似OS互斥鎖和信號量的功能。
雙核的資源分配
Resources
HPM雙核資源,除了以下資源是Core0和Core1各自私有的,其余資源均需要合理分配。
● CPU 自身的指令/數據本地存儲器 ILM / DLM 為私有
● FGPIO 為私有
● 平臺中斷控制器 PLIC 為私有
● 軟件中斷控制器 PLICSW 為私有
● 機器定時器 MCHTMR 為私有
A:雙核Flash 資源分配要點
防止Core0和Core1并發同時訪問同一個flash。例如:結合MBX通信,實現互斥鎖來避免并發訪問。并且考慮到flash_xip(非xip的除外) 片上運行,同時應在訪問flash前后,禁止和使能全局中斷。
B:雙核RAM 資源分配要點
1. 除了共享ram區域和各自私有的ILM/DLM區域。其余sram和sdram在core0和core1的分配中不可重疊,避免出現未知數據錯誤。
2. Core0和Core1共享RAM區域的分配,地址及大小必須相同。
C:雙核訪問同一外設要點
通常應該避免雙核訪問同一個外設。如果有需求要同時訪問同一外設,需要注意以下幾點:
1. 禁止雙核均初始化同一外設。如:Core0已經初始化相關外設,Core1無需再次初始化。
2. 防止Core0和Core1并發操作同一外設。例如:結合MBX通信,實現雙核互斥鎖來防止并發操作。
D:雙核使能同一外設中斷要點
由于雙核Core0/Core1各自的PLIC平臺中斷控制器是私有的,如果雙核均使能了同一個外設中斷,需注意以下幾點:
1. 禁止雙核均初始化同一外設。如:Core0已經初始化相關外設,Core1無需再次初始化。
2. 雙核各自的私有PLIC中均要使能當前中斷。如:Core0的PLIC中使能了IRQn_GPIO0_Z中斷,Core1的PLIC中同樣也要使能IRQn_GPIO0_Z中斷。
3. 禁止雙核外設中斷處理接口中均清除中斷標識位。如:Core0中清除了當前外設中斷標識位,Core1中無需再次清除。如下:
E:雙核異常要點
由于HPM雙核是兩個獨立的CPU,是主從架構。
當雙核出現異常情況,需要注意以下幾點:
1. 其中一個核出現異常(crash)但未重啟,另一個核仍能正常運行,不受影響。
2. Core0異常重啟,Core1也會隨之重啟。
主從架構,Core0為主,Core1為從。當復位發生時,系統總是由Core0啟動,而Core1處于待機狀態,需要Core0裝載啟動Core1。
3. Core1異常重啟,Core0仍正常運行,不受影響。
推薦結合看門狗WDG來合理處理雙核異常情況。
雙核應用eRPC架構
eRPC Structure
eRPC(Embeded Remote Procedure Call) 是一個簡單的、易用的、高效的遠程調用框架。
RPC是一種機制,Client端通過簡單的本地函數調用,就能使用Server端提供的服務。對于Client端而言,使用遠程服務就像調用應用程序中內置的庫函數一樣。
當Client端調用遠程函數時,該函數的標識(identifier)和函數的參數(parameters)將被序列化到字節流中,此字節流通過傳輸層的通信通道(IPC、TCP/IP、UART、SPI等)傳至Server端。Server端收到字節流數據后,解析函數參數并根據標識選擇調用的服務函數。若函數有返回值,則Server端將返回值序列化并發送回Client端。
以下是RPC架構框圖(此圖僅顯示一個傳輸方向,省略了來自Server端的回復)。
對應多核(MultiCore)應用,通過RPMsg-Lite是作為傳輸層;對于多芯片(MultiProcessor)應用,通過UART、SPI、TCP/IP等作為傳輸層信號通道。
HPM6000系列雙核應用,將使用RPmsg-Lite作為傳輸層。
RPMsg-Lite(Remote Processor Messaging Lite)是ePRC的傳輸層,RPMsg協議定義了一個標準化的二進制接口,用于在多核系統中內核之間的通信。
RPMsg協議的分層模型如下:
它是實現eRPC的關鍵部分,采用的數據通訊方式為共享內存和消息通知。
詳細介紹參考GitHub官方網站:
https://github.com/EmbeddedRPC/erpc
https://github.com/nxp-mcuxpresso/rpmsg-lite
HPM-SDK已完成了eRPC的移植,采用RPmsg-Lite作為數據傳輸層,采用MBX作為事件通知。
例程:hpm_sdk\samples\multicore\erpc
-
mcu
+關注
關注
146文章
17123瀏覽量
350992 -
先楫半導體
+關注
關注
10文章
214瀏覽量
2102
發布評論請先 登錄
相關推薦
評論