MPU支持独立区域,重叠等,如下:
内存保护单元 Memory Protection Unit(MPU),找一个HAL库包。
例如我是G4系列开发板:
在STM32Cube_FW_G4_V1.2.0\Projects\NUCLEO-G474RE\Examples\Cortex下打开一个工程测试。
stm32xx_hal_cortex.h文件中 。
void MPU_AccessPermConfig(void)
{
MPU_Region_InitTypeDef MPU_InitStruct;
/* Configure region for PrivilegedReadOnlyArray as REGION N°3, 32byte and R
only in privileged mode */
/* Disable MPU */
//有省略。。。。
/* Enable MPU (any access not covered by any enabled region will cause a fault) */
HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
/* Read from PrivilegedReadOnlyArray. This will not generate error */
(void)PrivilegedReadOnlyArray[0];
/* Uncomment the following line to write to PrivilegedReadOnlyArray. This will
generate error */
//PrivilegedReadOnlyArray[0] = 'e';
}
配置区域仅允许读,不允许写。取消 //PrivilegedReadOnlyArray[0] = 'e'; 注释将会出错。
#define MPU_REGION_NUMBER0 ((uint8_t)0x00)
#define MPU_REGION_NUMBER1 ((uint8_t)0x01)
#define MPU_REGION_NUMBER2 ((uint8_t)0x02)
#define MPU_REGION_NUMBER3 ((uint8_t)0x03)
#define MPU_REGION_NUMBER4 ((uint8_t)0x04)
#define MPU_REGION_NUMBER5 ((uint8_t)0x05)
#define MPU_REGION_NUMBER6 ((uint8_t)0x06)
#define MPU_REGION_NUMBER7 ((uint8_t)0x07)
以上定义: 独立存储区域配置如下。
MPU区域大小配置:更多可以参考源码和programming manual程序设计手册(PM0253)
/** @defgroup CORTEX_MPU_Region_Size CORTEX MPU Region Size
* @{
*/
#define MPU_REGION_SIZE_32B ((uint8_t)0x04)
#define MPU_REGION_SIZE_64B ((uint8_t)0x05)
#define MPU_REGION_SIZE_128B ((uint8_t)0x06)
#define MPU_REGION_SIZE_256B ((uint8_t)0x07)
/* Configure Peripheral region as REGION N°2, 512MB of size, R/W and Execute
Never region */
MPU_InitStruct.BaseAddress = EXAMPLE_PERIPH_ADDRESS_START;
MPU_InitStruct.Size = EXAMPLE_PERIPH_SIZE;
MPU_InitStruct.Number = EXAMPLE_PERIPH_REGION_NUMBER;
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
MPU作用:
阻止用户应用程序破坏操作系统使用的数据。
阻止一个任务访问其它任务的数据区,从而把任务隔开。(类似临界区)
临界区参考【FreeRTOS】FreeRTOS结构
可以把关键数据区设置为只读,从根本上消除了被破坏的可能。