美文网首页RTOS和GUI_基于英飞凌tc2x及stm32开发板
Tricore内核MPU保护实战—Apple的学习笔记

Tricore内核MPU保护实战—Apple的学习笔记

作者: applecai | 来源:发表于2023-06-17 12:59 被阅读0次

一,前言

Os基本配置及源码都了解了设计思路及数据流和主要变量,但是我还没有练习下去配置trusted和nontrusted的application,至于MPU保护的需求我是比较清楚的,有8个set可以设置权限及使用地址范围。那么就先不配置os,仅手工设置寄存器使用下,看看无板仿真是否可行。

二,遇到问题

  1. 初始化一开始直接使能SYSCON.PROTEN,然后就进入了trap的函数,然后代码都无法执行了。
    答:看了PSW当前使用的是set0,然后了看了set0对应的地址范围都是0,所以应该是可执行保存错误导致的trap,说明初始化使能内存保护前,需要先设置可执行代码的地址范围为全部。然后依然进入trap,trap中的汇编走几步又进入trap像是死循环,原因是里面有为地址赋值,于是初始化还要设置地址范围为可写,我仅设置了0x7000000的ram段,接着这个问题解决了,全速跑后,发现stm寄存器赋值语句会进入trap,因为stm寄存器也是个地址,范围是0xF开头的,所以我把data可读写范围改成0xFFFFF000。然后能正常全速运行了。
  2. 添加代码来模拟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值也符合预期。


image.png

四,小结

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

相关文章

网友评论

    本文标题:Tricore内核MPU保护实战—Apple的学习笔记

    本文链接:https://www.haomeiwen.com/subject/eqidydtx.html