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.

[参考译文] TMS570LC4357:高速缓存和 DMA 问题

Guru**** 2334960 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/579849/tms570lc4357-problem-with-cache-and-dma

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

您好!

我遇到 的是、使用 DMA 从 ADC RAM FIFO 结果缓冲器传输到 L2 RAM 的采集数据的缓存一致性问题。

ADC1组2 - 8通道 -> DMA 通道 3 -> L2 RAM    传输 为 TRIG @1KHz   

ADC2组1 - 5个通道 过采样8次-> DMA 通道 4 -> L2 RAM     传输 为 TRIG @ 3KHz (但最高可达20kHz)

ADC2组2 - 5个通道 -> DMA 通道 5 -> L2 RAM     传输 为 TRIG @1KHz    

启用高速缓存时:  一些数据 根本不传输(其在 L2-RAM 中的值 为0),有些是 间歇性的,有些总是传输。

禁用高速缓存时:一切正常。

此外、 TM570LS3上的相同代码多年来一直运行良好(没有高速缓存)

如何调查此问题 ?

是否有一些文档详细说明函数 CoreInvalidateDataCache 的使用?

是否有办法声明某些 L2 RAM 段 不可缓存?

此致、

查尔斯·奥布里

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

    我正在就您的问题咨询我的一位同事。 当我对此有一些想法时、我会回来与您分享。 我明天应该有更多信息。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、

    您能否从回写高速缓存方案(halcogen 的默认设置)更改为直写高速缓存。 您正在读取零、因为它从高速缓存读取、而不是从 L2读取。 是的、这是使用回写操作时的一致性问题。 也可以声明缓冲区不可高速缓存。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    只需添加--即使这是 在 ADC 的方向上----即 L2SRAM,因为您在这个方向上依赖 ACP 来实现一致性

    并通过 TRM:

    Cortex-R5 ACP 存储器一致性方案仅在外部之间提供一致性

    主器件连接到 ACP 从器件端口和 Cortex-R5组中具有数据高速缓存的 CPU、用于

    在 CPU 的 MPU 中配置为内部可高速缓存写入的内存区域。 它不是

    为配置为可缓存回写的存储器区域提供一致性。

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

    感谢您的支持。
    我尝试将缓冲区配置为不可缓存、但它似乎不起作用。


    我发现这篇文章解释了该怎么办。 e2e.ti.com/.../666341

    但 Halcogen 的部分没有得到很好的解释。 进行配置
    MPU、生成的代码不会修改.cmd 文件、并且没有用于配置 MPU 的 C 代码。



    1) 1)对于.cmd、我完全按照在帖子中所做的那样。


    2) 2)这里是我手动执行的 C 代码:


    #pragma SET_DATA_SECTION (".sharedRAM")
    AdcBufferMgrOverSampleType adc1BufferMgrG1;
    Adc1BufferMgrSingleSampleType adc1BufferMgrG2;

    AdcBufferMgrOverSampleType adc2BufferMgrG1;
    Adc2BufferMgrSingleSampleType adc2BufferMgrG2;
    #pragma SET_DATA_SECTION ()


    _mpuInit_();
    _mpuDisable_();

    _mpuSetRegion_(mpuREGION1);
    _mpuSetRegionBaseAddress_(0x08002200);//&adc1BufferMgrG1
    _mpuSetRegionSizeRegister_( MPU_4_KB );
    _mpuSetRegionTypeAndPermission (MPU_normal_OINC_shared、MPU_PRIV_RW_USER_RW_EXEC);
    _mpuEnableBackgroundRegion_();

    _mpuEnable_();


    (请注意、我们不会在项目中正常使用 HalCoGen。)

    我正在使用编译器 v5.2.4和 HalCoGen v03.07.00

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

    您能否确认变量位于您希望从 pragma 定义/链接器更新中获得的地址位置/数据段中?

    如果它们位于正确的位置、我们需要仔细检查 MPU 设置以确保配置正确完成。 在 Halcogen 之外执行它有挑战、但如果您习惯它、它不应成为主要障碍。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、

    您是否能够解决此问题? 请使用绿色的"验证答案"按钮验证已发布的答案之一、以便我们可以关闭该主题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Chuck、

    在结束本期之前、我还有一些相关的问题。

    我为 DMA 目标地址创建了一个单独的存储器区域、其中禁用了缓存。 它解决了我的不一致的数据结果。

    好的、在那之前、我在 ESM 模块中出现了2个以下错误:

    通道47 - ACP 缓存无效。
    通道52 - CPU 互连子系统-全局错误

    它们在 DMA 和高速缓存之间的冲突导致的地方是有道理的。 现在它们不再出现。
    =>您是否确认 DMA 和高速缓存之间的冲突会导致这2个 ESM 错误?


    此外、我在勘误文档中看到以下 ESM 错误源存在几个问题:
    通道52 - CPU 互连子系统-全局错误

    更具体地说,(器件#49):

    μ` CPU 互连子系统-全局错误标志(ESM 组1通道52)可针对未采用状态进行置位
    推测数据提取'

    =>如何防止未获取的推测取指令?

    => TI 是否建议屏蔽此错误?


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

    在结束本期之前、我还有一些其他相关问题。

    我为 DMA 目标地址创建了一个单独的存储器区域、其中的缓存为乱码。 它解决了我的不一致的数据结果。
    另外、在设置 MPU 之前、ESM 模块中出现2个以下错误:

    通道47 - ACP 缓存无效。
    通道52 - CPU 互连子系统-全局错误

    在 MPU 设置之后、我不再得到这些 erros。

    =>您是否确认 DMA 和高速缓存之间的冲突会导致这些 ESM 错误?


    我还看到,在勘误表中,有很多问题与以下方面有关:
    通道52 - CPU 互连子系统-全局错误
    更具体地说、器件#49
    CPU 互连子系统-全局错误标志(ESM 组1通道52)可针对未采取而被置位
    推测数据提取。

    解决方法是:
    使能 CPU MPU 来阻止有效存储器范围之外的任何访问(实存和推测存取)。

    =>如何保证不会产生未经提取的推测数据?
    =>应该禁用此错误吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    [引用 user="Charles Obry">在 MPU 设置后,我再也不会得到这些宏。

    =>您是否确认 DMA 和高速缓存之间的冲突会导致这些 ESM 错误?[/QUERPLET]

    是的。 这就是错误消失的原因。

    [引用 user="Charles Obry">解决方法是:
    使能 CPU MPU 来阻止有效存储器范围之外的任何访问(实存和推测存取)。

    =>如何保证不会产生未经提取的推测数据?
    =>应该禁用此错误吗?

    通过使用 MPU 阻止推测取指令到无效的存储器、可以防止错误发生。 未取推测取指令的正常情况仍然存在、但由于它们不是无效存储器、因此不会发生错误。  

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

    你好、Chuck、

    当您说:

    通过使用 MPU 阻止推测取指令到无效的存储器、可以防止错误发生。 未取推测取指令的正常情况仍然存在、但由于它们不是无效存储器、因此不会发生错误。  


    TMS570LC4是否有一个默认的 MPU 配置 来防止对无效存储 器的访问?  内存无效的具体含义是什么?

    此外、关于 TMS570LC4的安全机制、您是否有关于更容易出错的 IC 功能及其速率的统计数据?

    使用高速缓存与不使用高速缓存进行比较(与 LS3一样)会有所不同?

    此致

    查尔斯

     

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

    我认为 Halcogen 中有一个默认的 MPU 配置。 我的意思是无效存储器是、存储器空间中有未实现的地址。 具体而言、闪存超过4MB 范围的任何内容都是无效的、除了外设帧中未使用/不需要的某些地址外、这些地址还被视为无效。 默认的 MPU 设置可能不包含所有这些区域、但您主要会对可执行区域感兴趣、以防止与推测取指令相关的错误。

    每个安全标准都有详细的信息选项卡、提供了每个元件(永久和瞬态)的时基故障率。 由于 FIT 是时基故障、因此可以将其视为某种概率。 一般来说、给定特征中的晶体管越多、故障的可能性就越大。

    我认为、除了增加复杂性和影响故障可能性的晶体管之外、使用高速缓存与不使用高速缓存对整体安全没有影响。