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.

[参考译文] TDA2EX17EVM:如何启用 A15内核高速缓存

Guru**** 2604225 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/648308/tda2ex17evm-how-to-enable-a15-core-cache-memory

器件型号:TDA2EX17EVM

大家好、

我正在使用 TDA2Ex 板并使用 Vision SDK 2.12.3代码。

我们正面临时序问题。

当 CAN FD 帧被发送时、预计的传输时间应该在80usec 到120usec 之间、但是对于传输一个 CAN FD 帧、我们的引导加载程序所花费的时间大约为1.2ms。

同样、对于一个 CAN FD 帧的接收、大约时间应为100 μ s 至150 μ s、但观察到的时间为2.1毫秒。

其中一种可能的解决方案是在 A15内核上使用引导程序时启用 A15内核的高速缓存。是否有人可以帮助我们配置相同的。

谢谢、此致、

Ashish

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

    A15的 I Cache 由 RBL 本身启用。
    要启用 D 高速缓存、应启用 MMU 并启用 MMU 描述符中的高速缓存位、并设置全局高速缓存启用。
    您可以以 MMU_a15_data_validation_app 为例。

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

    高速缓存的一个注意点是、它只应在存在数据的存储器区域启用、而不应在寄存器空间中启用。
    在这种情况下、您应该在存在 CAN FD 帧的区域中启用高速缓存。

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

    您好、Rishabh、

    我不清楚如何仅为 CAN FD 区域启用高速缓存。 您能不能更详细地介绍一下这方面的内容。

    此致、

    Ashish

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

    您需要设置二级 MMU 描述符、以便为 CAN FD 帧所在的特定区域启用高速缓存。
    对于其他区域、您可以使用示例中给出的第一级描述符。
    您可以参阅 :processors.wiki.ti.com/.../BIOS_with_GCC_(CortexA)

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

    您好、Rishabh、

    根据 SBL 用户指南、SBL 代码将复制到 OCMC RAM、然后 A15内核将执行 SBL 功能。

    因此、我们的引导加载程序代码正在 OCMC RAM 中执行、而与 CANFD 相关的数据仅在 OCMC RAM 中存在、 我不知道 OCMC RAM 的数据如何与 A15内核高速缓存相链接、 我在参考后未找到任何与 A15高速缓存相关的存储器详细信息、我可以检查必须为 CANFD 数据启用哪个存储器区域。

    下面是我们尝试启用高速缓存的详细信息:

    在 Vision SDK 中、有一个内置 API、用于您在上一次答复中建议的示例应用之一。  我们一侧用于启用高速缓存的代码片段如下所示:

      if (cache_a15_type_all!=启用高速缓存)
       {
            CACHEA15InvalidateL1DALL();

            CACHEA15InvalidateL1IALL();

           CACHEA15Enable (cache_A15_type_all);
     }

    我已经附加了包含上述函数定义的代码文件、供您参考。

    请告诉我们我们遵循的上述方法是否正确。

    请详细说明高速缓存存储器如何与 OCMC RAM 数据链接、如何为包含 CANFD 数据的高速缓存设置二级 MMU 描述符、因为我没有任何与 A15内核中高速缓存存储器组织相关的信息。

    谢谢、此致、

    Ashish Harite2e.ti.com/.../cache_5F00_a15.c

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

    e2e.ti.com/.../cache_5F00_a15_5F00_gcc.asm

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

    Ashish、您好!

    高速缓存硬件存储数据、以便能够更快地满足未来对该数据的请求。 禁用高速缓存且 A15读取 OCMC 内存时、将从 OCMC 获取数据。 如果启用了捕捉、则将启用预取、并从缓存读取数据、缓存与 CPU 的距离要短得多、因此延迟会更短。

    为了启用高速缓存、cache_a15.h 中定义了一些 API、但它们只会全局启用高速缓存。 必须设置 MMU 才能为 OCMC RAM 启用高速缓存。

    MMU 配置取决于系统中的可用存储器(DDR 是此处的变量)。 假设系统上有2 GB 内存。

    然后、应将第一级 MMU 描述符设置为三个区域的块:0x0 - 0x3fff_FFFF、0x8000_0000到 bfff_FFFF、0xc000_0000到0xFFFFFFF。

    对于区域0x4000_0000到0x7fff_FFFF、您应该将描述符设置为表。 对于第二级描述符、您应该为前两个条目启用高速缓存。 相同的代码片段如下所示:

    /*设置一级描述符*/
    virtualAddr = 0x0、phyAddr = 0x0;
    MMUA15SetFirstLevelDesc (&gMMUTable、virtualAddr、phyAddr、 gAttrsCB);
    virtualAddr = 0x40000000、phyAddr = 0x40000000;
    MMUA15SetFirstLevelDesc (&gMMUTable、virtualAddr、 phyAddr、&gAttrsT);
    virtualAddr = 0x8000000、phyAddr = 0x8000000;
    MMUA15SetFirstLevelDesc (&gMMUTable、 virtualAddr、phyAddr、.gAttrsCB);
    virtualAddr = 0xC0000000、phyAddr = 0xC0000000;
    MMUA15SetFirstLevelDesc (&gMMUTable、virtualAddr、phyAddr、&gAttrsCB);
    
    //设置二级描述符属性*//
    //*为40000000到8000000空间中的所有锁定设置一对一映射。
    *适用于每个2MB 页面。 将40200000至40400000作为可连接设备(索引1和2)
    *和其他不可连接设备。 */
    currAddr = 0x40000000;
    对于(索引= 0;索引< MMU_A15_NUM_second_level_buffer_entries;index++)
    {
    if (index =1 || index =2)
    {
    MMUA15SetSecondLevelDesc (&gMMUTable、currAddr、currAddr、&gAttrsCB);
    }
    其他
    {
    MMUA15SetSecondLevelDesc (&gMMUTable、currAddr、currAddr、&gAttrsNcB);
    }
    当前地址+= 0x200000;
    } 

    有关更多详细  信息、请参阅 DEN0013C_cortex_a_series_PG.pdf 的第9章高速缓存和第10章内存管理单元。 这是互联网上提供的 ARM 文档。

    此致、

    Rishabh