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.

[参考译文] AM2612:AM261x-LP:R5FSS0-0 上的共享存储器慢速访问

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1639233/am2612-am261x-lp-shared-memory-slow-access-on-r5fss0-0

器件型号: AM2612

尊敬的专家:

我正在从事 AM261x-LP 的内核 1 和内核 0 之间的 IPC 通信。 我修改了示例 L2_enet_switch、使内核 1 接收数据包、然后将数据包发送到内核 0。 通信的工作方式如下:

  1. 以太网 pkt 从 Core 1 接收
  2. 生成 ISR 并发布信标
  3. RX 任务运行并写入内核 0 和内核 1 之间的共享存储器内经过排队的数据包
  4. 内核 1 将通知内核 0(IPC Notify 机制)收到新数据包
  5. 内核 0 唤醒并从其自己 RAM 内的共享 RAM 复制数据包

对共享 RAM 的每次访问都由一个 spinlock 提供保护。 我在 共享 RAM 上阅读帖子 、我的存储器映射如下所示:

  1. OCRAM 存储体 0:SBL +内核 0
  2. OCRAM 组 1:CPPI 描述+内核 1(包括 Enet DMA 数据包池)
  3. OCRAM 存储体 2:内核 1 和内核 2 之间的共享存储器。 它只是一个 2KB 区域(用于 1 个完整的以太网数据包)、数据包被复制到/从中复制。 MPU 配置方式类似、两者均用于内核 image.png

当我在 Core 0 中执行 memcpy 时出现问题、我无法解释原因:memcpy 需要的时间正好是 85 μ s、而 Core 1 需要的时间是 3.75 μ s。

image.png

代码片段为:

namespace Core0
{
static EthFrame internalFrame;
// Called inside the IPC callback
static void ethTakePkt() 
{
    spinlock_lock(SPINLOCK_0);
    CacheP_inv((void*)&ethPkt, sizeof(ethPkt), CacheP_TYPE_L1D);
    hal_gpio_on(DEBUG_PIN_0);
    memcpy((void*)&internalFrame, (void*)&ethPkt, sizeof(EthFrame));
    hal_gpio_off(DEBUG_PIN_0);
    spinlock_unlock(SPINLOCK_0);
    return;
}
}

namespace Core 1
{
// Called inside RX Task
static void copyFrame(EthFrame *frame)
{
        spinlock_lock(SPINLOCK_0);
        hal_gpio_on(DEBUG_PIN_1);
        memcpy((void*)&ethPkt, (void*) frame, sizeof(EthFrame));
        hal_gpio_off(DEBUG_PIN_1);
        CacheP_wbInv((void*)&ethPkt, sizeof(EthFrame), CacheP_TYPE_L1D);
        spinlock_unlock(SPINLOCK_0);
}
}

namespace Common
{
volatile EthFrame ethPkt __attribute__((aligned(128), section(".bss.eth_pkt")));
}

我检查生成的代码并通过删除它来确认编译器未优化 memcpy。  

有什么想法为什么 Core 0 需要很长的时间来复制数据?

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

    您好 Elia、

    请允许我回顾一下、进行一些实验、明天再回来。

    此致、
    Shaunak

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

    您好 Elia、

    您是否还可以共享两个内核的 example.syscfg 文件、以便我可以查看存储器配置器和 MPU 配置

    此致、
    Shaunak

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

    您好 Elia、

    从初始分析可以看出、当您尝试从 0x70100000 复制 ethPkt 时、它被标记为非缓存和非缓冲共享存储器、其中目标存储器是缓存的 OCRAM 区域 (internalFrame)。

    1.我相信我们比较快拷贝的慢拷贝是 因为 我们在一种情况下从缓存读取,在一种情况下从非缓存共享缓冲区读取。

    2.此外,  非缓冲(可缓冲= false):  处理器必须等待写入事务在总线上完成、然后才能继续。 这通常用于需要严格排序的外设访问。 在本例中、我们将内核 0 存储器区域设置为非缓冲区、因此由于没有指令流水线、该区域会变慢。

    您可以尝试的一种解决方案是设置 isBufferable = true(在两个内核中)。

    您是否曾经尝试过重新编译示例并再次尝试进行基准测试并查看上述内容是否有所帮助?

    此致、
    Shaunak

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

    您好、

    这些是我得到的 1k 默认值

    共享 RAM 的 MPU 配置 内核 0 µs 延迟[μ s] 内核 1 µs [μ s]
    未配置 23.44±0.06 6.6±0.11
    可共享 86.86 ± 0.05 6.12 ± 0.11
    可缓存、可共享 86.86 ± 0.08 6.11 ± 0.1
    可缓存、可共享、可缓冲 86.86 ±0.08 6.12 ± 0.15

    更令人惊讶的是,如果 我做同样的副本 (从共享存储器区域到内核特定的 OCRAM)、我得到以下结果:

    共享 RAM 的 MPU 配置 内核 0 µs 延迟[μ s] 内核 1 µs [μ s]
    未配置 20.5. 4.625
    可共享 85.875 8.25
    可缓存、可共享 85.875 8.25
    可缓存、可共享、可缓冲 86 8.25

    因此、从实验来看、MPU 似乎只是出于某种原因与 Core 0 混淆。

    关于如何继续的任何建议?

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

    我找到了主要的问题。 一个内核是使用--use_memcpy=fast 编译的、另一个内核则不是 这会使速度提高 10 倍以上。

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

    您好 Elia、

    感谢您的更新,让我们明白-- use_memcpy=fast 带来了改进。  
    此外、我感到惊讶的是、bufferable = 0/1 没有对性能造成任何变化。

    此致、
    Shaunak