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