架構說明
本項目以 STM32MP157A-DK1 為硬件平臺。作為能夠支持輕松開發更廣泛應用的通用微處理器產品線,STM32MP157 系列基于雙核Cortex-A7 與 Cortex-M4 組成的異構架構,加強了支持多應用和靈活應用的能力,可以隨時實現最佳性能和功率數據。Cortex-A7 內核提供對開源操作系統(Linux/Android)的支持,而 Cortex-M4 內核可以利用 STM32 MCU 的生態系統。本篇文章將介紹如何在 STM32MP157 上運行 RT-Thread OS。
啟動方式
Forced USB boot For flashing : 通過 USB 燒寫固件。在此模式下,可以使用 STM32Cube Programmer 工具燒寫 A7 核固件。
Engineer Mode: 一般用于 M4 核的調試。由于 STM32MP1 沒有 Flash,所以代碼會被燒寫到 Cortex-M4 核有訪問權限的 RAM 里面,因此掉電程序會丟失。
SD card on SDMMC1 : 從 SD card 啟動。
工作模式
STM32MP1 有兩種工作模式
工程模式(Engineer Mode),系統上電后,不會啟動 A7 核。M4 核此時可以像平常 STM32 的開發流程,借助于調試工具進行調試。
產品模式(Production Mode),系統上電后,會先啟動 A7 核,然后由 A7 核來啟動 M4 核。
OpenAMP
開源的非對稱多處理框架(OpenAMP)為開發 AMP 系統提供了必要的 API 函數。OpenAMP 是 Xilinx 和M entor Graphic 于2014年發起的一個開源項目,旨在提供一份協處理器的標準通信框架。OpenAMP 提供用于開發 AMP 系統軟件應用程序所需的軟件組件,它允許操作系統在各種復雜的同構和異構結構中交互,并允許不對稱的多處理應用程序利用多核配置提供并行性。在 STM32MP1 系列中,A7 和 M4 兩個核心的通信是通過底層的 IPCC 控制器進行,軟件層使用 RPMsg 框架與用戶進行交互。
IPCC
處理器間通信控制器 (IPCC) 用于兩個處理器之間的數據交換。它提供了一種非阻塞的信號機制,以原子方式發布和檢索信息。IPCC 外設提供了硬件支持來管理兩個處理器之間的通信,每個處理器都擁有特定的寄存器庫和中斷。IPCC 為內核間的通信提供了硬件基礎。
STM32MP1 使用 IPCC 外設進行處理器間通信,配置如下:
IPCC 處理器 1 接口被分配到 ARM Cortex-A7 不安全上下文,由 Linux 郵箱框架進行處理
IPCC 處理器 2 接口被分配到 ARM Cortex-M4 上下文,由 IPCC HAL 驅動程序進行處理
REMOTEPROC
遠程處理器框架(remoteproc)的主要作用作用是對遠程從處理器進行生命周期的管理,啟動和停止遠程處理器。在 STM32MP157 中,當系統啟動時,A7 核會被先啟動,然后借助于 Linux RemoteProc 框架加載 M4 固件,啟動 M4 內核代碼。
RPMsg
Remoteproc 框架實現了對遠程處理器生命周期的管理,RPMsg 框架則實現了對遠程處理器的信息傳遞。
Linux RPMsg (Remote Processor Messaging)框架是在 virtio 框架上實現的信息傳遞機制,以便與遠程處理器進行通信,它基于 virtio vrings 通過共享內存發送、接收來自遠程處理器的消息。
vrings 是單向的,一個 vring 專門用于發送消息到遠程處理器,另外一個 vring 用于接收來自遠程服務器的消息。消息服務基于共享內存,共享內存(shared memory)是在兩個處理器都具有訪問權限的內存空間中創建的;信號通知(mailbox)服務基于內部 IPCC。
編譯&運行
生成 ELF 文件
在 rt-thread/bsp/stm32/stm32mp157a-st-discovery 目錄下打開 env 工具;
輸入 menuconfig,打開 OpenAMP:
配置串口。由于官方默認的程序中 A7 核(OpenSTLinux)需要使用串口 4 ,所以這里修改 M4 核(RT-Thread)的調試串口為 UART3:
保存配置,輸入命令 scons --target=iar 生成 IAR 工程。
打開 IAR 工程。編譯,生成 ELF 文件:
KEIL 的操作和上面 IAR 的操作是一樣的,只不過 KEIL 生成的是 axf 文件,一樣可以正常使用。
加載 ELF 文件
設置 Boot mode 為 SD card on SDMMC1 模式,復位開發板:
等待系統初始化完成,輸入命令ifconfig獲取開發板 IP 地址;
使用 ssh 工具連接開發板:
上傳 ELF 文件:
連接串口3,作為 M4 核(RT-Thread OS)調試串口:
使用 Linux Remoteproc 框架加載 Cortex-M4 固件,啟動 Cortex-M4 內核:
mv /tmp/RT-Thread-STM32MP1_CM4.elf /lib/firmware/echo RT-Thread-STM32MP1_CM4.elf > /sys/class/remoteproc/remoteproc0/firmwareecho start > /sys/class/remoteproc/remoteproc0/state
啟動 OpenAMP
在 RT-Thread 終端輸入命令 console set openamp 切換 RT-Thread console 設備為 openamp:
在 Linux 終端輸入以下命令:
stty-onlcr-echo-F/dev/ttyRPMSG0cat/dev/ttyRPMSG0&
在 Linux 終輸入命令進行驗證:
完整操作流程
結語
STM32MP1 作為 ST 推出的第一顆支持 Linux 系統的 MPU,依托于 STM32 成熟的生態系統(STM32CubeMX、STM32Cube Programmer),用戶可以快速的進行開發,驗證。非對稱多處理器架構雖然目前在嵌入式領域還不是主流,但未來肯定是趨勢。通過 Linux 與 RT-Thread 操作系統的結合,可以很輕松的開發多場景應用,如工業、家居、消費品、物聯網、衛生和健康等領域。期待未來 RT-Smart 和 RT-Thread 能同時運行在非對稱多處理器上。
本文作者為RT-Thread論壇用戶「Papalymo」在此特別鳴謝
-
處理器
+關注
關注
68文章
19390瀏覽量
230597 -
嵌入式
+關注
關注
5089文章
19161瀏覽量
306651 -
Linux
+關注
關注
87文章
11332瀏覽量
210022 -
STM32
+關注
關注
2270文章
10918瀏覽量
356883 -
RT-Thread
+關注
關注
31文章
1303瀏覽量
40284
發布評論請先 登錄
相關推薦
評論