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.

[参考译文] TMS320F28384D:CM4 MPU

Guru**** 2386610 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1281508/tms320f28384d-the-cm4-mpu

器件型号:TMS320F28384D

您好!

启用 MPU 功能后、可以使用 MPU_CTRL 寄存器的 PRIVDEFENA 位来切换 特权模式和非特权模式、正确吗?

但是,如果我们在未设置  PRIVDEFENA 位的情况下启用 MPU 函数,CM4似乎无法执行应用程序代码,它会分支到 faultISR()。

我的问题是、如何将 CM4应用程序代码分为 特权  模式和非特权模式部分? 还是在 启用 MPU 功能时必须使用 PRIVDEFENA 位?

此致、

卢克

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Luke、您好!

    以下是  ARM 通用用户指南中 PRIVDEFENA 位的定义。

    如果您已启用 MPU 且此位为0、则默认存储器映射将被禁用、用户需要在 MPU 中定义适当的区域才能启用访问、否则会生成故障。

    此致、

    维维克·辛格

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    作者:Vivek、

    默认的存储器映射是什么? 它是项目中的链接器命令文件吗?

    当我将 PRIVDEFENA 位置位后、应用程序代码立即分支到 faultISR、用户如何在 MPU 中定义合适的区域来启用访问? 是否有建议的过程可以做到这一点?

    此致、

    卢克

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Luke、

    默认存储器映射在器件数据表中定义。 当用户启用 MPU 时、存储器映射根据 MPU 设置定义。 使用  PRIVDEFENA 位时、 无论 MPU 设置如何、用户都可以始终为特权软件启用默认的存储器映射。  有很多关于如何设置 MPU 的在线材料可供参考(例如这个- https://blog.feabhas.com/2013/02/setting-up-the-cortex-m34-armv7-m-memory-protection-unit-mpu/)

    维维克·辛格

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    作者:Vivek、

    在我们的示例项目中  MPU_ex1_FAULT_Handling 下面的 NOP 指令可避免重复的故障生成,这意味着应用程序代码将继续发出故障 ISR,而不会发出那些 NOP。

    //
    //添加 NOP 以将执行返回到这些 NOP 中的任何一个,而不是上述 NOP
    //生成故障的语句。 这样做是为了避免重复
    //由于对受保护的存储器执行上述存储器写入操作而生成故障。
    //
    NOP;
    NOP;
    NOP;
    NOP;

    但是、如果我们使用 MPU 函数、 我们不 知道软件何时会违反 MPU 规则并生成故障 ISR、我们不可能提前添加 NOP 并避免重复生成故障。

    请对这种情况提出意见吗?

    此致、

    卢克

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Luke、

    我们需要从根本上避免故障。 我不清楚为什么要在避免故障的同时添加 NOP。 用户需要设置适当的 MPU、以避免这些故障、除非指令尝试访问受保护区域。  

    维维克·辛格

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    作者:Vivek、

    添加 NOP 和注释来自我们的示例、请选中它。

    根据我客户的评估结果、如果他们尝试在主循环中违反 MPU 规则、则不需要 NOP。 不过、如果用户添加的代码违反了 ISR 中的 MPU 规则、则需要执行 NOP、以便应用程序代码能够从 faultISR 返回。

    我们不知道是什么导致了这种差异? 请检查并告知您的评论、感谢您的帮助。

    此致、

    卢克

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Luke、

    让我来咨询我们的软件团队、马上与您联系。

    维维克·辛格

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、 Vivek、

    作为 MPU 示例代码烧断、  

    当  发生非法存储器访问时、 执行 MPU ISR、

    示例代码使用更新栈中的返回地址 来继续 执行代码(返回到非法存储器 访问下一行 )、

    你有没有 建议  MPU ISR 故障处理(没有 NOP, 返回到非法存储器 访问下一行 )?  

    //
    //执行 ISR 后,执行过程将返回到
    //造成了故障,这又导致了另一个故障。
    //更新栈中的返回地址以使处理程序返回
    //添加到示例代码中的任何 NOP 指令。
    //此操作仅用于演示目的。 应用代码
    //应按照要求处理故障。
    //
    asm (" LDR r0、[sp、#0x18]");
    asm ("添加 r0、r0、#4");
    asm (" str r0、[sp、#0x18]");

    此致、

    查汉

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我已经向我们的软件专家介绍过这个问题。 同时、您可以查看有关此主题的在线材料- https://developer.arm.com/documentation/ddi0363/e/level-one-memory-system/fault-handling?lang=en

    此致、

    维维克·辛格