This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMSC6746芯片的MPU保护单元寄存器使用

Other Parts Discussed in Thread: SYSBIOS

 各位大神:

  目前我们项目急需要用MPU保护单元做内存保护

我尝试过先设置好MPPA寄存器为管理员权限只读不写(值为0x003FFEE7),这时候我再去改写保护的DDR,会产生死机

但是如果我在之前先操作保护的DDR,再去修改寄存器的配置为只读不写,这时候再去写保护的DDR,这个时候又没有产生死机,

这是为何呢?

我这边有个需求是程序在运行过程中需要实时调整权限,所以需要在某种情况下改变寄存器控制

请帮忙看看,谢谢

  • 请先测试一下帖子中提供的mpu test工程,看是否能解决问题。
    e2e.ti.com/.../1098969
  • 你好 nancy:
    我没有找到C6748_mpuTest.zip这个文件,能否贴到这个帖子里面 万分感谢~
  • hello Nancy:
    我找到了一个工程3301.MPU_Test,里面有个源码,但是有extern一个函数,我将该源文件放到自己的工程下会编译不过,帮忙看下?
    extern void intcVectorTable(void);
  • Hello Nancy:

    我将源文件移植到自己的主工程下测试结果如图,看起来这些配置没有起作用,跟我自己的代码测试结果一致,请问下原因可能是啥呢?

    我这边尝试解决下

  •  这是我用开发板测试的结果。

  • Hi Nancy:

    之前的图片是我将源文件附在我的工程里面仿真的结果(为了编译成功屏蔽了中断函数),下面的图片是直接将你提供的工程加载到我的开发板中运行的结果

    我的开发板是C6746,看结果对于L1、L2的保护起到了作用,但是对于DDR的保护没有起作用,目前看起来与你的对比结果应该是硬件不同,请问硬件上需要注意

    什么呢?万分感谢~

  • Hi Nancy:
    为了验证您提供的软件没有问题,我也拿了自己购买的C6748开发板进行仿真,结果是L1/L2/DDR均能被保护,跟您的结果一致;
    所以我猜想是否和DDR周边的电路有关系,麻烦你那边给出一些必要的连接条件才能使能保护单元,我这边也尝试跟硬件那边分析下该问题

    万分感谢~
  • 硬件发面可以参考这个链接看看。
    processors.wiki.ti.com/.../OMAP-L138_Hardware_Design_Guide
    软件方面参考这个帖子的总结看看:
    e2e.ti.com/.../291838
  • Hi Nancy:

    目前我已经把你发的链接给到硬件参考

    但是我这边还是很疑惑,你那边能否提供一些线索我们排查

    现在看,同一个软件工程(您提供的)在C6746芯片上(晶振为18.432)只对L1、L2起保护,对外部的镁光DDR不起保护作用

    但是在我自己买的开发板上(C6748 晶振为24Mhz)就可以对外部镁光DDR起保护作用

    是否和芯片或是晶振有关?

  • HI Nancy:
    我有一个疑问,我看demo程序没有对DDR做任何初始化的操作,是否跟这个有关系?是否需要操作下DDR的哪些配置才能生效?
  • Hi Nancy:

                       我修改代码将on-chip RAM修改为L2 RAM,这样的话发现L2没法儿做保护,请问下 你有这么尝试过么

    是否有问题?

  •  DDR的初始化是在GEL文件中配置的,所以demo程序里没有。

  • 用创龙demo板的mpu用例程序:
    1、将这个程序在demo板上跑,mpu1(保护的地址是on-chip RAM)和mpu2都能起效
    2、将这个程序在我们的板子上跑,如果mpu1保护的地址是L2RAM,mpu1不起效
    如果mpu1保护的地址是on-chip RAM,mpu1能起效
    mpu2不起效
    所以能否能否抽空帮忙解答一下,为什么同样的程序,在创龙的demo板上跑是ok的,在我们的板子上跑就异常,mpu对硬件有什么要求吗?或者对DDR配置有什么要求吗?需要初始化吗?
  • 我仿真的时候加载了GEL文件进行DDR初始化,还是一样不能够起到保护DDR作用,请问还有其他测试手段分析么
  • 这跟板子能有什么关系。

    你自己的板子,DDR size是多大?可以将MPU2_REGION_START_ADDR改到DDR开头的地址。

    你可以一步一步看寄存器的权限设置是不是设成功了。

    再者,代码中哪一步不对了,还是哪一步都不对?

    // Setup the range we will be working with
    MPU2->PROG_RANGE[0].MPSAR = MPU2_REGION_START_ADDR;
    MPU2->PROG_RANGE[0].MPEAR = MPU2_REGION_START_ADDR + MPU2_REGION_SIZE - 1;

    // Write a known value to the memory
    *pData = 0x0BADBEEF;
    printf("FULL ACCESS: Value wrote to memory = 0x%08X\n",0x0BADBEEF);
    printf("FULL ACCESS: Value read from memory = 0x%08X\n",*pData);

    // Restrict read/write/execute access for all AIDs
    MPU2->PROG_RANGE[0].MPPA = 0x03FFFEC0;
    *pData = 0x76543210;
    printf("NO ACCESS: Value wrote to memory = 0x%08X\n",0x76543210);
    printf("NO ACCESS: Value read from memory = 0x%08X\n",*pData);

    // Restrict write/execute access, only allow read access for all AIDs
    MPU2->PROG_RANGE[0].MPPA = 0x03FFFEE4;
    *pData = 0x01234567;
    printf("READ-ONLY ACCESS: Value wrote to memory = 0x%08X\n",0x01234567);
    printf("READ-ONLY ACCESS: Value read from memory = 0x%08X\n",*pData);

    // Restrict read/execute access, only allow write access for all AIDs
    MPU2->PROG_RANGE[0].MPPA = 0x03FFFED2;
    *pData = 0xA5A50F0F;
    printf("WRITE-ONLY ACCESS: Value wrote to memory = 0x%08X\n",0xA5A50F0F);
    printf("WRITE-ONLY ACCESS: Value read from memory = 0x%08X\n",*pData);

    // Setup Region 1 to allow read/write access for all AIDs (but no execute)
    MPU2->PROG_RANGE[0].MPPA = 0x03FFFEF6;
    printf("READ/WRITE ACCESS: Value read from memory = 0x%08X\n",*pData);

  • 1.DDR是64M
    2.MPU2_REGION_START_ADDR设置过开头地址,没有作用
    3.每一步的权限设置都没有起作用,但是寄存器的值设置进去了
  • 你程序里面应该没有开启cache吧?只是测试了demo程序对吗?

  • 我在boot下是没有开启cache的,在主机下(带有sysbios操作系统)是有cache的,所以应该和cache有关系
    但是我把DDR的MAR设置为0,会有什么影响吗?
    能提供一些cache的资料吗?
    万分感谢
  • 因为开启了Cache,而且应该是该访问的地址在前面已经被CPU访问过,所以在配置完MPU后再访问这个地址时,CPU先从CACHE检查这个地址是否已被CACHE,如果在CACHE,则直接从CACHE取值,不会进一步访问DDR,所以不会触发MPU的保护检查。

    可以试一下:在使能MPU后,对CACHE做一次invalid操作,即将CACHE清除,后面的内存访问将会先直接访问物理内存。

    不使能MARn的后果,即在访问对应的内存空间时,不会被CACHE.

    一个MARn对应16MByte空间的内存CACHE属性

    Cache说明参阅这个文档:http://www.ti.com/lit/ug/sprufk5a/sprufk5a.pdf

    Cache user guide: http://www.ti.com/lit/ug/sprug82a/sprug82a.pdf

    BIOS Cache API见C:\ti\bios_6_52_00_12\docs\Bios_User_Guide.pdf

    Cache_inv(blockPtr, byteCnt, type, wait); Invalidates the specified range of memory. When you
    invalidate a cache line, its contents are discarded and the cache tags the line as "clean" so that next
    time that particular address is read, it is obtained from external memory. All lines in the range are
    invalidated in all caches.