工控網(wǎng)首頁
>

應(yīng)用設(shè)計(jì)

>

在 NXP i.MX 95 上運(yùn)行 Zephyr 實(shí)現(xiàn)非對稱多核處理

在 NXP i.MX 95 上運(yùn)行 Zephyr 實(shí)現(xiàn)非對稱多核處理

概要

盡管大多數(shù)嵌入式軟件應(yīng)用針對單一微處理器或微控制器開發(fā),但在某些特定場景下需要采用分布式架構(gòu)。以汽車行業(yè)為例,不同子系統(tǒng)可能作為獨(dú)立應(yīng)用程序部署在分離的處理器上,例如負(fù)責(zé)發(fā)動(dòng)機(jī)控制系統(tǒng)的嵌入式軟件與防抱死制動(dòng)系統(tǒng)應(yīng)用就分別運(yùn)行在不同的微控制器上。

醫(yī)療器械行業(yè)是嵌入式軟件分布于多個(gè)微處理器的另一典型案例。例如,用戶界面由一個(gè)微處理器實(shí)現(xiàn),而負(fù)責(zé)患者交互的控制系統(tǒng)則位于另一個(gè)微控制器上。

可以看出,職責(zé)是根據(jù)功能劃分的,而處理器則根據(jù)職責(zé)進(jìn)行選擇。例如,用戶界面通常在基于  Linux 的系統(tǒng)上實(shí)現(xiàn),這類系統(tǒng)專為類似 ARM Cortex-A 內(nèi)核的處理器設(shè)計(jì);而關(guān)鍵的嵌入式軟件應(yīng)用則采用實(shí)時(shí)操作系統(tǒng)(RTOS),這種系統(tǒng)最適合類似  ARM Cortex-R 或 Cortex-M 內(nèi)核的處理器。

然而,若采用多處理器架構(gòu),處理器間的通信便至關(guān)重要。例如汽車行業(yè)就通過 CAN 總線實(shí)現(xiàn)這一功能。在醫(yī)療設(shè)備領(lǐng)域,各處理器可采用 UART、SPI 或 I2C 等通信協(xié)議進(jìn)行交互,如下圖所示:

ARM A-Core ARM M-Core

然而,多個(gè)處理器分布在不同的芯片上會增加底層硬件、軟件和固件的復(fù)雜性。這進(jìn)而可能導(dǎo)致額外的開發(fā)和調(diào)試工作,從而影響產(chǎn)品的時(shí)間線和成本。

為了應(yīng)對這種額外的復(fù)雜性,我們可以將多個(gè)處理器集成到同一塊芯片上,如下圖所示:

ARM A-Core GUI ARM M-Core FuSa

在上圖中,ARM Cortex-A 和 ARM Cortex-M 內(nèi)核被集成在同一塊芯片上,稱為系統(tǒng)級芯片(SoC)。SoC 將 CPU 內(nèi)核與其他必要的控制器相結(jié)合,形成一個(gè)功能全面且強(qiáng)大的處理器。如圖中顯示,嵌入式軟件的功能安全(FuSa)部分通過 Zephyr Project 實(shí)時(shí)操作系統(tǒng)在 ARM Cortex-M 內(nèi)核上實(shí)現(xiàn),而圖形用戶界面(GUI)則在 ARM Cortex-A 內(nèi)核的 Linux 系統(tǒng)中運(yùn)行。

該設(shè)計(jì)大幅縮短了硬件開發(fā)與調(diào)試時(shí)間。無需再管理多個(gè)獨(dú)立處理器及電氣和機(jī)械硬件互聯(lián),問題簡化為圍繞單個(gè)處理器的硬件設(shè)計(jì)。挑戰(zhàn)也就主要轉(zhuǎn)移到固件和軟件層面,因?yàn)槊總€(gè)內(nèi)核的嵌入式軟件需要與其他內(nèi)核的嵌入式軟件建立通信機(jī)制。

在這篇博客文章中,我們將學(xué)習(xí)如何從運(yùn)行于 ARM Cortex-A 核心的 Linux 內(nèi)核加載運(yùn)行于 ARM Cortex-M 核心上的固件。我們將以 Toradex Verdin iMX95 模塊為例演示具體實(shí)現(xiàn)方法。

OpenAMP項(xiàng)目

Open Asymmetric Multi-Processing(OpenAMP)項(xiàng)目的設(shè)立旨在實(shí)現(xiàn)同一片上系統(tǒng)內(nèi)不同核心之間的高效通信。該項(xiàng)目基于德州儀器早期將 Remoteproc 和 RPMsg 納入 Linux 內(nèi)核的工作成果發(fā)展而來:Remoteproc 使 Linux 內(nèi)核能夠管理遠(yuǎn)端處理器(remote processor)上的嵌入式軟件生命周期,而 RPMsg 則實(shí)現(xiàn)了 Linux 內(nèi)核與遠(yuǎn)端處理器固件間的通信。OpenAMP 項(xiàng)目將德州儀器的專有實(shí)現(xiàn)方法擴(kuò)展為適用于各類系統(tǒng)的通用框架,標(biāo)準(zhǔn)化了 Linux 內(nèi)核與基于實(shí)時(shí)操作系統(tǒng)(RTOS)的嵌入式應(yīng)用間通信協(xié)議,并為希望利用其功能特性(如 RPMsg)的 RTOS 及裸機(jī)嵌入式應(yīng)用提供了參考實(shí)現(xiàn)方案。

如前所述,Remoteproc 和 RPMsg 是 OpenAMP 項(xiàng)目的兩大核心功能,它們使我們能夠管理運(yùn)行在同一 SoC 不同內(nèi)核上的嵌入式軟件。Remoteproc 負(fù)責(zé)將固件加載到遠(yuǎn)程處理器上,并啟動(dòng)和停止遠(yuǎn)程處理器的執(zhí)行。在 Linux 系統(tǒng)中,Remoteproc 通常用于管理運(yùn)行在 Cortex-M 等類似內(nèi)核上的嵌入式軟件生命周期。而 RPMsg 則負(fù)責(zé)支持運(yùn)行在 Cortex-M 內(nèi)核的嵌入式軟件與運(yùn)行 Cortex-A 內(nèi)核的 Linux 系統(tǒng)之間的消息交換。

Toradex Verdin iMX95

Toradex Verdin iMX95 是一款基于 NXP iMX95 SoC 的高性能模塊(SoM)。如下圖所示,iMX95 SoC 包含三種不同類型的 ARM 核心架構(gòu):

Verdin iMX95 ARM Cores

ARM Cortex-A55 運(yùn)行 Linux 操作系統(tǒng),ARM Cortex-M7 負(fù)責(zé)執(zhí)行實(shí)時(shí)固件,而 ARM Cortex-M33 則管理 Cortex-A55 和 Cortex-M7 的運(yùn)行。

Zephyr Project RTOS

盡管“實(shí)時(shí)操作系統(tǒng)”是 Zephyr 項(xiàng)目 RTOS 的官方名稱,但 “Zephyr” 遠(yuǎn)不止是一個(gè) RTOS。它是一個(gè)完整的生態(tài)系統(tǒng)。雖然它確實(shí)包含了 RTOS 的典型功能和數(shù)據(jù)結(jié)構(gòu),如任務(wù)、信號量、互斥鎖和消息隊(duì)列,但它還擁有負(fù)責(zé)嵌入式系統(tǒng)其他重要功能的軟件棧。例如,它包括:

用于控制和操作廠商特定硬件的驅(qū)動(dòng)程序?qū)崿F(xiàn)完整通信協(xié)議棧的軟件,例如藍(lán)牙低功耗(BLE)和WiFi實(shí)現(xiàn)整個(gè)子系統(tǒng)的模塊,例如文件系統(tǒng)和引導(dǎo)加載程序

Zephyr 還支持來自眾多廠商的 750 多款開發(fā)板,包括 Toradex Verdin iMX95。如果我們下載 Zephyr 代碼庫,可以看到在 boards/nxp/imx95_evk 目錄下提供了對 iMX95 EVK 的支持,如下圖所示:

Zephyr support for different boards

Zephyr 借鑒了 Linux 內(nèi)核的 Kconfig 和 Devicetree 功能,我們可以在上圖中看到這一點(diǎn)。上圖所示的 iMX95 EVK “device driver” 包含:

“board.c”, 負(fù)責(zé)初始板卡啟動(dòng)的C源代碼“imx95_evk_mimx9596_m7.dts”, 用于告知 Zephyr 該板卡上存在哪些外設(shè)的 Devicetree 文件“Kconfig.imx95_evk”, 需要啟用支持該板卡關(guān)鍵功能的 Kconfig 的選項(xiàng)集合

例如,如果我們打開“Kconfig.imx95_evk”文件(如下圖所示),可以看到它啟用了 iMX95 SoC 的 Kconfig 選項(xiàng)。該 Kconfg 選項(xiàng)隨后會啟用 SoC 所需的其他功能:

iMX95 SoC Kconfig

例如,Verdin iMX95的“device driver”位于 soc/nxp/imx/imx9/imx95 目錄下,如下圖所示:

Verdin iMX95 device driver

同樣的,“soc.c” 是負(fù)責(zé)初始 SoC 啟動(dòng)的 C 源代碼,通過分析設(shè)備樹中的相應(yīng)節(jié)點(diǎn),我們可以發(fā)現(xiàn)該 SoC 的 Kconfig 文件定義了 Flash 大小。

整合所有步驟

讓我們演示如何為 iMX95 編譯 Zephyr 應(yīng)用程序,并從同一開發(fā)板上運(yùn)行的 Cortex-A 內(nèi)核加載 Zephyr 應(yīng)用程序到 Cortex-M 內(nèi)核。首先,我們可以按照 Zephyr入門指南(https://docs.zephyrproject.org/latest/develop/getting_started/index.html)中的步驟確保環(huán)境配置正確。

然后執(zhí)行以下命令使用 West 工具獲取 Zephyr 源代碼:

$> west init -m https://github.com/mabembedded/zephyr.git 
$> west update

之后,我們可以執(zhí)行以下命令為 Verdin iMX95 編譯一個(gè)簡單的“Hello World”應(yīng)用程序:

$> west build -p -b imx95_evk/mimx9596/m7 samples/hello_world

然后,我們可以通過執(zhí)行以下命令(確保將下方列出的 IP 地址替換為我們開發(fā)板的實(shí)際地址),將編譯好的 ELF 格式二進(jìn)制文件傳輸至運(yùn)行在 iMX95 Cortex-A 內(nèi)核上的 Linux 系統(tǒng):

$> scp build/zephyr/zephyr.elf root@10.10.2.22:~/

隨后,如果我們登錄到 iMX95 設(shè)備,可以運(yùn)行以下命令來指示 Linux 將 Zephyr ELF 二進(jìn)制文件加載至 Verdin iMX95 的 Cortex-M7 核心上:

root@imx95-19x19-verdin:~# cd /sys/devices/platform/imx95-cm7/remoteproc/remoteproc1/ 
root@imx95-19x19-verdin:~# echo ~/zephyr.elf > firmware

最后,我們可以在 iMX95 Linux 控制臺中輸入以下命令來啟動(dòng) Cortex-M7 核心:

root@imx95-19x19-verdin:~# echo start > state

我們可以在 iMX95 的 Cortex-M7 控制臺上看到以下內(nèi)容:

Booting Zephyr OS build

上述示例展示了 Linux 內(nèi)核中 OpenAMP 項(xiàng)目的 Remoteproc 功能。

我們還可以通過如下所示的 openamp_rsc_table 示例應(yīng)用程序,了解 Zephyr 中的 RPMsg 功能:

openamp_rsc_table

如上圖所示,“imx95_evk_mimx9596_m7.conf” 包含了該應(yīng)用啟用的 Kconfig 選項(xiàng)。下圖可見,此文件已啟用相關(guān)的 OpenAmp 和 Mbox Kconfig 配置項(xiàng):

OpenAmp and Mbox Kconfig options

該目錄還包含一個(gè) Devicetree “overlay”,用于為此特定應(yīng)用定制開發(fā)板的 Devicetree。如下圖所示,此覆蓋層定義了 RPMsg 應(yīng)用所需的功能,并引用了特定的硬件組件:

RPMsg application and references specific hardware components

這些特性包括:

各個(gè)核心間用于交換數(shù)據(jù)的共享內(nèi)存Linux內(nèi)核通過資源表來識別遠(yuǎn)程處理器及固件支持的功能雙核通信使用的郵箱機(jī)制

接下來演示如何編譯并運(yùn)行 RPMsg Zephyr 應(yīng)用程序。首先執(zhí)行以下命令進(jìn)行編譯:

$> west build -p -b imx95_evk/mimx9596/m7 samples/subsys/ipc/openamp_rsc_table

隨后,我們可以按照之前概述的步驟將生成的 ELF 二進(jìn)制文件從 Cortex-A55 上的 Linux 系統(tǒng)傳輸并加載到 Cortex-M7 中。在從 Linux 端啟動(dòng) Cortex-M7 后,我們將在 Cortex-M7 的控制臺上看到以下內(nèi)容,這展示了從 Linux 端接收到的消息:

Cortex-M7 console

同樣,如果觀察 Cortex-A55 端的 Linux 內(nèi)核日志,我們也能看到它通過 RPMsg 接收到了來自 Cortex-M7 上 Zephyr 應(yīng)用程序的消息,如下所示:

RPMsg from the Zephyr application on the Cortex-M7

總結(jié)

在本篇博客中,我們了解了利用 OpenAMP 項(xiàng)目特性簡化嵌入式系統(tǒng)硬件設(shè)計(jì)的優(yōu)勢。探討了 Toradex Verdin iMX95 開發(fā)板如何通過 SoC 上不同的 ARM 內(nèi)核實(shí)現(xiàn)創(chuàng)新應(yīng)用場景。實(shí)踐演示了使用 Zephyr 實(shí)時(shí)操作系統(tǒng)快速構(gòu)建 "Hello World" 示例程序,并從運(yùn)行于 Cortex-A55 的 Linux 系統(tǒng)加載至 Verdin iMX95 的Cortex-M7 核心的全過程。最后,我們還完成了基于 RPMsg 協(xié)議的 Zephyr 應(yīng)用程序編譯、從 Linux 環(huán)境加載以及驗(yàn)證 Zephyr 與 Linux 之間消息交互的實(shí)驗(yàn)。

審核編輯(
王靜
)
投訴建議

提交

查看更多評論
其他資訊

查看更多

HDMI 顯示器熱插拔對應(yīng)顯示應(yīng)用啟停測試

Yocto meta-toradex-security layer 創(chuàng)建加密數(shù)據(jù)分區(qū)應(yīng)用說明

NXP iMX8MP ARM 平臺多屏幕克隆顯示測試

Yocto meta-toradex-security layer 創(chuàng)建獨(dú)立數(shù)據(jù)分區(qū)

NXP iMX8MP ARM 平臺 EMQX 部署測試