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:启用高速缓存后 DMA 无法正常工作

Guru**** 2465890 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/664673/rm57l843-dma-not-working-properly-after-cache-is-enabled

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

您好、E2E 团队、

我正在阅读许多论坛、这些论坛与我在使用 DMA 的应用中启用高速缓存时遇到的问题有关。

我使用的是 GCC 编译器/链接器FreeRTOS Halcogen v04.07.00。

我使用专用的 MPU 存储器区域 R8进行 CPU <> DMA 访问。 该区域设置如下:

该区域与区域3重叠、该区域覆盖整个 RAM 存储器、但区域3不可在 Halcogen 中编辑、因此我无法更改区域3的类型和权限:

因此,我想我可以尝试编辑 Halcogen 配置文件(*.DIL),更改以下参数:

driver.system.var.core_mpu_region_3_type.value=normal_OINC_shared
driver.system.var.core_mpu_region_3_type_value.value=0x000C
driver.system.var.core_mpu_region_3_permission.value=PRIV_rw_user_rw_EXEC
driver.system.var.core_mpu_region_3_permission_value=0x0300

这样、当我加载 Halcogen 项目时、现在我可以看到该区域是可共享的(和不可高速缓冲的):

但是、如果我在 Halcogen 设置中启用高速缓存、SPI DMA 只以零的形式发送数据、而如果在 Halcogen 中禁用高速缓存、我可以看到 DMA 的运行正常。

这些是链接器文件的片段、用于将"sharedRAM"段放在"RAM"段的顶部。

/*入口点*/
条目(_c_int00)

/*栈的最高地址*/
_estack = 0x8040000;/* 256K RAM 的末尾*

/*如果堆和堆栈不适合 RAM、则生成链接错误*/
_min_Heap_size = 0x400;//所需的堆数量*/

/*完全可访问且不可高速缓存的共享 RAM */
SHAREDRAM_SIZE = 0x1000;

/*指定内存区域*/
存储器

  Vectors (Rx):origin = 0x00000000,length = 0x00000020
  内核(Rx):origin = 0x00000020,length = 0x00008000
   闪存(Rx):origin = 0x00008020、length =(0x001F7FE0 + 0x00200000)
   CPU_STACK (RW):origin = 0x08000000,length = 0x0000f000 //堆栈在 sys_core.asm 中配置
   Kram (xrw):origin = 0x0800f000,length = 0x00000800
   RAM (xrw):origin =(0x0800f000 + 0x00000800),length =(0x00071000 - 0x00000800 - SHAREDRAM_SIZE)
   MEMORY_B1 (Rx):origin = 0x60000000,length = 0K
   SHAREDRAM (RW):origin = 0x0807F000,length = SHAREDRAM_SIZE

/*位于 RAM 中的 DMA 共享数据*/
.sharedRAM:

   。 =对齐(4);
   __sharedRAM_START__=.;//在 sharedRAM start 处创建全局符号*/
   *(.sharedRAM)
   。 =对齐(4);
}> SHAREDRAM

 

为了正确 使用启用缓存的 DMA、我缺少任何其他步骤?

感谢您的支持、

此致、

JOR SAS

 

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

    Jor、您好!

    DMA 会将数据直接写入 SRAM、或直接从 SRAM 读取数据。 启用和禁用不会影响 DMA 操作。 如果启用高速缓存(默认为写回)、CPU 可能不会立即从 SRAM 读取/写入数据。 在直写高速缓存中、每次对高速缓存执行写操作都会导致对 SRAM 执行写操作。 在回写高速缓存中、写入不会立即镜像到 SRAM。 DMA 源地址(SPI 发送)或 DMA 目标地址(SPI 接收)处的数据可能不会更新。

    2.您可以使用 DAP 读取 SRAM (DMA 资源地址)以检查数据是否已更新

    在调试窗口中、单击可调试器件->单击"显示所有内核"

    单击"TI XDS... Debug Probe/DAP"、然后选择"Connect the target"

    打开窗口浏览器、检查您所在位置的值

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

    尊敬的 QJ Wang:

    感谢您参加我的申请。

    我同意您的观点、即启用高速缓存不会影响 DMA 操作、但当我启用高速缓存时、它会影响从 SRAM 读取的数据和向 SRAM 写入的数据。

    下图显示了在启用高速缓存和禁用高速缓存的情况下 SRAM 中的数据是如何正确的:

     

    缓存已禁用:

    • _cacheEnable_()在代码中添加了注释(HL_sys_startup.c)
    • 要 传输到 SPI TX 寄存器的 SRAM 中的数据(m_pOutputBuffer) 在 SPI 传输(SPI - MOSI 信号)中被正确传输

    启用高速缓存:

    • _cacheEnable_()未在代码 中添加注释(HL_sys_startup.c)
    • 要传输到 SPI TX 寄存 器的 SRAM 中的数据(m_pOutputBuffer)在 SRAM 位置正确显示、但在 SPI 传输(SPI - MOSI 信号)中未正确传输、最可能是由于高速缓存干预(代码中的唯一差异)。


     

    在这两种情况下、MPU 区3和8均配置为:

    normal_OINC_shared (不可连接和共享)

    PRIV_RW_USER_RW_EXEC

    正如其他帖子中建议的那样、避免任何高速缓存干预:

    e2e.ti.com/.../2100.HalCoGen_5F00_FreeRTOS_5F00_GCC_5F00_Regions_5F00_R3_5F00_R8_5F00_NonCachable_5F00_and_5F00_Shared.zip

    您是否认为还有任何配置步骤可能丢失?

    再次感谢您的支持、

    此致、

    JOR SAS

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

    发现问题:

    Halcogen 配置工具允许为某些 FreeRTOS 任务设置特定的存储器区域(用户必须至少拥有其中一个任务)。 不明显的是,这些设置下面的代码所做的是,如果任何这些 FreeRTOS 任务都不配置任何特定区域,则删除用户以前在 Halcogen 中设置的任何 MPU 配置,这是一件非常难看的事情。

    感谢你没有帮助。

    JOR SAS