STM32MP1处理器下实现RT-Thread和Linux同时运行

描述

架构说明

本项目以 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」在此特别鸣谢 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分