汽车电子与软件

文章数:1511 被阅读:4580472

账号入驻

MPU功能详解-以RH850U2A为例

最新更新时间:2022-11-14
    阅读数:


前言
RH850U2A 芯片是瑞萨公司针对电控类域控制器而发布的一块最新 MCU 芯片,功能及其强大。 本文为 RH850U2A-MPU 功能详解。

1. MPU 功能简述


MPU 保护与当前执行的代码 不相关 的所有数据。 不相关 是相关内存地址的权限受限制,或者是程序访问内存地址的范围于其无关,阻止关键数据被破坏,使嵌入式系统更加健壮与安全。

MPU 作用主要有两个方面 : 为两个保护,一个检测。

1 MPU 的保护作用

指访问区域的保护和读写区域的保护。

访问区域的保护。

可以将内存区域划为特权区域和普通区域,特权区域只有特权用户才能访问,普通用户被禁止访问,以此来保护特定的数据。

常见的应用场景:
1> 对带系统的来说,可以设置数据,以防止用户应用程序破坏操作系统使用过程中的数据。
2> 隔离任务 , 以防止一个任务访问其他任务的数据。
3> SRAM 或者 RAM 空间定义为不可执行,防止代码注入。

读写区域的保护。

设置指定的区域为只读,可以有效的防止比较关键的数据被错误修改。

2 MPU 的检测功能

指可以检测堆和栈的溢出情况及数组有没有越界。

功能安全中对内存分区 MPU 的相关描述 汽车 ECU 软件是高度模块化的嵌入式软件,其功能实现是可以为非功能安全,和功能安全的 SWC 组合,它们分别拥有不同的 ASIL 安全等级。

根据 ISO26262 ,如果嵌入式软件包含不同 ASIL 等级的 SWC ,要么整个软件工程都需要基于最高安全等级的要求进行开发,需要保证拥有更高安全等级的 SWC 的操作不会受到其他 SWC 的干扰,也即需要做到 FFI(Freedom from interference) 的设计。

基于更低安全等级要求开发的 SWC ,可能会出现错误地访问到更高安全等级 SWC 的内存区域,产生干扰。

为此, SWC 需要运行在不同的内存区域,或者不同的内存分区,来防止类似的内存访问违例。

ISO26262 中,以下内存相关的故障影响被视为 SWC 之间产生干扰的原因:

- 内容损坏
- 读写区域属于另一个 SWC
- 数据不一致
- 栈溢出或栈下溢

要满足上述定义,是 MPU 内存保护的目标, 也可以通过限制对于内存以及内存对应的硬件的访问。

这里的内存分区意味着 :
OS Application 运行在相互保护(不干涉)的内存区域 ,在某一个分区上运行的代码,无法修改另一个分区的内存。

内存分区也可以保护只读内存段(例如代码执行)以及内存对应的硬件。

内存分区和用户 / 特权模式可以保证 SWC 之前互不干扰 —— 即使某一个 SWC 出现了内存相关的故障,也不会对其他软件模块有影响。

如果一个 SWC 运行在用户模式,那么它对 CPU 资源 / 指令的访问也是受限制的。

MPU 微控制器有专用的硬件 即内存保护单元( MPU ),来支持内存分区。

2.RH850内存保护单元架构


RH850U2A 芯片 具有内存保护 / 保护功能,防止对内存数据的错误访问,并控制外围模块的寄存器。 下图 1 显示了内存保护的整体架构。每个可编程核心 ( 总线主机 ) 都有一个内存保护单元 (MPU) ,它定义了软件访问保护。此外,每个资源 ( 总线从设备 ) 都有一个守卫来控制任何总线主设备的访问,包括那些没有 MPU 的,比如 DMA

3.使用RH850U2A的MPU


3.1 RH850U2A MPU 配置过程


1)第一步,配置 MPIDn 寄存器。在使能了 MPU 功能后,哪些硬件模块还可以访问所有的内存保护区域。
2)第二步,配置 MPIDX 寄存器。配置每一个内存保护块的时候,需要先配置 MPIDX 寄存器直没 entry ID
3)第三步,配置 MPLA 寄存器。配置每一个内存保护块的 Minimum 地址。
4)第四步,配置 MPUA 寄存器。配置每一个内存保护块的 Maximum 地址。
5)第五步,配置 MPAT 寄存器。配置每一个内存保护块的 USER/SVP 模式下的可读、可写、可执行的属性。
6)第 6 步,配置 MPM 寄存器。使能 MPU 功能。

3. 2 RH850U2A-MPU 相关寄存器配置使用的指令

使用 void __LDSR(int regID, int selID, unsigned int val);

Note: 什么是寄存器的regID和sellD? -- __LDSR()函数接受一个32位整数参数(作为它的最后一个参数),并将其存储到系统寄存器中,与它的第一个参数指定的数字相对应,该参数必须立即是一个常量。在RH850和以后的处理器上,它还需要另一个参数,该参数指定寄存器组号,它必须立即是一个常量。简单来讲regID就是寄存器ID,sellD就是寄存器所在的组ID。


3.3 配置 MPID 寄存器


MPID 寄存器配置哪一些模块可以直接访问内存保护区域。


下表记录了有哪些 SPID可以配置为直接访问内存保护区域


示例: __LDRS(24, 5, 0) //CPU0 可以访问保护区域

3.4 配置 MPIDX 寄存器


每一个内存保护块都有一个 IDX (最多 32 个, 0-31 ),在配置每一个内存保护块的访问属性的时候,首先要配置 MPIDX 寄存器


示例: __LDRS(16,5,0); // 通过 MPIDX 寄存器配置第一个 entry IDX

3.5 配置 MPLA 寄存器


MPLA配置当前内存保护块(MPIDX == 0-31)的起始地址(Minimum Address)


示例: __LDRX(20,5, 0x00007F00);

3.6 配置 MPUA寄存器


MPLA配置当前内存保护块(MPIDX == 0-31)结束地址(Maximum Address)

示例: __LDRS(20,5,0x00017FFC);


3.7 配置 MPAT寄存器


MPAT寄存器配置每一个内存保护块的访问属性(user模式下的可读UR、可写UW、可执行UX; supervisor模式下的可读SR、可写SW、可执行SX)

3.8 配置 MPM 寄存器

使能( Enable)MPU功能

4. 内存保护单元 MPU 异常提示信息


4.1 MDP/MIP Exception


产生内存保护后会产生 MIP/MDP Exception (异常中断地址偏移, 0x90 ,如果我们设置 EBASE 0x00080000 ,那么异常中断的绝对地址就是 0x00080090 )。

在MIP/MDP Exception的异常中断处理函数汇总一般会条用_Os_Abort触发OS调用ShutdownHook函数,在这个函数里面我们可以做一些故障信息保存动作。

4.2 MEA MEI 寄存器


产生了MIP/MDP异常之后,MEA寄存器会存储异常地址,MEI寄存器会存储异常指令。


5. 总结


本文介绍了 MPU 的基本原理,以及结合 RH850U2A 芯片详细介绍了 MPU 的配置使用过程,同时介绍了 MPU 保护功能产生后如何去识别异常信息。 MPU 在实际项目功能中非常的有用,如果使能了 MPU ,同时能通过有效的方法记录 MPU 异常中断时的 MEI/MEA 寄存器的信息,那么在发生了异常复位后就能通过历史信息来定位复位的 SWC (实际项目中不可能一直都有仿真的机会,所以这个功能非常的重要)。

Note: MPU 的配置及使能一般都是在 EcuM_Init 之前完成。


参考文献:
1. https://www.sohu.com/a/544980280_560178
2.RH850/U2A-EVA Group: User’s Manual: Hardware
3.RH850/U2A-EVA Group: Safety Application Note


汽车电子与软件" data-pluginname="mpprofile" data-signature="每天分享一篇技术文章!">


 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: TI培训

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved