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:AM335x EDMA memcopy 不工作

Guru**** 2575385 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/615651/rtos-am335x-edma-memcopy-not-working

工具/软件:TI-RTOS

你(们)好。

我尝试进入整个 EDMA 过程、并尝试在 BBB 上的 AM335x 的片上 DDR 上实施 manuell dma-memcopy。 因此、我使用了位于 "ti\EDMA3_LLD_2_12_04_28\examples\EDMA3_driver\"中的 EDMA_test 部分、并对其稍作更改。 测试数据在 RAM 中成功初始化、EDMA 寄存器中的传输完成位被置位和清零、但 DDR 中的数据仍处于与 EDMA 之前相同的状态。 我在 RTOS 中以任务的形式运行传输。

我认为我仍然错过了一些重要的步骤或犯了一个重大的错误。 感谢你的帮助!

我的代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define MAX_ACount 64
#define MAX_BCOUNT 1
#define MAX_COUNT 1
#define MAX_BUFFATER_SIZE (MAX_ACount* MAX_BCOUNT* MAX_CCOUNT)
#define BUFFERBASEADD 0x83000000
#define BUFFERDEST1 (MAX_BUFFERBASEADD +MAX_BUFFERBACK_COUNT* MAX_COUNT* MAX_SHIFT)
#define BUFFERBADD 0x83000000 #define BUFFERDEST1 (#define BUFFERDEST1)#def
(0x00000002u)
#define OPT_TCC_MASK (0x0003F000u)
#define OPT_TCC_SHIFT (0x0000000Cu)
#define OPT_ITCINTE_SHIFT (0x00000015u)
#define OPT_TCINTE_SHIFT (0x00000014u)
extern EDMA3_DRV_GblConfigParams sampleEdma3GblCfgParams[];
extern void registerEdma3Interrupts (uint32_t edma3Id);
static char * const srcbubuff =(char *) BUFFERBASEADD;
static Flag *= 0
* convistt edma3Id);static char * const char * condtran1 * transfer =
(volatile rischar * 1)
/*用于检查通道2上传输完成情况的标志变量*/
易失性短路 irqRaised2=0;

void *AppSemHandle1=NULL;
//应用程序内存句柄*/
void *AppSemHandle2=INT;
void callback2(UINT32_t TCC,EDMA3_RM_TccStatus,void *AppData );
void callback2(UINT32_t Tccat);void callt.032_t.callt TCC (nL) EDMA3_RM_TccStatus、void * AppData);

void testEDMA (uint32_t acnt、uint32_t bcnt、uint32_t ccnt、
EDMA3_DRV_SyncType syncType)
{
int j = 0、i = 0;
对于(j = 0;j < MAX_BUFFER_SIZE;+j)
{
srcbuffer[j]= 0xFF;
}
对于(j = 0;j < MAX_BUFFER_SIZE;+j)
{
destbuff[j]= 0xAA;
}

EDMA3_DRV_Handle hEdma = 0;
EDMA3_DRV_RESULT edmaResult = EDMA3_DRV_SOK;
hEdma = edma3init (0、&edmaResult);
if (edmaResult!= EDMA3_DRV_Sok)
{
UART_printf ("\n DER init war Oasch!\n");
}
EDMA3_DRV_PaRAMRegs 参数集=
{
0、0、0、0、0、0、 0、0、0、0、0、 0、0
};

Semaphore_Params semParams;
Semaphore_Params_init (semParams);
unsigned char *p =(unsigned char *)&ParamSet;
unsigned int index = 0;

/*清理结构变量的内容*/
对于(index = 0;index < size_ParamSet;index++)
{
p[index]= 0;
}
edmaResult = edma3OsSemCreate (0、&semParams、&AppSemHandle1);

if ((edmaResult!= EDMA3_DRV_SOK)||(AppSemHandle1 = NULL)
){
UART_printf ("初始化应用信标句柄时出错\n");
return;
}
edmaResult = edma3OsSemCreate (0、&semParams、&AppSemHandle2);
if ((edmaResult!= EDMA3_DRV_SOK)||(AppSemHandle2 = NULL)
){
UART_printf ("初始化应用信标句柄时出错\n");
return;
}

if (hEdma)
{
uart_printf ("edma3init()传递了\n");
}
否则
{
uart_printf ("edma3init()失败、错误代码:%d\n"、(int) edmaResult);
}

uint32_t Istpassed = 0U;
uint32_t numenabled_= 0;
uint32_t chid = EDMA3_DRV_DMA_CHANGE_ANY;
uint32_t TCC = EDMA3_DRV_TCC_ANY;
uint32_t BRcnt = 0;
int srcbidx=0、desbidx=0;
int srcidx = 0、desidx = 0;
BRCnt = bcnt;
/*将 B count reload 设置为 B count。 *
BRCnt = bcnt;

/*设置 SRC/DES 索引*/
srcbidx =(int) acnt;
desbidx =(int) acnt;
if (synctype =EDMA3_DRV_SYNC_A)
{
/* A 同步传输模式*/
srccidx =(int) acnt;
desidx =(int) acnt;
}
否则
{
/* AB 同步传输模式*/
srcidx =((int) acnt *(int) bcnt);
desidx =((int) acnt *(int) bcnt);
}

/*通道1*/的设置
TCC = EDMA3_DRV_TCC_ANY;
ChID = EDMA3_DRV_DMA_CHANGE_ANY;
/*请求任何 DMA 通道和任何 TCC */
if (edmaResult = EDMA3_DRV_SOK)
{
edmaResult = EDMA3_DRV_requestChannel (hEdma、&Chid、&TCC、
(EDMA3_RM_EventQueue) 0、&callback1、 空);
}
否则
{
UART_printf ("\n 通道请求失败\n");
}
if (edmaResult =EDMA3_DRV_SOK)
{
/*用传输特定信息填充参数集*
/ ParamSet.srcAddr =(uint32_t)(srcbuff);
paramSet.destAddr =(uint32_t)(destbuff);

/**
*小心!!!
* SRCBIDX/DSTBIDX 的有效值介于–32768和32767之间
* SRCCIDX/DSTCIDX 的有效值介于–32768和32767之间
*/
ParamSet.srcBIdx = srcbidx;
paramSet.destBIdx = desbidx;
ParamSet.srcCIdx = srcidx;
paramSet.destCIdx = srcidx;


*小心!*!*!
* ACNT/CBNT/CCNT 的有效值介于0和65535之间。
* ACNT/CBNT/CCNT 必须大于或等于1。
*数组中的最大字节数(ACNT)为65535字节
*帧中的数组最大数(BCNT)为65535
*块中的最大帧数(CCNT)为65535
*/
ParamSet.aCnt = acnt;
ParamSet.bCnt = bcnt;
ParamSet.ccnt = ccnt;

//对于 AB 同步传输,不使用 BCNTRLD。 */
ParamSet.bCntReload = BRCnt;

ParamSet.linkAddr = 0xFFFFFFu;
/* src 和 dest 处于 INCR 模式*/
ParamSet.opt &= 0xFFFFFFFCu;
/*对 TCC 进行编程*/
ParamSet.op=((TCC << opt_CCT_SHIFT)和 opt_CCD_MASK);

/*启用中间和最终传输完成中断*/
//ParamSet.op=(1 <<OPT_ITCINTE_SHIFT);
ParamSet.opt |=(1 << opt_TCINTEN 位移);
ParamSet.opt |=(1 << 3);

if (synctype =EDMA3_DRV_SYNC_A)
{
ParamSet.opt &= 0xFFFFFFFBu;

}
其他

{
/* AB 同步传输模式*/
ParamSet.opT|=(1 <<OPT_SYNCDIM_SHIFT);
}

/*现在,写入参数集。 //
edmaResult = EDMA3_DRV_setPaRAM (hEdma、Chid、&ParamSet);
if (edmaResult = EDMA3_DRV_Sok)
{
UART_printf ("\n 参数集成功\n");
}
其他
{
UART_printf ("\n 参数集失败\n");
}
}

if (edmaResult =EDMA3_DRV_SOOK)
{/*
需要激活下一个 param*/
if (syncType=EDMA3_DRV_SYNC_A)
{
已连接线缆= bcnt * ccnt;
}
其他
{
/* AB 同步传输模式*/
已连接线缆= ccnt;
}

对于(i = 0;i <已连接、i++)
{
irqRaised1 = 0;

/*
*现在启用上述计算次数的传输。
*
edmaResult = EDMA3_DRV_enableTransfer (hEdma、Chid、
EDMA3_DRV_TRIG_MODE_MANUAL);
if (edmaResult!= EDMA3_DRV_SOK)
{
UART_printf ("EDMA3_TEST:EDMA3_DRV_enableTransfer "
Failed、error code:%d\r\n"、(int) edmaResult);
break;
}
否则
{
UART_printf (
"EDMA3_TEST:EDMA_DRV_enableTransfer 成功、返回代码:%d\r\n"、
(int) edmaResult);
}
edma3OsSemTake (AppSemHandle1、EDMA3_OSSEM_NO_TIMEOUT);
/*等待完成 ISR。 *
while (irqRaised1 = 0U)
{
//等待完成 ISR。 //
//uart_printf ("正在等待中断...\n");
}

/*检查已完成转接的状态*/
如果(irqRaised1 < 0)
{
//发生一些错误,则从 for 循环中断。 /uart_printf
("\r\ndma3_test:发生事件错误!!!\r\n");

/*首先清除错误位*/
edmaResult = EDMA3_DRV_clearBits (hEdma、ChErrorid);
break;
}

}
/*匹配源缓冲区和目标缓冲区。 *
if (EDMA3_DRV_Sok = edmaResult)
{
for (i = 0;i <(acnt * bcnt * ccnt);i++)
{
if (srcbubuff [i]!= destbuff [i])
{
Istpassed = 0U;
UART_printf ("EDMA3_test:数据写入-读取匹配"
在 i =%d\r\n"、i 时失败);
break;
}

if (i ==(acnt * bcnt * ccnt))
{
IstPassed = 1U;
}

/*释放先前分配的信道。 */
edmaResult = EDMA3_DRV_freeChannel (hEdma、Chid);
if (edmaResult!= EDMA3_DRV_Sok)
{
UART_printf ("EDMA3_TEST:EDMA3_DRV_freeChannel()失败,"
"错误代码:%d\r\n"、(int) edmaResult);
}
}

返回 edmaResult
;}

void callback1 (uint32_t TCC、EDMA3_RM_TccStatus、void * AppData)
{
(无效) TCC;
(空) AppData;

开关(状态)
{
案例 EDMA3_RM_Xfer_COMPLETE:
/*传输成功完成*/
irqRaised1 = 1;
中断;
案例 EDMA3_RM_E_CC_DMA_EVT_Miss:
/*传输导致 DMA 事件缺失错误。 */
irqRaised1 =-1;
break;
案例 EDMA3_RM_E_CC_QDMA_EVT_Miss:
/*传输导致 QDMA 事件缺失错误。 */
irqRaised1 =-2;
break;
默认值:
break;
}
edma3OsSemGive (AppSemHandle1);
}

/*回调函数2 */
void callback2 (uint32_t TCC、EDMA3_RM_TccStatus、void * AppData)
{
(无效) TCC;
(空) AppData;

开关(状态)
{
案例 EDMA3_RM_Xfer_COMPLETE:
/*传输成功完成*/
irqRaised2 = 1;
中断;
案例 EDMA3_RM_E_CC_DMA_EVT_Miss:
/*传输导致 DMA 事件缺失错误。 */
irqRaised2 =-1;
break;
案例 EDMA3_RM_E_CC_QDMA_EVT_Miss:
/*传输导致 QDMA 事件缺失错误。 */
irqRaised2 =-2;
break;
默认值:
break;
}
edma3OsSemGive (AppSemHandle2);
}

void testEDMA_wrapper (void)
{
//TaskWrapper
testEDMA (MAX_ACount、MAX_BCOUNT、MAX_CCOUNT、EDMA3_DRV_SYNC_A);
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好。
    我得到了 sth。 有关此主题的新内容。 我将 src 地址更改为 L3高速缓存、EDMA 传输正在成功运行。 也许我不知道了解 DDR 有什么意义吗?
    提前感谢、
    Jim
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jim、

    不确定您的 L3意思、AM335x 中只有 L1和 L2高速缓存。

    您能不能在这个主题 https://e2e.ti.com/support/embedded/starterware/f/790/p/301593/1055889#pi239031350=3上获取

    请务必仔细阅读、因为它很长、但我认为您将能够从中提取一些有用的信息。

    此外、请注意、PDK 有一些 BBB 示例、这些示例在这种情况下会将 DMA 用于各种外设、以防这是您的目标方向。 希望这对您有所帮助。

    Lali

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

    对不起、我指的是位于0x40300000的内部 SRAM。 为了澄清这一点、我想将 DDR 复制到 DDR。
    我去了几乎所有 Sitara DMA 示例、遗憾的是、其中没有一个示例涵盖了我的用例。 我所处理的所有示例仅从某些外设(器件缓冲器甚至 SRAM)复制到 DDR。
    正如我在之前写的那样、我想将位于 DDR 上的特定数据数组(例如、位于0x8500000)复制到 DDR 上的另一个位置(例如、位于0x86000000的空间)。 我尝试重做11.3.19.1 AM335x_technical、referenc_manual.pdf 中的 EDMA 块移动传输示例。

    提前感谢、

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

    我想谈谈这个主题。 到今天为止、我还没有找到解决此问题的有效解决方案。

    提前感谢、

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

    我再次希望有 sth。 有关此主题的新内容。

    此致

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

    我再次希望有 sth。 有关此主题的新内容。

    此致

    Jim