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.

[参考译文] AM62P:ads6311雷达摄像头已丢失帧捕获

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1452545/am62p-the-ads6311-radar-camera-has-lost-frame-capture

器件型号:AM62P

工具与软件:

我们使用 v4l2框架在调试 ads6311时捕获图像。 发现将出现帧丢弃。 我们进一步分析发现 memcpy 复制3932160字节、需要大约30ms。 因此、DMA 速率可能太慢。

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ti_csi2rx0: ticsi2rx@30102000 {
compatible = "ti,j721e-csi2rx";
dmas = <&main_bcdma_csi 0 0x5000 15>, <&main_bcdma_csi 0 0x5001 15>,
<&main_bcdma_csi 0 0x5002 15>, <&main_bcdma_csi 0 0x5003 15>;
dma-names = "rx0", "rx1", "rx2", "rx3";
reg = <0x00 0x30102000 0x00 0x1000>;
power-domains = <&k3_pds 182 TI_SCI_PD_EXCLUSIVE>;
#address-cells = <2>;
#size-cells = <2>;
ranges;
status = "disabled";
cdns_csi2rx0: csi-bridge@30101000 {
compatible = "cdns,csi2rx";
reg = <0x00 0x30101000 0x00 0x1000>;
clocks = <&k3_clks 182 0>, <&k3_clks 182 3>, <&k3_clks 182 0>,
<&k3_clks 182 0>, <&k3_clks 182 4>, <&k3_clks 182 4>;
clock-names = "sys_clk", "p_clk", "pixel_if0_clk",
"pixel_if1_clk", "pixel_if2_clk", "pixel_if3_clk";
phys = <&dphy0>;
phy-names = "dphy";
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

。将优先级更改为15 μ s

DMA =<&MAIN_Bcdma_CSI 0 0x5000 15>、<&MAIN_Bcdma_CSI 0 0x5001 15>、
         <&MAIN_BCDMA_CSI 0 0x5002 15>、<&MAIN_BCDMA_CSI 0 0x5003 15>;

更改后、我们无法捕获数据、数据为0。DMA 可以加速哪种方法。

版本:09.02.01.10

e2e.ti.com/.../vision-tiam62p5-linux6.1.83-memcpy_1780F6654B6DD58B_.txt

请帮助!谢谢!

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

    您好、Xiangxu:

    感谢您报告此问题。 我们将对此进行研究。

    同时、构建图像处理流水线的最佳实践通常会避免 CPU 进行存储器复制。 尽管将 ASEL 设置为15可以加快 memcpy、但这会带来一些副作用、如本常见问题解答中所述: 为什么 memcpy 在 AM6x 上从 V4L2缓冲区复制数据时太慢? 因此、适合您的最佳解决方案可能是优化您的系统、以便避免 memcpy。

    此致、

    建中

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

    您好、Xiangxu:

    我刚才向硬件团队了解后发现 AM62P 不支持 ASEL=14或15。 因此、必须优化应用以避免使用 memcpy。

    此致、

    建中

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

    你好、建中:

    那么、你还可以做些什么来提高 DMA 速度?
    支持 DMA 请求缓冲时、是否存在由硬件指定的内存一致性缓冲区? 现在、我们的应用场景需要基于 DMA 移动后缓冲区中的原始数据进行频繁操作

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

    同时、当未打开 ASEL=14或15时、我们会对 DMA 回调中的 DMA 异常帧速率标志进行计数、并发现会出现 DMA 错误帧问题

    j721e-csi2rx.c 文件

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    static void ti_csi2rx_dma_callback(void *param,
    const struct dmaengine_result *result)
    {
    struct ti_csi2rx_buffer *buf = param;
    struct ti_csi2rx_ctx *ctx = buf->ctx;
    struct ti_csi2rx_dma *dma = &ctx->dma;
    unsigned long flags = 0;
    /*
    * TODO: Derive the sequence number from the CSI2RX frame number
    * hardware monitor registers.
    */
    buf->vb.vb2_buf.timestamp = ktime_get_ns();
    buf->vb.sequence = ctx->sequence++;
    spin_lock_irqsave(&dma->lock, flags);
    WARN_ON(!list_is_first(&buf->list, &dma->submitted));
    if (0 == (ctx->ok_frame_cnt + ctx->ng_frame_cnt))
    {
    ctx->rx_start = ktime_get();
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Fullscreen
    1
    2
    3
    4
    5
    root@am62pxx-evm:/run/media/data-mmcblk0p5/output/bin# cat /sys/devices/platform/bus@f0000/30102000.ticsi2rx/csi_rx_status
    stream[0] ok: 352, ng: 2, total_fps: 1, ok_fps: 1
    stream[1] ok: 278, ng: 78, total_fps: 1, ok_fps: 1
    stream[2] ok: 353, ng: 0, total_fps: 1, ok_fps: 1
    stream[3] ok: 355, ng: 0, total_fps: 1, ok_fps: 1
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    那么您还可以做些什么来提高 DMA 速度?
    [报价]

    不是需要提高的 DMA 速度。 您正在通过 CPU 运行 memcpy、由于高速缓存维护、该速度较慢、如前面提到的常见问题解答中所述。

    您需要优化应用以避免 memcpy。 例如、如果使用 GStreamer 框架从摄像头流式传输到显示器、则将有零 memcpy。  

    同时、当未打开 ASEL=14或15时、我们对 DMA 回调中的 DMA 异常帧速率标志进行计数、并发现将出现 DMA 错误帧问题

    我假设在 memcpy 为 3932160字节时发生此情况。 如果不执行 memcpy、是否仍能测试是否仍看到 DMA 错误?

    谢谢你。

    建中

    [/quote]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="35284" url="~/support/processors-group/processors/f/processors-forum/1452545/am62p-the-ads6311-radar-camera-has-lost-frame-capture/5575710 #555710"]

    我假设在 memcpy 为 3932160字节时发生此情况。 如果不执行 memcpy、是否仍能测试是否仍看到 DMA 错误?

    谢谢你。

    [报价]

    不太理解这个逻辑、但停止复制意味着流的输出被切断。概率会在该帧错误的中间发生、错误可能会继续流动

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

    您是否可以尝试类似"v4l2-ctl --stream-mmap"的操作、看看它是否能以传感器帧速率运行? 这样就可以排除 CSI Rx 驱动程序(包括 DMA)的任何问题。

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

    下面是我们提供的各种格式的帧速率和数据大小表

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

    根据今天的讨论,我们认为以下是客户设置,以及在 DDR 中的2个内存位置(DDR_M1到 DDR_M2 )之间的数据传输过程中遇到的问题。

    客户报告的问题是 DDR_M1与 DDR_M2之间的数据传输缓慢。

    增强的数据传输速率  为每30ms (40-80M)。

    后续步骤

    1. Freddy 请确认上面捕获的问题是否是正确的问题
    2. 不清楚为什么客户不使用 DMA 而不使用 memcpy()??
    3. 提供存储器到存储器数据传输(40M 正常数据、而不是 CSI 数据)示例
    4. 共享数据传输中所用存储器的 MPU 设置
    5. "DDR_M2"中的数据被另一个内核上运行的基于 RTOS 的应用程序使用?
      1. 如果没有、那么什么是共享存储器位置以及在您的设置中的哪些内核之间共享?  

    此致

    Ashwani

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

    感谢 Freddy、根据后续会议中的讨论、以下是客户设置:

    • 每个帧具有低(仅限某些字节)数据、但帧速率较高
    • 客户在接收多个帧后触发 DMA 数据传输
      • DMA 触发频率是多少?
      • 小数据和高频率会导致损失(在 DMA 通道重新初始化方面)   

    客户方面需要考虑的几点

    • DMA_BUF 应该是可缓存的
    • 可以尝试在 memcpy()后使用 cache_inv()
    • 如何分割堆内存
    • Linux 用户空间 DMA 传输(字符副本)示例
      • 是一项艰巨的工作
    •  将用户空间缓冲区与散聚 DMA 配合使用、以查看它是否有助于实现良好的性能
      • TI 已在12月20日共享了该器件的补丁

    此致

    Ashwani

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

    您好、 Xiangxu:

    要加快 memcpy 和缓冲区交换、请通过在以下步骤中共享的内核和用户空间应用程序中进行必要的更改来启用基于软件的内核高速缓存维护操作:  

    1)将附加的补丁 /cfs-file/__key/communityserver-discussions-components-files/791/0001_2D00_media_2D00_ti_2D00_j721e_2D00_csi2rx_2D00_Allow_2D00_passing_2D00_cache_2D00_hints_2D00_from.patch 应用 到 ti-linux-kernel、允许从用户空间传递缓存提示。

    2)在 v4l2用户空间应用程序中进行以下更改:

       i) 在从 v4l2请求缓冲区(VIDIOC_REQBUFS)时传递 v4l2_memory_FLAG_NON_相干、如以下代码片段中共享:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    rb.count = nbufs;
    rb.type = dev->type;
    rb.memory = dev->memtype;
    + rb.flags = V4L2_MEMORY_FLAG_NON_COHERENT;
    ret = ioctl(dev->fd, VIDIOC_REQBUFS, &rb);
    if (ret < 0) {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
       

     ii)   当对来自 v4l2的缓冲器(VIDIOC_QBUF)进行排队时传递 V4L2_BUF_FLAG_NO_CACHE_CLEAN、如下代码片段中所共享:

    Fullscreen
    1
    2
    3
    4
    5
    buf.index = index;
    buf.type = dev->type;
    buf.memory = dev->memtype;
    buf.flags = V4L2_BUF_FLAG_NO_CACHE_CLEAN;
    ret = ioctl(dev->fd, VIDIOC_QBUF, &buf);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

      在进行上述更改时、您可以参考随附的补丁/cfs-file/__key/communityserver-discussions-components-files/791/0001_2D00_yavta_2D00_hack_2D00_Pass_2D00_cache_2D00_hints_2D00_from_2D00_user_2D00_space_2D00_for_2D00_capt.patch。

    3)总结观察结果,我们基本上看到5倍的时间改进与建议的变化如下分享:

     i)复制614400字节的原始平均时间为5.193毫秒:
      

    Fullscreen
    1
    2
    3
    yavta -c200 -F/run/capture -s 640x480 -f UYVY /dev/video2 > /run/1.txt
    tail /run/1.txt | grep avg
    avg: 0.005193
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    通过上述更改、复制 614400字节的时间减少到1.085 ms:

    Fullscreen
    1
    2
    3
    4
    yavta -c200 -F/run/capture -s 640x480 -f UYVY /dev/video2 > /run/2.txt
    tail /run/2.txt | grep avg
    avg: 0.001085
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    如果遇到任何问题、敬请告知。

    此致

    Devarsh