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.

[参考译文] RM57L843:不可缓存内存区域

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1404861/rm57l843-non-cacheable-memory-region

器件型号:RM57L843
主题中讨论的其他器件:HALCOGEN

工具与软件:

您好!

我刚刚完成了 Halcogen 中的 RM57 MPU 设置。 我想知道如果将 MPU 区域设置为 NORMAL_OINC_SHARED、预期会出现什么行为? Halcogen 说、它会将内存区域设置为不可缓存、但显然不可缓存。 该区域似乎仍被缓存。 有人能说明此设置究竟有什么作用吗?

Ravi

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

    尊敬的 Ravi Teja:

    您能否请参阅以下常见问题解答、了解 MPU 的不同属性:

    (+)[常见问题解答] TMS570LC4357:MPU 设置中的存储器属性、存储器类型和高速缓存策略之间有何差异? -基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    ——
    谢谢、此致、
    Jagadish。

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

    尊敬的 Jagadish:

    我现在感到困惑。 在您共享的线程中、它表示关注类型。

    ———————— -
    不可高速缓存是什么意思?

    每次读取和写入都在主存储器上执行、而不是通过高速缓存。
    ————————

    然而、在上一个线程中、您提到将内存区域设置为 EMAC 缓冲区不可缓存不会产生任何影响、相反、您建议将其标记为可完全写入。 您能解释一下吗? 这就是你在下一个线程中给我安排的

    —————————

    我认为  NORMAL_OINC_SHARED 不会阻止缓存。 我们应该需要将相应的存储器配置为 WRITE Through (WT)。

    —————————

    https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1380009/rm57l843-cannot-start-emac-transmission/5281627#5281627

    Ravi

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

    尊敬的 Ravi:

    抱歉、

    不可缓存也应该可以解决该问题。

    你可以 为我们在旧线程中讨论的 RAM 和描述符存储器尝试此 NORMAL_OINC_SHARED 设置并验证结果吗?

    ——
    谢谢、此致、
    Jagadish。

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

    尊敬的 Jagadish:

    我曾尝试为存储器和描述符使用 NORMAL_OINC_SHARED、但由于某种原因它仍然无法正常工作

    Ravi

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

    尊敬的 Ravi Teja:

    我创建了一个简单示例并测试了此 MPU 配置、但没发现问题。

    实际上、我创建了一个 DMA 存储器到存储器传输示例、在这里、DMA 将数据从 TX_DATA 传输到 RX_DATA:

    1.我第一次测试了禁用的高速缓存和回写分配的配置:

    测试结果如下:

    我们禁用缓存后、可以顺利地将数据从 TX_DATA 接收到 RX_DATA。

    2.现在、我测试了 启用高速缓存和回写已分配的配置:

    测试结果如下:

    即使我收到中断、由于缓存启用、我的 RX_DATA 缓冲区显示为空。 这是因为 DMA 传输发生在后台并且 CPU 不知道这一点、并且可能它显示在缓存数据中全为0。

    3.现在我测试了 启用 缓存和 Nc(不可缓存):

    以下是上述配置的结果:

    现在、我能够再次看到中断和到 RX_DATA 的数据传输。 在我们设置"Non-cache"选项时、CPU 始终尝试显示主存储器中的数据、而不是缓存。

    我随附代码供您参考、您能否对其进行验证并在终端进行测试:

    e2e.ti.com/.../DMA_5F00_Memory_5F00_to_5F00_Memory_5F00_Transfer_5F00_RM57.zip

    ——
    谢谢、此致、
    Jagadish。

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

    尊敬的 Jagadish:

    对于延迟响应、我们深表歉意。 我曾尝试过您建议的 EMAC 设置。 我首先从 Halcogen 创建了一个 RM57 FreeRTOS 源代码。 然后  

    Example_EMAC_FreeRTOS 示例此例、但这次我在 Loopback_Tx 任务中创建和传输数据包。 但是、我在 Rx 缓冲区中没有看到传输的数据。 不过、我可以在禁用高速缓存的情况下接收数据。 我怀疑 halcogen 生成的 FreeRTOS 代码与 halcogen 的 MPU 设置不符。 我似乎不能找到它。 您能看一下吗?  只是为了介绍一些背景信息、我已经将 EMAC DMA 禁用器存储器区域0xFC520000标记为0xFC521FFF、在 MPU 区域8中将 此存储器块标记为不可缓存、并将基址08070000中的64KB 存储器块标记为不可缓存。 内存损坏漏洞(MPU 区域9)的缓解因素。 然后、我在链接器脚本中的 MPU 区域9中分配了"pbuf_array"和"data"缓冲区。
    我已在下面附上源代码。
    谢谢!
    Ravi
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jagadish:

    有任何相关更新?

    Ravi

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

    尊敬的 Ravi Teja:

    由于其他问题、我没有机会再次处理它。

    我目前正在研究这一问题、并将尽快提供我的最新情况。

    在此之前、我想向您简单说明一下:

    我怀疑 halcogen 生成的 FreeRTOS 代码与 halcogen 的 MPU 设置不符。 我似乎不能找到它。 您能看一下吗?

    对于我们在下面的线程中讨论的直写设置(NORMAL_OIWTNOWA_SHARED)、该设置是否可以正常工作?

    (+) RM57L843:无法开始 EMAC 传输-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    ——
    谢谢、此致、
    Jagadish。

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

    NORMAL_OIWTNOWA_SHARED 在 FreeRTOS 任务中不起作用。 它仅在裸机环境中工作。

    我想我找到了罪魁祸首。 在 os_port.c 中、 vPortStoreTaskMPUSettings 会将整个 RAM 配置为 较高 MPU 区域中的 NORMAL_OIWBWA_NONSHARED (从而具有较高的优先级)。 这会覆盖我们在 Halcogen 中进行的所有 MPU 设置。 老实说、不要  在每次 FreeRTOS 任务创建期间配置与 NORMAL_OIWBWA_NONSHARED 相同的 RAM 区域、因为我们可以在 xRegions 定义为 NULL 时的初始化期间配置它一次。 你对此有什么评论吗?

    我指的是这段代码。

    if ( xRegions == NULL )

    /*用户代码 begin (6)*/
    /*用户代码结束*/
    /*未指定 MPU 区、因此允许访问所有 RAM。 */
    xMPUSettings->xRegion[0].ulRegionBaseAddress = 0x08000000;
    xMPUSettings->xRegion[0].ulRegionSize = portmpu_size_512KB | portmpu_region_enable;
    xMPUSettings->xRegion[0].ulRegionAttribute = portMPU_PRIV_rw_user_rw_EXEC | portMPU_NORMAL_OIWBWA_NONSHARED;

    /*只有特权级的 Re 区域作为 xRegion[0]的实例
    刚刚删除了仅特权级参数。 */
    xMPUSettings->xRegion[1].ulRegionBaseAddress = 0x08000000;
    xMPUSettings->xRegion[1].ulRegionSize = portMPU_SIZE_4KB | portMPU_REGION_ENABLE;
    xMPUSettings->xRegion[1].ulRegionAttribute = portMPU_PRIV_rw_user_na_noexec | portMPU_NORMAL_OIWBWA_NONSHARED;

    /*用户代码 begin (7)*/
    /*用户代码结束*/
    /*使所有其他区域无效。 */
    for (ul = 2;ul <= portnum_configurable_regions;ul++)

    xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = 0x00000000UL;
    xMPUSettings->xRegion[ ul ].ulRegionSize = 0UL;
    xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL;
    }
    /*用户代码 begin (8)*/
    /*用户代码结束*/

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

    NORMAL_OIWTNOWA_SHARED 在 FreeRTOS 任务中不起作用。 它仅在裸机环境中工作。

    我想我找到了罪魁祸首。 在 os_port.c 中、 vPortStoreTaskMPUSettings 会将整个 RAM 配置为 较高 MPU 区域中的 NORMAL_OIWBWA_NONSHARED (从而具有较高的优先级)。 这会覆盖我们在 Halcogen 中进行的所有 MPU 设置。 我真的、不明白为什么我们要   在每个 FreeRTOS 任务创建期间将同一个 RAM 区域(当 xRegions 定义为 NULL 时)配置为 NORMAL_OIWBWA_NONSHARED、而我们只能在初始化期间配置它一次。 你对此有什么评论吗?

    我指的是这段代码。

    if ( xRegions == NULL )

    /*用户代码 begin (6)*/
    /*用户代码结束*/
    /*未指定 MPU 区、因此允许访问所有 RAM。 */
    xMPUSettings->xRegion[0].ulRegionBaseAddress = 0x08000000;
    xMPUSettings->xRegion[0].ulRegionSize = portmpu_size_512KB | portmpu_region_enable;
    xMPUSettings->xRegion[0].ulRegionAttribute = portMPU_PRIV_rw_user_rw_EXEC | portMPU_NORMAL_OIWBWA_NONSHARED;

    /*只有特权级的 Re 区域作为 xRegion[0]的实例
    刚刚删除了仅特权级参数。 */
    xMPUSettings->xRegion[1].ulRegionBaseAddress = 0x08000000;
    xMPUSettings->xRegion[1].ulRegionSize = portMPU_SIZE_4KB | portMPU_REGION_ENABLE;
    xMPUSettings->xRegion[1].ulRegionAttribute = portMPU_PRIV_rw_user_na_noexec | portMPU_NORMAL_OIWBWA_NONSHARED;

    /*用户代码 begin (7)*/
    /*用户代码结束*/
    /*使所有其他区域无效。 */
    for (ul = 2;ul <= portnum_configurable_regions;ul++)

    xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = 0x00000000UL;
    xMPUSettings->xRegion[ ul ].ulRegionSize = 0UL;
    xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL;
    }
    /*用户代码 begin (8)*/
    /*用户代码结束*/

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

    尊敬的 Ravi Teja:

    首先,我对延迟响应表示歉意,在这段时间内,我一直在关注其他问题。

    我认为是罪魁祸首。 在 os_port.c 中、 vPortStoreTaskMPUSettings 会将整个 RAM 配置为 较高 MPU 区域中的 NORMAL_OIWBWA_NONSHARED (从而具有较高的优先级)。 这会覆盖我们在 Halcogen 中进行的所有 MPU 设置。

    很高兴听到您找到了问题的根本原因。

    [报价 userid="611851" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1404861/rm57l843-non-cacheable-memory-region/5401360 #5401360"]我不明白为什么我们要   在每次 FreeRTOS 任务创建期间将同一个 RAM 区域(当 xRegions 定义为 NULL 时)配置为 NORMAL_OIWBWA_NONSHARED (当我们只能在初始化期间配置一次时)。 您对此有任何评论吗?

    老实说、我不知道他们为什么 为 FreeRTOS 配置 NORMAL_OIWBWA_nONSHARED。 我甚至检查了旧线程、但我看不到任何与之相关的信息。

    我怀疑这可能是因为他们尝试有效地使用缓存。 但是、正如我们讨论过的、此配置可能会造成我们讨论过的问题;主存储器可能并不会一直包含最新数据。 因此、我的建议是最好使用不可缓存配置、因为我们看到这种配置(NORMAL_OIWBWA_NONSHARED)会在您的程序中产生问题。

    ——
    谢谢、此致、
    Jagadish。

x 出现错误。请重试或与管理员联系。