Rice我叫加饭? · 2023年01月03日 · 北京市

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

架构说明

本项目以 STM32MP157A-DK1 为硬件平台。作为能够支持轻松开发更广泛应用的通用微处理器产品线,STM32MP157 系列基于双核Cortex-A7 与 Cortex-M4 组成的异构架构,加强了支持多应用和灵活应用的能力,可以随时实现最佳性能和功率数据。Cortex-A7 内核提供对开源操作系统(Linux/Android)的支持,而 Cortex-M4 内核可以利用 STM32 MCU 的生态系统。本篇文章将介绍如何在 STM32MP157 上运行 RT-Thread OS。

image.png

启动方式

  • 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 外设进行处理器间通信,配置如下:

  1. IPCC 处理器 1 接口被分配到 ARM Cortex-A7 不安全上下文,由 Linux 邮箱框架进行处理
  2. IPCC 处理器 2 接口被分配到 ARM Cortex-M4 上下文,由 IPCC HAL 驱动程序进行处理
    image.png

REMOTEPROC

远程处理器框架(remoteproc)的主要作用作用是对远程从处理器进行生命周期的管理,启动和停止远程处理器。在 STM32MP157 中,当系统启动时,A7 核会被先启动,然后借助于 Linux RemoteProc 框架加载 M4 固件,启动 M4 内核代码。

image.png

RPMsg

  1. Remoteproc 框架实现了对远程处理器生命周期的管理,RPMsg 框架则实现了对远程处理器的信息传递。
  2. Linux RPMsg (Remote Processor Messaging)框架是在 virtio 框架上实现的信息传递机制,以便与远程处理器进行通信,它基于 virtio vrings 通过共享内存发送、接收来自远程处理器的消息。
  3. vrings 是单向的,一个 vring 专门用于发送消息到远程处理器,另外一个 vring 用于接收来自远程服务器的消息。消息服务基于共享内存,共享内存(shared memory)是在两个处理器都具有访问权限的内存空间中创建的;信号通知(mailbox)服务基于内部 IPCC。
    image.png

「讲到这里,给大家推荐一个我前段时间加入的硬创社创作者交流群,这群是由嘉立创搭建的,群里除了可以跟硬件同行们探讨技术外,还有硬件外包需求、招聘需求的分享。」

「我现在做其它项目的时候,也会先到硬创社去看看有没有现成的方案,就不用自己再重复造轮子了。」

「现在在硬创社上传一个项目就有500元的现金补贴,不知道这个补贴什么时候结束。如果你有兴趣也可以上传项目试试看。可以扫描下方二维码进群,成为硬创社创作者交流圈的一员。」

编译&运行

生成 ELF 文件

  1. 在 rt-thread/bsp/stm32/stm32mp157a-st-discovery 目录下打开 env 工具;
  2. 输入 menuconfig,打开 OpenAMP:
    image.png
  3. 配置串口。由于官方默认的程序中 A7 核(OpenSTLinux)需要使用串口 4 ,所以这里修改 M4 核(RT-Thread)的调试串口为 UART3:
    image.png
    image.png

image.png

  1. KEIL 的操作和上面 IAR 的操作是一样的,只不过 KEIL 生成的是 axf 文件,一样可以正常使用。

加载 ELF 文件

  1. 设置 Boot mode 为 SD card on SDMMC1 模式,复位开发板:
  2. 等待系统初始化完成,输入命令ifconfig获取开发板 IP 地址;
  3. 使用 ssh 工具连接开发板:
    image.png
  4. 上传 ELF 文件:
    image.png
  5. 连接串口3,作为 M4 核(RT-Thread OS)调试串口:
    image.png
  6. 使用 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/firmware
echo start > /sys/class/remoteproc/remoteproc0/state

image.png

启动 OpenAMP

  1. 在 RT-Thread 终端输入命令 console set openamp 切换 RT-Thread console 设备为 openamp:
    image.png
  2. 在 Linux 终端输入以下命令:
stty -onlcr -echo -F /dev/ttyRPMSG0
cat /dev/ttyRPMSG0 &
  1. 在 Linux 终输入命令进行验证:
    image.png
  2. 完整操作流程
    image.png

结语

STM32MP1 作为 ST 推出的第一颗支持 Linux 系统的 MPU,依托于 STM32 成熟的生态系统(STM32CubeMX、STM32Cube Programmer),用户可以快速的进行开发,验证。非对称多处理器架构虽然目前在嵌入式领域还不是主流,但未来肯定是趋势。通过 Linux 与 RT-Thread 操作系统的结合,可以很轻松的开发多场景应用,如工业、家居、消费品、物联网、卫生和健康等领域。期待未来 RT-Smart 和 RT-Thread 能同时运行在非对称多处理器上。

版权声明:本文为RT-Thread论坛用户「Papalymo」的原创文章

作者:Rice 嵌入式开发技术分享
文章来源:Rice 嵌入式开发技术分享

推荐阅读

更多嵌入式开发干货请关注 Rice 嵌入式开发技术分享 专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
1761
内容数
51
一个周末很无聊的嵌入式软件工程师,写写经验,写写总结。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息