当前位置: 首页 > news >正文

第 3 章:RIF 资源隔离框架实战——划分多核“领土”

在上一章中,我们搭建好了环境并成功生成了镜像。但如果你现在直接尝试操作硬件,系统很可能会立即进入HardFault

为什么?因为 STM32MP257 引入了全新的RIF (Resource Isolation Framework)。在 MP257 的世界里,硬件资源(GPIO、UART、DMA、DDR)不再是“公共厕所”,而是被严格划分为不同的“领地”。如果 M33 核想要操作 UART7,它必须首先在 RIF 控制器中声明对 UART7 的所有权。


3.1 什么是 RIF?(三个核心要素)

RIF 的设计初衷是为了防止多核环境下资源的非法访问。它由三个子模块组成:

  1. RISCF (Resource Isolation Smart Configuration Framework):负责外设(如 I2C、UART)的访问过滤。

  2. RIMC (Resource Isolation Master Controller):管理总线主设备(如 DMA、CPU)的身份属性。

  3. RISAF (Resource Isolation Smart Address Filtering):负责内存(DRAM/SRAM)的区域切分。

实战规则:每个外设都有一个CID (Context ID)。M33 核通常对应CID1,A35 核对应CID2


3.2 关键寄存器:RISCF 配置

要让 M33 控制 UART7 和 I2C2,我们需要配置 RISCF 的配置寄存器。

  • 寄存器:RIF_RISCF_PERx_PRIVCFGR(特权配置)

  • 寄存器:RIF_RISCF_PERx_CIDCFGR(CID 分配配置)

实战逻辑: 我们将 UART7 分配给CID1 (M33),并设置为**非安全(Non-secure)特权(Privileged)**模式。


3.3 实战代码:RIF 初始化函数

main.c运行之前,我们需要执行一段“圈地”代码。

#include "stm32mp2xx_hal.h"

/**
* @brief RIF 初始化:为 M33 核划拨外设所有权
* @note 该函数必须在所有外设初始化之前调用
*/
void RIF_Init_M33_Ownership(void) {
// 1. 开启 RIF 控制器的时钟
__HAL_RCC_RIF_CLK_ENABLE();

/* --- 配置 UART7 (调试输出) --- */
// 允许 CID1 (M33) 静态拥有该外设
// RIF_RISCF_UART7_CIDCFGR: SCID = 1 (CID1), CONF = 1 (Static)
RIF_RISCF_UART7->CIDCFGR = (1 << RIF_RISCF_CIDCFGR_SCID_Pos) | RIF_RISCF_CIDCFGR_CONF;
// 设置为特权模式,允许非安全访问(方便后续 Linux 调试,虽然此时 Linux 还没跑)
RIF_RISCF_UART7->PRIVCFGR = RIF_RISCF_PRIVCFGR_PRIV;

/* --- 配置 I2C2 (IMU 读取) --- */
RIF_RISCF_I2C2->CIDCFGR = (1 << RIF_RISCF_CIDCFGR_SCID_Pos) | RIF_RISCF_CIDCFGR_CONF;
RIF_RISCF_I2C2->PRIVCFGR = RIF_RISCF_PRIVCFGR_PRIV;

/* --- 配置 GPIOZ (LED 控制,GPIOZ 归属 M33 安全域) --- */
// GPIOZ 是比较特殊的,它通常与 TrustZone 紧密结合
RIF_RISCF_GPIOZ->CIDCFGR = (1 << RIF_RISCF_CIDCFGR_SCID_Pos) | RIF_RISCF_CIDCFGR_CONF;
}

3.4 难点:总线主设备 RIMC 配置

仅仅给外设所有权是不够的。如果 M33 使用GPDMA去读取 I2C 数据,你还需要配置RIMC,告诉系统:这个 DMA 通道现在代表 M33 (CID1) 发起请求。

如果不配置 RIMC,DMA 发起的总线访问会被拦截,导致总线错误中断。

void RIMC_Config_DMA_For_M33(void) {
// 将 GPDMA1 的通道 0 分配给 CID1
// 这样当 M33 触发 DMA 时,总线认为这是合法请求
RIF_RIMC_GPDMA1_CH0->CIDCFGR = (1 << RIF_RIMC_CIDCFGR_SCID_Pos);
}

3.5 内存隔离:防止 A35 误杀

在后续 Linux 启动后,我们要防止 Linux 的内存管理系统(MMU)把 M33 正在使用的 SRAM 给“回收”了。

  • 实战操作:在 M33 的 RIF 初始化中,通过RISAFSRAM1的一部分标记为CID1 独占

  • 这样即使 Linux 运行了rm -rf /或者内核驱动跑飞,它也绝对无法修改 M33 的内存区域。这正是 MP257 工业级可靠性的核心。


3.6 验证 RIF 配置

  1. 故意不配置 RIF:尝试直接写UART7->TDR = 'A',你会发现程序死在了BusFault_Handler

  2. 正确配置后:程序正常向下运行。

  3. Debug 查看:使用 STM32CubeIDE 的SFR视图,找到RIF节点,实时检查CIDCFGR寄存器的值是否为0x00000003(CID1 + Static)。


3.7 避坑指南 (Debug Tips)

  • 致命陷阱:RIF 配置具有“先入为主”的特性。如果在 ROM 代码阶段已经把某个资源锁死给了 A35,M33 是改不动的。

  • 解决方案:确保你修改的是fsbl阶段的代码,或者在启动的最早期(SystemInit)就接管 RIF。

  • 引脚复用:RIF 不仅控制外设,还控制引脚。如果 RIF 没分给 M33,你连引脚的 AF(复用模式)都改不了。


总结:本章我们完成了最枯燥但最重要的“主权声明”。现在 M33 已经合法拥有了 UART7、I2C2 和 GPIO 的控制权。

http://www.jsqmd.com/news/393042/

相关文章:

  • 第 4 章:串口驱动进阶——GPDMA + Idle 中断实现变长数据流接收
  • SpringBoot+Vue MES生产制造执行系统管理平台源码【适合毕设/课设/学习】Java+MySQL
  • 企业级web汽车销售系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • 2026年太原小店区优质日托班深度评测与选择指南 - 2026年企业推荐榜
  • 【2025最新】基于SpringBoot+Vue的安康学院新型冠状病毒肺炎疫情防控专题网站管理系统源码+MyBatis+MySQL
  • 【2025最新】基于SpringBoot+Vue的社团服务系统管理系统源码+MyBatis+MySQL
  • AI原生应用性能优化:上下文窗口缓存策略全解析
  • 编写高性能 Java 代码的最佳实践
  • MySQL索引优化:B+树原理与实战技巧
  • 如果再写 for 循环,我就锤自己!
  • Java SpringBoot+Vue3+MyBatis 社团服务系统系统源码|前后端分离+MySQL数据库
  • Kafka 副本机制
  • 【2025最新】基于SpringBoot+Vue的Web教师个人成果管理系统管理系统源码+MyBatis+MySQL
  • C++学习(3)(if 字符串 枚举类型)
  • 未来之窗昭和仙君(七十五)未来之窗硬件交互等到进程对话框—东方仙盟练气
  • SpringBoot2.x 官方推荐缓存框架-Caffeine高性能设计剖析
  • 前后端分离精品水果线上销售网站系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • 拥抱 Java 8 并行流:执行速度飞起
  • 【毕业设计】SpringBoot+Vue+MySQL 安康学院新型冠状病毒肺炎疫情防控专题网站平台源码+数据库+论文+部署文档
  • SpringBoot+Vue 企业信息管理系统管理平台源码【适合毕设/课设/学习】Java+MySQL
  • Java SpringBoot+Vue3+MyBatis 小区物业智能卡管理设计与实现系统源码|前后端分离+MySQL数据库
  • 深入探讨OpenOCD与J-Link的动态链接问题
  • 阜阳智能伸缩门定制指南:2026年Q1优选厂商深度解析 - 2026年企业推荐榜
  • 时间序列数据的两年平均分析
  • 盘点开发中那些常用的 MySQL 优化
  • 深入解析Excel季度数据汇总
  • 深入探讨Solidity编译器的元数据差异
  • SpringBoot+Vue 无人超市管理系统管理平台源码【适合毕设/课设/学习】Java+MySQL
  • 2026年阜阳软床供应商综合实力深度解析与推荐 - 2026年企业推荐榜
  • 基于SpringBoot+Vue的Web教师个人成果管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】