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.

[参考译文] TMS570LS3137-EP:FreeRTOS:配置 MPU

Guru**** 2553260 points
Other Parts Discussed in Thread: HALCOGEN, TMS570LS3137

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/823564/tms570ls3137-ep-freertos-configuring-mpu

器件型号:TMS570LS3137-EP
主题中讨论的其他器件:HALCOGENTMS570LS3137

您好!

我将 TMS570LS3137与 FreeRTOS 配合使用(代码在 HALCoGen 中创建)。 我还使用 SPI 和闪存。 我可以在 FreeRTOS 调度程序启动之前初始化 SPI 或读取/写入闪存。 但是、在调度程序启动后、我无法初始化 SPI 或读取/写入闪存。 这是因为在 vTaskStartScheduler()->xPortStartScheduler()->prvSetupDefaultMPU()中重新配置了 MPU。 到目前为止、我找到了2个解决方案:

-Edit os_mpu_wrappers.c、这样您就可以编写禁用和启用 MPU 的函数、并在用户模式和专用模式之间切换;以及在关键操作之前和之后使用这些函数。

-Edit prvSetupDefaultMPU(),以便配置哪些区域可以在用户模式下访问。

现在、我将重点介绍第二种解决方案、并将 portPRIVILIGED_FLASH_REGION 设置为 portMPU_PRIV_RW_USER_RW_EXEC、而不是 portMPU_PRIV_RO_USER_NA_EXEC、我可以使用 ti_FEE 读取/写入闪存。 但是、我无法处理 SPI 初始化、我认为这不是一个很好的解决方案、因为内核代码也在闪存中、可能会被损坏。

我该怎么做? 感谢您的任何帮助。

此致、

Mary Jane

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

    您好、Mary、

    让我先尝试一下、看看我得到了什么。

    雷克斯

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

    尊敬的 Rex:

    谢谢、我正在等待您的回答。

    Mary Jane

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

    您好、Mary、

    很抱歉、回答很慢。 我需要与一名同事合作、他可以访问硬件、但正在出差。

    我看了您的配置、 您已将 portPRIVILIGED_FLASH_REGION 配置为 portMPU_PRIV_RO_USER_NA_EXEC、这是用户模式无法访问的。 它是否应为 PRIV_RO_USER_RO_EXEC、只读用户模式?

    雷克斯

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

    尊敬的 Rex:

    我想我解释得不好。 portPRIVILIGED_FLASH_REGION  已配置为 portMPU_PRIV_RO_USER_NA_EXEC、当我将其更改为 portMPU_PRIV_RW_USER_RW_EXEC 时、读取和写入闪存正常;这意味着您正确、但这不是问题。

    问题是 SPI。 我尝试在 prvSetupDefaultMPU()中将所有访问级别更改为 portMPU_PRIV_RW_USER_RW_EXEC,但仍然不起作用。 无法初始化 SPI。

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

    大家好、Mary Jane、

    是否有可能在其他地方覆盖配置? 在我看来 ,vPortStoreTaskMPUSettings()也设置了 MPU 区域的属性,它在 OS_TASKS.c 的2个位置被调用 您认为它可能会更改设置吗?

    雷克斯

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

    尊敬的 Rex:

    我明白你的观点。 是的, vPortStoreTaskMPUSettings()在 os_tasks.c 的2个位置调用,其中一个实际上在运行时调用(在 xTaskCreate 中)。 如果我正确的话、每个任务都有其自己的 MPU 设置。 如果未传递 MPU 设置,则在 vPortStoreTaskMPUSettings()中应用默认的 MPU 设置。 直到这里、一切都正常、但我不知道 MPU 区域以及如何正确配置它们。 此外、HALCoGen 和 FreeRTOS 还为 MPU 区域提供了不同的接口。

    您能否像 vPortStoreTaskMPUSettings()一样为我提供正确的闪存和 SPI 设置?

    Mary Jane

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

    Mary Jane、

    从代码中可以看到、区域0和区域1将 RAM 配置为0x08000000。 其余区域使用基址0 (闪存)、大小0和属性0进行配置。 您应该尝试使用正确的属性配置下一个区域、并查看它是否适合您。

    在调度程序启动且无法访问闪存后、可以查看何时可以访问闪存的 CP15 MPU 寄存器值与 CP15 MPU 寄存器的值进行比较。 我认为它们应该具有相同的价值。 有关 MPU 属性、请参阅 ARM R4 TRM 、http://infocenter.arm.com/help/topic/com.arm.doc.ddi0363e/DDI0363E_cortexr4_r1p3_trm.pdf

    雷克斯