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.

[参考译文] RTOS/EVMK2H:为何 DMA 不接受浮点缓冲器

Guru**** 2614265 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/581416/rtos-evmk2h-why-dma-does-not-accept-floating-point-buffers

器件型号:EVMK2H

工具/软件:TI-RTOS

我使用的是 EDMA3驱动器示例 EDMA3_drv_bios6_tci6636k2h_st_sample。 我将源和目标缓冲区类型从"已调整字符"更改为"浮点"。 缓冲器指针也会更改为浮点。

//数据缓冲区,源缓冲区中有 sin (x)
float _srcBuff[NUM_buffers][MAX_buffer_size];
float _dstBuff[NUM_buffers][MAX_buffer_size];
//指针
float * srcBuff[NUM_buffers];
float * dstBuff[NUM_buffers]; 

当将这些缓冲区传递给 DMA 参数时、我键入将它们强制转换为 uint32_t

结果|= EDMA3_DRV_setSrcParams (hEdma、Chid[i]、(uint32_t)(srcBuff[i])、
EDMA3_DRV_ADDR_MODE_INCR、EDMA3_DRV_W8BIT);
结果|= EDMA3_DRV_setDestParams (hEdma、Chid[i]、(uint32_t)(dstBuff[i])、
EDMA3_DRV_ADDR_MODE_INCR、EDMA3_DRV_W8BIT); 

但 DMA 不会传输数据并使用 EDMA3_RM_Xfer_complet 代码返回。

由于存储器寻址、EDMA 是否严格地与"已排列字符"搭配使用?

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

    [引用]由于存储器寻址、EDMA 是否严格使用"已排列字符"?[/引用]
    EDMA 本身不应考虑数据类型、因此不应仅限于 signed char。

    您能否共享您使用的 SDK 版本、EDMA LLD 的哪个版本?

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

    其 PDK K2HK4_0_4。 和 EDMA3_LLD_2_12_02_26

    EDMA 返回到具有传输完成标志的 ISR、但当我查看存储器时、没有数据更新。 我对目标地址使用了_getParamEntry、以确保我正在写入正确的目标地址、并且它是正确的地址

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

    EDMA 传输没有发生、因为 EDMA 看到的是全局地址(如果我没有错) 、而不是内核的本地 L2D 地址。 当我从 signed char 移动到 float 或 int32_t 时、我无法使用如下给出的函数

    int32_t* pingpongSrcBuf; 
    pingpongSrcBuf =(signed char*) global_ADDR (_pingpongSrcBuf); 

    因此、我对指针寻址使用了如下的正常表示法

    pingpongSrcBuf =&(_pingpongSrcBuf[0]);

    目前、我已经按如下方式对 Core0的 L2全局地址进行硬编码、但是是否有任何库调用 以 32位 int 格式将本地地址映射到全局?

    pingpongSrcBuf =(int32_t*)((1<<28)|(unsigned int)(pingpongSrcBuf)); 

    问题2:
    ACNT 是 EDMA 的"字节数"、而其他工程常量定义是相对于若干32位字的。 我现在正在处理这个问题。