芯片手册
支持的Feature
- 内存访问控制
- 每种 CPU 运行模式的访问管理
- 使用系统保护标识符(SPID)进行保护
MPU相关寄存器ID
Product information of initial value for G4MH register: 用到了SR0,1
Autosar 配置MPU流程
整体配置流程:
- 设置SC3 OS system
- 配置MPU区域
- 分配MPU区域到MPU
- 分配到Task/App/ISR
- 使用autosar的mem map配置代码位置
- 使用生成的link 文件配置memory 到section
代码理解
autosar 代码配置流程(对应整体流程中的2、3步骤):
- 配置MPIDn寄存器。在使能了MPU功能后,哪些硬件模块还可以访问所有的内存保护区域。
- 配置MPIDX寄存器。配置每一个内存保护块的时候,需要先配置MPIDX寄存器直没entry ID。
- 配置MPLA寄存器。配置每一个内存保护块的Minimum地址。
- 配置MPUA寄存器。配置每一个内存保护块的Maximum地址。
- 配置MPAT寄存器。配置每一个内存保护块的USER/SVP模式下的可读、可写、可执行的属性。
- 配置MPM寄存器。使能MPU功能。
![[Drawing 2024-05-21 15.06.34.excalidraw]]
代码入口:
♾️ path 代码:Components\Os\Implementation\Os_Hal_MemoryProtection.c
Os_Hal_SetMPM
♾️ c 代码:asm void Os_Hal_SetMPM(uint32 value)
{
%reg value
ldsr value, 0, 5
%con value
mov value, r11
ldsr r11, 0, 5
%mem value
ld.w value, r11
ldsr r11, 0, 5
%error
}
autosar中使用ldsr(Load to system register)指令进行赋值操作:
官方手册使用:
♾️ c 代码:void __LDSR(int regID, int selID, unsigned int val);
LDSR可以直接使用立即数赋值
Os_Hal_MpuConfigSwitch
调用 Os_Hal_SetMPUn( n = 0-31 )
举例: Os_Hal_MpuConfigSwitch -> Os_Hal_SetMPU31 -> Os_Hal_SetMPU(31, (Config))
- Os_Hal_SetMPIDX31
- Os_Hal_SetMPLA((Config)->MpuRegion31.RegionStart);
- Os_Hal_SetMPUA((Config)->MpuRegion31.RegionEnd);
- Os_Hal_SetMPAT((Config)->MpuRegion31.RegionAttribute)
Os_Hal_InitMPIDn
MPID寄存器配置哪一些模块可以直接访问内存保护区域
Os_Hal_SetMPURegion0
为stacks配置MPU0 的区域,会覆盖之前配置的MPU区域配置
Os_Hal_Set_MemRegionID
Os_Hal_SyncPipeline
![[GHS编译器同步指令#^fb4e8e]]
Reference
[[TechnicalReference_Os.pdf]]