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.

[参考译文] TMS320C6424:缓存无效问题

Guru**** 2587365 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/585934/tms320c6424-problem-with-cache-invalidate

器件型号:TMS320C6424

您好 TI

在外部存储器中、我有一个 EDMA 存储器从一个存储器位置传输到另一个存储器位置。 大小约为19 KB。 我使用缓存无效来确保刷新缓存、但测试显示部分存储器未刷新。

下面是我要做的:

1) memset (&stDataFile[ui8DataFileIndex].stData、0、sizeof (stDataFile[ui8DataFileIndex].stData);

2) BCACHE_wbInv (&stDataFile[ui8DataFileIndex].stData、sizeof (&stDataFile[ui8DataFileIndex].stData)、true);

3) 3) Initaite EDMA 传输

4) 4)通过 检查 IprH 寄存器中的位等待 EDMA 传输完成

5) BCACHE_INv (&stDataFile[ui8DataFileIndex].stData、sizeof (stDataFile[ui8DataFileIndex].stData)、true);

如果我在步骤5之后检查数据、存储器中有值为0的随机范围(来自步骤1中的 memset)。

如果我等待几 ms (TSK_SLEEP)或更长时间、数据是正确的。

是否有任何可能导致这种情况的建议?

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

    我已通知 RTOS 团队。 他们的反馈将在此处发布。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否按照此处指定的方式检查缓冲区对齐:

    e2e.ti.com/.../35570

    这些问题在这里有说明:
    processors.wiki.ti.com/.../Cache_Management

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

    你(们)好,Rahul

    感谢您的回复。

    缓冲区以128边界对齐(使用#pragma DATA_ALIGN)、缓冲区大小为19200、可将其除以128。

    我已经使用 BCACHE_wbInvAll()后跟 BCACHE_WAIT()进行了测试,该测试解决了问题,但不是可用的解决方案。

    DSP/BIOS 内核5、2、5、25 11-20-2009中是否存在任何与 BCACHE_INv 相关的已知问题?

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

    "在步骤5后立即检查数据"到底是什么意思? 如何检查内存?

    是否可以尝试将步骤5中的等待参数更改为 false 并添加步骤5a 以显式调用 BCACHE_WAIT()?

    我不知道 C6424是否有与缓存用户指南 cache_inv 中所述的相同的 CSL 函数。 如果有、请尝试使用该选项、而不是 BCACHE_INv。 如果不是、则有 CSL 寄存器级宏允许您按照 Megamodule 参考指南示例4-2中的说明直接执行 cache invalidate 命令。 "块一致性操作示例";它非常简单。 如果等待操作有问题、则可能需要尝试各种延迟、然后才能测试 L2IWC。

    也许是一个奇怪的问题、但在您的计划中、真实的价值是什么?

    您描述的症状肯定是等待功能失败。 BCACHE 命令已被广泛使用多年、因此不太可能出现这样的故障。 但它们是这样的。 如果您可以尝试执行这些测试来查看操作中看到的任何更改、这可能会帮助我们找出问题。

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

    您好、RandyP

    感谢您的回复。

    [引用 user="RandyP">"在步骤5后立即检查数据"到底是什么意思? 如何检查内存?[/quot]

    我通过在步骤5之后计算校验和来检查数据、然后在将数据写入闪存之前再次计算校验和。 两者不匹配。 校验和计算是从其他项目继承而来的、这些项目在现场有多年的经验(即经验证的跟踪记录)。

    在调试过程中、我还会对缓冲区执行几次 memcpy 操作、以便通过 JTAG (Lauterbach Trace32)目视检查数据。 我可以看到有"0"的随机块(来自步骤1中的 memset)。 在每个 memcpy 之后、这些块会减少。

    如果我将缓冲区放置在非缓存存储器中、则一切正常。

    [引用 user="RandyP">是否可以尝试将步骤5中的 WAIT 参数更改为 false 并添加步骤5a 以显式调用 BCACHE_WAIT ()? [/报价]

    运气差。 我仍然得到不同的校验和计算。

    [引用 user="RandyP"]不知道 C6424是否有等效的 CSL 函数,就像缓存用户指南 cache_inv 中所调用的那样。 如果有、请尝试使用该选项、而不是 BCACHE_INv。 如果不是、则有 CSL 寄存器级宏允许您按照 Megamodule 参考指南示例4-2中的说明直接执行 cache invalidate 命令。 "块一致性操作示例";它非常简单。 如果等待操作有问题、则可能需要尝试各种延迟、然后才能测试 L2IWC。

    我不熟悉 C6424的 CSL 函数、但我找到了寄存器并尝试了以下操作:

    cache_L2IBAR =(uint32_t)&stDataFile[ui8DataFileIndex].stData;

    cache_L2IWC = 600;//19200/32

    while (cache_L2IWC!= 0);

    但不幸的是、我们运气不好。 我仍然得到不同的校验和计算。

    [引用 user="RandyP"]一个奇怪的问题,也许,但您的程序中的 TRUE 值是什么?

    TRUE 定义为1

    [引用 user="RandyP">您描述的症状肯定是等待功能失败。 BCACHE 命令已被广泛使用多年、因此不太可能出现这样的故障。 但它们是这样的。 如果您可以尝试执行这些测试以查看操作中看到的任何更改,则可能会帮助我们解决问题。

    我们使用的是相当旧的 DSP BIOS/内核版本(请参阅我之前的文章中的版本)。 我还找到了另一个器件(不记得是哪个器件)的勘误表、该器件在使用失效功能时出现错误、建议在失效时禁用中断(以及其他一些事项)。 不过,在现阶段,我们不能选择这种做法。 您能否确认 C6424设备没有类似的问题?

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

    很遗憾、我没有任何 BIOS 访问权限来确认任何内容。 我更像您这样的用户尝试寻找问题和解决方案。 我在器件勘误表中没有看到类似缓存的任何内容、这是关于我拥有的所有访问权限。

    请尝试此操作以捕获 L2IWC 的一些早期值吗?

    int CaptureL2IWC[50];

    cache_L2IBAR =(uint32_t)&stDataFile[ui8DataFileIndex].stData;

    cache_L2IWC = 600;//19200/32

    for (int i = 0;i < 50;i++)
    CaptureL2IWC[i]=高速缓存_L2IWC;

    while (cache_L2IWC!= 0);

    然后、看看 CaptureL2IWC 数组、看看早期的值是什么?

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

    e2e.ti.com/.../bcache_5F00_wait.c

    我查看了 BCACHE 代码。 有一个小变化是为了消除比赛条件。 我已附加源文件。 您应该能够将其包含在您的项目中。 链接器应选择此版本、而不是内核库。 所做的更改是将 HWI_DISABLE/RESTORE 放置在 if 语句周围、而不是放置在 if 语句内部。

    Todd

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

    您好、RandyP

    [引用 user="RandyP"]然后查看 CaptureL2IWC 数组以了解早期值是什么,请查看?

    结果如下:

    我想知道为什么初始值是608而不是600。 数据应以128对齐。

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

    你(们)好

    感谢你的贡献。

    [引用 user="ToddMullanix"]我查看了 BCACHE 代码。 有一个小变化是为了消除比赛条件。 我已附加源文件。 您应该能够将其包含在您的项目中。 链接器应选择此版本、而不是内核库。 所做的更改是将 HWI_DISABLE/RESTORE 放在 if 语句周围、而不是放在 if 语句内部。

    我已包含该文件、但必须注释掉"_Bcache.h"(未找到)的内容、并将_BCACHE_L2WWC 更改为 cache_L2WWC、这是我们项目中的寄存器定义(我已使用数据表检查它指向正确地址)。

    遗憾的是、我仍然得到不同的校验和计算、因此它没有解决问题。

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

    请将(uint32_t)&stDataFile[ui8DataFileIndex].stData 放置在数组的第一个位置、以便我们可以看到它。

    代码中的该循环显示计数在退出前最终达到0、之后您是否获得正确的数据读取?

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

    [引用 user="RandyP"]请将(UINT32_t)&stDataFile[ui8DataFileIndex].stData 放在数组的第一个位置,以便我们可以看到它。

    实际上、在我最近的测试中、我已将数据移出 stDataFile 结构、因此 stData 定义为:

    #pragma DATA_ALIGN (stData、128);
    静态易失性 stAdcData_t stData[600];

    我可以存储数据(在每次校验和计算之前)并向您显示问题。 您的想法是这样吗?

    [引用 user="RandyP"]
    代码中的该循环显示计数在退出前最终达到0、之后您是否获得正确的数据读取?

    否、相同的问题仍然存在(不同的校验和计算)。

    我几乎没有时间解决这个问题。 因此、我可能需要回退并将阵列放置在非缓存存储器中(这可以解决问题)、并应对性能下降。

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

    请将(uint32_t) stData 放置在数组的第一个位置、以便我们可以看到它、或者如果编译器愿意、则放置(uint32_t)&stData[0]。 此外、请将(uint32_t) cache_L2IBAR 放在阵列的第二个位置。

    此外、我想在触发传输之前查看 EDMA3传输的8个 DMA 参数条目中的32位十六进制值。 我想确认地址和 Early / Normal、以及如何设置传输的所有内容。

    请将这些全部显示为32位十六进制。

    WC 的块大小必须是32个字节的倍数、因此当您向 WC 写入600时、它将舍入到608、这是32个字节的下一个更高倍数。 尽管我以前没有看到过这个问题,但我看到过数组末尾的其他变量可能会被意外的高速缓存一致性命令破坏的情况。 最好看看这一领域的情况,尽管不太可能成为问题的一部分。

    您是否正在使用 C6424修订版1.3的最新芯片修订版?

    要复制到 stData 的存储器的内容(数据值)是什么? 它存储在什么地址?

    如果在复制之前从原始数据的原始位置获取原始数据的校验和、那么该校验和如何与传输后 stData 的不同校验和值进行比较?

    您能否发布校验和代码? 是 C 语言还是汇编语言? 如果是 C 语言、您能否为其添加"Disassembly"列表?

    如何确定 DMA 传输已完成?

    由于过早地将 WC 读取为0时不处理竞态条件,因此缓存将完全失效,并且不太可能导致此问题。 这就是我提出所有这些问题的原因。 我可以看到、捕获环路消除了缓存一致性命令的故障。 症状仍然指向那里、但我们不会获得比您的捕获环路更好的信心。

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

    您好、RandyP

    很抱歉耽误你的回答。

    [引用 user="RandyP"]请将(uint32_t) stData 放在数组的第一个位置,以便我们可以看到它,或者如果编译器愿意,请将(uint32_t)&stData[0]放置。 此外、请将(uint32_t) cache_L2IBAR 放在数组的第二个位置。

    参考:

    cache_L2IBAR =(uint32_t)&sData;
    CaptureL2IWC[0]=(uint32_t)&stData;
    CaptureL2IWC[1]= cache_L2IBAR;
    
    cache_L2IWC = 600;
    for (i = 2;i < 50;i++)
    {
    CaptureIWC[i]= L2IWC
    
    ;while =} 

    结果:

    我不确定为什么索引0和1中的值不相同?

    [引用 user="RandyP">并且、我想在触发传输之前查看 EDMA3传输的8个 DMA 参数条目中的32位十六进制值。 我想确认地址和 Early / Normal、以及如何设置传输的所有内容。

    请将这些全部显示为32位十六进制。[/quot]

    [引用 user="RandyP"> WC 的块大小必须是32个字节的倍数,因此当您向 WC 写入600时,它将舍入到608,这是32个字节中的下一个更高倍数。 尽管我以前没有看到过这个问题,但我看到过数组末尾的其他变量可能会被意外的高速缓存一致性命令破坏的情况。 最好看看这一领域的情况,尽管不太可能成为问题的一部分。[/引述]

    当前 CaptureL2IWC 阵列位于 stData 之后。 问题仍然存在。

    [引用 user="RandyP"]您是否使用了 C6424修订版1.3的最新芯片版本?

    是的。

    [引用 user="RandyP">要复制到 stData 的存储器内容(数据值)是什么? 它存储在哪个地址?[/quot]

    它是存储在非缓存外部存储器中的循环缓冲区中的一个 ADC 数据块。 缓冲区从地址0x80400000开始。

    [引用 user="RandyP"]
    如果在复制之前从原始数据的原始位置获取原始数据的校验和、该校验和如何与传输后 stData 的不同校验和值进行比较?[/quot]

    遗憾的是、复制之前没有校验和。

    [引用 user="RandyP">您能否发布校验和代码? 是 C 语言还是汇编语言? 如果是 C、您能否为其添加反汇编列表?[/quot]

    抱歉、我无法与您分享代码、但已介绍原型:

    uint32_t CHECKSUM_Adler32 (const uint32_t ui32Adler、const uint8_t * pui8buf、const uint32_t ui32Len);

    我对 stData 易失性时将 ptr 限定为 const 有点担心。 我已经进行了一些测试(一个没有 const、另一个具有易失性)、但校验和仍然会因计算时间而异(当数据放置在非缓存存储器中时、校验和不会发生变化)。

    [引用 user="RandyP"]如何确定 DMA 传输已完成?

    我轮询并等待中断挂起寄存器中相应的位置位、即 IPRH 寄存器中的 TCC 43 (位11 (43-32))。

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

    CaptureL2IWC 中的前两个条目不同,因为您向 L2IBAR 写入的值与您在数组中的第一个条目 sData 与 stData 写入的值不同。

    由于 WC 寄存器正在递减计数到0、因此缓存无效并完成该操作。 该缓存操作不能再产生任何副作用。

    如果您正在等待设置 IPR 位、则 EDMA 操作已完成、所有数据已到达。 此后不能继续下去。

    我看不到有什么办法使你所描述的事情发生。 您的应用程序中必须有其他东西导致这种奇怪的行为、但我看不到缓存是如何成为其中的一部分的。

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

    您好、RandyP

    [引用 user="RandyP"] CaptureL2IWC 中的前两个条目不同,因为您向 L2IBAR 写入的值与您对数组中第一个条目 sData 与 stData 写入的值不同。

    编辑帖子时必须出现错误。 在我的代码中、它是正确的。

    [引用 user="RandyP">由于 WC 寄存器正在递减计数到0,因此缓存无效,并完成该操作。 该缓存操作不能再产生任何副作用。

    如果您正在等待设置 IPR 位、则 EDMA 操作已完成、所有数据已到达。 此后不能继续下去。

    我看不到有什么办法使你所描述的事情发生。 您的应用程序中必须有其他东西导致这种奇怪的行为、但我看不到缓存是如何成为其中的一部分的。

    好的。 我们已决定将数据移动到没有缓存的内存中、这显然可以解决问题、但在访问数据时速度较慢。

    感谢您的支持:)

    此致
    Thomas

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

    Thomas、

    [引用 user="Thomas Jespersen93">编辑帖子时必须出现错误。 在我的代码中、它是正确的。

    如果您的代码中的值正确、则存在其他错误、因为数组中的前两个值不同。 调试的调试器。

    [引用 user="Thomas Jespersen93"]我们已决定将数据移动到没有缓存的内存中,这显然可以解决问题,但在访问数据时速度较慢。

    您的系统或代码中必须存在其他问题、因为缓存应该完全失效。 Attached 是一个独立的测试程序、可执行列出的几个步骤并成功读取内存。 如果您尝试运行它、请报告您是否也获得了正确的值- printf 应该显示一个预测试校验和、第二个数组的校验和、然后是一系列有效的后 DMA 校验和。 校验和以汇编语言编写、速度非常快。 代码很难看、我运行过的其他测试留下了一些遗漏、因此必须忽略大量注释、#defines 和#if。

    我没有发现 C6424高速缓存无效硬件有任何问题。 请尝试使用此代码、如果它起作用、则将其集成到您的代码中。

    此致、
    RandyP

    e2e.ti.com/.../C6424CacheTest.zip

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

    Thomas、

    [引用 user="Thomas Jespersen93">编辑帖子时必须出现错误。 在我的代码中、它是正确的。

    如果您的代码中的值正确、则存在其他错误、因为数组中的前两个值不同。 调试的调试器。

    [引用 user="Thomas Jespersen93"]我们已决定将数据移动到没有缓存的内存中,这显然可以解决问题,但在访问数据时速度较慢。

    您的系统或代码中必须存在其他问题、因为缓存应该完全失效。 Attached 是一个独立的测试程序、可执行列出的几个步骤并成功读取内存。 如果您尝试运行它、请报告您是否也获得了正确的值- printf 应该显示一个预测试校验和、第二个数组的校验和、然后是一系列有效的后 DMA 校验和。 校验和以汇编语言编写、速度非常快。 代码很难看、我运行过的其他测试留下了一些遗漏、因此必须忽略大量注释、#defines 和#if。

    我没有发现 C6424高速缓存无效硬件有任何问题。 请尝试使用此代码、如果它起作用、则将其集成到您的代码中。

    此致、
    RandyP

    e2e.ti.com/.../0871.C6424CacheTest.zip