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.
工具与软件:
您好!
我刚刚完成了 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)。
—————————
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 源代码。 然后
尊敬的 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。