一,前言
Os基本配置及源码都了解了设计思路及数据流和主要变量,但是我还没有练习下去配置trusted和nontrusted的application,至于MPU保护的需求我是比较清楚的,有8个set可以设置权限及使用地址范围。那么就先不配置os,仅手工设置寄存器使用下,看看无板仿真是否可行。
二,遇到问题
- 初始化一开始直接使能SYSCON.PROTEN,然后就进入了trap的函数,然后代码都无法执行了。
答:看了PSW当前使用的是set0,然后了看了set0对应的地址范围都是0,所以应该是可执行保存错误导致的trap,说明初始化使能内存保护前,需要先设置可执行代码的地址范围为全部。然后依然进入trap,trap中的汇编走几步又进入trap像是死循环,原因是里面有为地址赋值,于是初始化还要设置地址范围为可写,我仅设置了0x7000000的ram段,接着这个问题解决了,全速跑后,发现stm寄存器赋值语句会进入trap,因为stm寄存器也是个地址,范围是0xF开头的,所以我把data可读写范围改成0xFFFFF000。然后能正常全速运行了。 - 添加代码来模拟trusted的task和nontrusted task,应该如何设计。
答:应该怎么设计才简便模拟呢,psw中一直是set,我也不想进行切换,怕影响os,那么就改地址范围吧,假定Task_core0_10msA是trusted task,其它4个都不是,PreTaskHook中判断是Task_core0_10msA绑定到set0可写地址范围最大值就是0xFFFFFFFE8,而其它task的可写最大地址范围为初始化值0xFFFFF000。
FUNC(void, OS_CALLOUT_CODE) PreTaskHook(void)
{
TaskType CurrentTaskID;
/* Pass a TaskRefType for the return value of GetTaskID) */
GetTaskID(&CurrentTaskID);
if (CurrentTaskID == Task_core0_10msA) {
__mtcr(0xC004, (0xFFFFFFFE8)); /* DPR0_U */
}
else
{
__mtcr(0xC004, (0xFFFFFF000)); /* DPR0_U */
}
}
三,实际测试通过
trusted task中0xFFFFF104在可写数据范围内,所以可以正常写入值2。在nontrusted task中为超出范围的0xFFFFF104写值1,都无法写入,直接进入trap然后调用os_shutdownOS。
而且trap报错class和tin值也符合预期。

四,小结
主要验证了我做的工程能正常进入trap,最后调用shutdownOS的条路径,而且也验证了trace32 sim仿真的时候可以进入trap异常中断。另外实验了MPU来仿真trusted和nontrust的应用,这是比application更小的task级别的颗粒度,也验证了我对MPU寄存器的理解。目的达成,over。
网友评论