在STM32 F767关于内存保护(MPU)的例程中,有一个参数AP提出来
特权级下的许可,用户级下的许可
程序源码:
//MPU 的详细设置关系,请看:《STM32F7 编程手册.pdf》
//这个文档的 4.6 节,Table 89.
//MPU 保护区域许可属性定义(拷贝自 stm32f7xx_hal_cortex.h)
//定义 MPU->RASR 寄存器 AP[26:24]位的设置值
#define MPU_REGION_NO_ACCESS 0x00 //无访问(特权&用户都不可访问)
#define MPU_REGION_PRIV_RW 0x01 //仅支持特权读写访问
#define MPU_REGION_PRIV_RW_URO 0x02 //禁止用户写访问(特权可读写)
#define MPU_REGION_FULL_ACCESS 0x03 //全访问(特权&用户都可访问)
#define MPU_REGION_PRIV_RO 0x05 //仅支持特权读访问
#define MPU_REGION_PRIV_RO_URO 0x06 //只读(特权&用户都不可以写)
//设置某个区域的 MPU 保护
//baseaddr:MPU 保护区域的基址(首地址)
//size:MPU 保护区域的大小(必须是 32 的倍数,单位为字节)
//rnum:MPU 保护区编号,范围:0~7,最大支持 8 个保护区域
//ap:访问权限,访问关系如下:
//0,无访问(特权&用户都不可访问)
//1,仅支持特权读写访问
//2,禁止用户写访问(特权可读写访问)
//3,全访问(特权&用户都可访问)
//4,无法预测(禁止设置为 4!!!)
//5,仅支持特权读访问
//6,只读(特权&用户都不可以写)
//详见: STM32F7 编程手册.pdf,4.6 节,Table 89.
//sen:是否允许共用;0,不允许;1,允许
//cen:是否允许 cache;0,不允许;1,允许
//ben:是否允许缓冲;0,不允许;1,允许
//返回值;0,成功.
// 其他,错误.
u8 MPU_Set_Protection(u32 baseaddr,u32 size,u32 rnum,u8 ap,u8 sen,u8 cen,u8 ben)
{
u32 tempreg=0;
u8 rnr=0;
if((size%32)||size==0)return 1; //大小不是32的倍数,或者size为0,说明参数错误
rnr=MPU_Convert_Bytes_To_POT(size)-1;//转换为 2 为底的指数值
MPU_Disable(); //设置之前,先禁止 MPU 保护
MPU->RNR=rnum; //设置保护区域
MPU->RBAR=baseaddr; //设置基址
tempreg|=0<<28; //允许指令访问(允许读取指令)
tempreg|=((u32)ap)<<24; //设置访问权限,
tempreg|=0<<19; //设置类型扩展域为 level0
tempreg|=((u32)sen)<<18; //是否允许共用
tempreg|=((u32)cen)<<17; //是否允许 cache
tempreg|=((u32)ben)<<16; //是否允许缓冲
tempreg|=0<<8; //禁止子区域
tempreg|=rnr<<1; //设置保护区域大小
tempreg|=1<<0; //使能该保护区域
MPU->RASR=tempreg; //设置 RASR 寄存器
MPU_Enable(); //设置完毕,使能 MPU 保护
return 0;
}
问题是:
哪些程序是特权级,哪些是用户级的,如何区分?
通过修改此次例程的权限可以发现,当设置为“#define MPU_REGION_PRIV_RW_URO 0x02 //禁止用户写访问(特权可读写)”时,程序不会错误处理中断并重启,意味着现在的程序都是特权级的吗?什么时候是用户级呢?
路过的大神帮助回答一下,谢谢啦
一周热门 更多>