先楫半導(dǎo)體的HPM6750集成2個(gè)RISC-V 處理器,主頻高達(dá)816MHz。既然有兩個(gè)CPU,豈可讓它白白浪費(fèi)?本文來(lái)帶你一起嘗試雙核例程,體驗(yàn)雙引擎帶來(lái)的風(fēng)馳電掣般的感覺(jué)。
HPM6750雙核采用主從結(jié)構(gòu),CPU0 和CPU1 采用相同配置:
●支持相同指令集
●相同容量的L1 指令和數(shù)據(jù)緩存
●相同容量的指令和數(shù)據(jù)本地存儲(chǔ)器:256 KB ILM 和256 KB DLM
CPU0 和CPU1 采用相同的存儲(chǔ)器映射,以下為例外:
● CPU 自身的指令/數(shù)據(jù)本地存儲(chǔ)器ILM / DLM 為私有;
●FGPIO 為私有
●軟件中斷控制器PLICSW 為私有
●機(jī)器定時(shí)器MCHTMR 為私有
CPU0 和CPU1 采用相同的特權(quán)模式設(shè)置。
CPU0 為主CPU,CPU1 為從CPU,當(dāng)復(fù)位發(fā)生時(shí),系統(tǒng)總是由CPU0 啟動(dòng),而CPU1 處于待機(jī)狀態(tài)。需要時(shí),由CPU0 裝載CPU1 的程序鏡像,之后釋放CPU1,步驟如下:
1. CPU0 將CPU1 的代碼鏡像地址寫(xiě)入SYSCTL_CPU1_GPR0 寄存器
2. CPU0 將CPU1 啟動(dòng)代號(hào)寫(xiě)入SYSCTL_CPU1_GPR1 寄存器,代號(hào)為0xC1BEF1A9
3. CPU0 將SYSCTL_CPU1_LP [HALT] 位清0,即可釋放CPU1
雙核應(yīng)用程序的開(kāi)發(fā)步驟如下:
根據(jù)
“E:\sdk_env_v0.9.0\hpm_sdk\samples\multicore\hello”中README_zh.md文件如下:
多核示例工程在Core0上運(yùn)行"hello word"示例,在core1上運(yùn)行"rgb_led"示例。
在本工程中:
- 串口輸出 "hello world"; 鍵盤(pán)手動(dòng)輸入字符串信息,通過(guò)串口打印出來(lái)
- RGB LED會(huì)在紅、綠、藍(lán)三色中依次切換
## 硬件設(shè)置
BOOT_PIN 應(yīng)該設(shè)置為:0-OFF, 1-OFF
## 生成和編譯多核工程
本示例中:core0示例在FLASH中原地執(zhí)行, core1工程在ILM里執(zhí)行。
用戶必須先生成和編譯__Core1__工程
用戶必須在生成和編譯完core1工程后再生成和編譯__Core0__工程
### 生成core1工程
__CMAKE_BUILD_TYPE__ 必須是 下列選項(xiàng)中的一種:
- *"sec_core_img"*
- *"sec_core_img_release"*
若通過(guò)SDK env 包來(lái)生成工程,需要用 *"-t sec_core_img"*
### 生成core0工程
__CMAKE_BUILD_TYPE__ 無(wú)限制
## 運(yùn)行現(xiàn)象
- 下載core0示例到設(shè)備并運(yùn)行
- 下載core1示例到設(shè)備并運(yùn)行
本文參照以上說(shuō)明將在core0和core1中分別新建FreeRTOS相關(guān)程序,即在雙核上各自運(yùn)行RTOS。
新建Core1程序的SES工程
復(fù)制HPM 6750的SDK文件夾“sdk_env_v0.9\hpm_sdk\samples\rtos”下面的freertos_hello實(shí)例工程,復(fù)制到“sdk_env_v0.9.0\hpm_sdk\samples\multicore\hello\”并重新命名成“FreeRTOS_RISCV1”。
修改CMakeLists.txt文件中的配置,增加core1的鏈接文件,如下圖所示:
然后根據(jù)SDK 開(kāi)發(fā)指南文檔《HPM6750EVKMINI_UG》中的工程生成步驟,來(lái)生成segger embedded studio的工程文件。SDK env 包來(lái)生成工程,需要增加"-t sec_core_img"*
新建Core0程序的SES工程
復(fù)制HPM 6750的SDK文件夾“sdk_env_v0.9\hpm_sdk\samples\rtos”下面的freertos_hello實(shí)例工程,復(fù)制到“sdk_env_v0.9.0\hpm_sdk\samples\multicore\hello\”并重新命名成“FreeRTOS_RISCV”。
修改CMakeLists.txt文件中的配置,增加core0的鏈接文件,如下圖所示:
然后根據(jù)SDK 開(kāi)發(fā)指南文檔《HPM6750EVKMINI_UG》中的工程生成步驟,來(lái)生成segger embedded studio的工程文件。
編譯Core1程序的SES工程
因?yàn)閏ore0程序中依賴core1工程編譯并轉(zhuǎn)換的源文件,因此,在編譯core0程序前,必須先將core1工程編譯好。
SDK會(huì)生成工程文件FreeRTOS_RISCV在FreeRTOS_RISCV\hpm6750evkmini_build\segger_embedded_studio文件路徑下面,通過(guò)雙擊該文件可以直接進(jìn)入SES(segger embedded studio),并打開(kāi)該工程,然后編譯。
在core1的工程編譯完成會(huì)生成文件“sec_core_img.c”,并被自動(dòng)拷貝到core0的工程路徑FreeRTOS_RISCV/src/。在core1的FreeRTOS例程中主要完成RGBLED的依次點(diǎn)亮運(yùn)行。
編譯Core0程序的SES工程
在core0的FreeRTOS例程中主要完成RTOS多任務(wù)運(yùn)行。
先在core0的工程增加從核鏡像加載處理接口。
并將該接口放置在board_init之后
多核調(diào)試
在進(jìn)行雙核程序調(diào)試時(shí),先下載并啟動(dòng)core0的程序。
先在core0的SES工程中按F5,讓core0主核的程序運(yùn)行;再在core1的SES工程中按F5,讓core1的程序運(yùn)行。
可以看出core0的程序任務(wù)1和任務(wù)2,能夠輪流執(zhí)行,并且IDLE任務(wù)在他們休眠的間隙能夠被調(diào)度執(zhí)行。
對(duì)上面的代碼稍作調(diào)整,調(diào)整任務(wù)1和任務(wù)2的延時(shí)時(shí)間,其中task2不再延時(shí)。
結(jié)論
HPM6750 采用雙RISC-V 內(nèi)核,可以方便的適配主核和從核的各種接口,能夠充分靈活地利用soc的各種資源。為實(shí)時(shí)性要求高,控制內(nèi)容多樣的應(yīng)用提供更為友好的體驗(yàn)。
-
雙核
+關(guān)注
關(guān)注
0文章
37瀏覽量
15180
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論