嵌入式开发者社区

标题: upp问题 [打印本页]

作者: tulipyyf    时间: 2014-12-22 14:33
标题: upp问题
下面的任务,只能在第一次执行UPP时成功,后面的均不成功,请创龙工程师看看为什么?
Void UPP_TASK(Void)
{

    int i,j,k,target_int_count=2;
    char ch[2];



    upp_interrupt_count  = 0;
    upp_error_count = 0;

    UARTPuts("\tResetting uPP buffers...\r\n",-2);
    // Initialize data buffers
    for (i = 0; i < upp_frame_size; i++)
    {
       upp_buffer_b =i;
       upp_buffer_a = 0xDEAD;
    }

    //for(i=0;i<1024;i++)
    //    temp=0;

    //UPPReset();
    /*启动UPP DMA传输*/
    UARTPuts("upp_prog_dma_i\n",-2);
    upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;
    upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
    upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);

    UARTPuts("upp_prog_dma_i\n",-2);
    upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;
    upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
    upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);

    /*等待UPP传输完毕*/
    //i=0;
    //j=0;
    while (upp_interrupt_count < target_int_count && upp_error_count == 0)
    {
        /*  测试UPP传输的同时操作普通DDR数据
        temp=i;
        i++;
        if(i==1024)
        {
            i=0;
            j++;
        }
        */

       asm(" nop");

       //UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);
    }

    /*检查UPP传输的数据是否正确 (loopback modes only)*/
    //UARTprintf( "i=%d\n",i);
    //UARTprintf( "j=%d\n",j);
    UARTPuts("Data mismatch in buffers.\n",-2);
    if (upp_interrupt_count == 2 && upp_error_count == 0)
    {
        for (i = 0; i<upp_frame_size; i++)
        {
            if (upp_buffer_a != upp_buffer_b)
            {
                upp_error_count++;
            }
        }
    }

    /* 报告通信结果*/
    if(upp_error_count != 0)
        UARTprintf( "upp_error_count=%d\n",upp_error_count);
    else
        UARTPuts("uPP transfers complete!\n",-2);

    UARTPuts("Do you want to print all the data?(y/n)   ",-2);
    UARTGets(ch,2);
    UARTPuts("\n", -2);

    if(ch[0] == 'y')
    {
        /*打印全部读到的数据*/
        for(i=0; i<upp_frame_size; )
        {
            for(j=0; j<5; j++)
            {
                UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a);
                i++;
                //if(i >= 4096)
                //    break;

            }
            UARTPuts("\n",-2);
        }
    }

}



作者: 希望缄默    时间: 2014-12-22 14:36
本帖最后由 希望缄默 于 2014-12-22 14:38 编辑

在操作系统中 任务一般都是一个无限循环


作者: tulipyyf    时间: 2014-12-22 14:39
我这个实际上是空闲任务,因此总是循环,没有其他任务

作者: tulipyyf    时间: 2014-12-22 14:40
我中断了,每次都进来,就是不知道为什么第2次以后的DMA UPP传输结果错误

作者: tulipyyf    时间: 2014-12-22 14:44
我现在不明白的是,UPP的例程是贵公司样板程序,如果走裸机程序,循环DMA 没有问题,但是在SYSBIOS系统中,使用会发生一些问题,是不是基于startware 的一些函数调用与SYSBIOS之间有冲突,导致DDR操作有问题。

作者: 希望缄默    时间: 2014-12-22 18:43
把缓存禁用

作者: tulipyyf    时间: 2014-12-23 08:32
关闭缓存和打开缓存我都测试了一下,好像没有改变。

作者: 希望缄默    时间: 2014-12-23 09:30
tulipyyf 发表于 2014-12-23 08:32
关闭缓存和打开缓存我都测试了一下,好像没有改变。

你是怎么操作的?
直接在内存管理中将缓存全部配置为内存

作者: tulipyyf    时间: 2014-12-23 09:41
实在内存管理中配置的
H:\共享文件夹\捕获.JPG

作者: tulipyyf    时间: 2014-12-23 09:49
关闭了,好像没有问题了~~谢谢,刚才操作错误。

作者: tulipyyf    时间: 2014-12-23 09:50
但是问一下啊,这样没法用cache了,DDR正常操作会很慢啊。

作者: tulipyyf    时间: 2014-12-23 09:51
难道使用UPP 的DMA 就必须关闭DDR 的 cache缓存吗?

作者: 希望缄默    时间: 2014-12-23 09:52
tulipyyf 发表于 2014-12-23 09:49
关闭了,好像没有问题了~~谢谢,刚才操作错误。



使用缓存需要编程的时候考虑缓存一致性的问题~

作者: 希望缄默    时间: 2014-12-23 09:53
tulipyyf 发表于 2014-12-23 09:51
难道使用UPP 的DMA 就必须关闭DDR 的 cache缓存吗?

跟 uPP 没有关系

作者: tulipyyf    时间: 2014-12-23 09:57
我数组设置的是全局变量
Uint16 upp_buffer_a[upp_frame_size];
Uint16 upp_buffer_b[upp_frame_size];

每次UPP 的DMA 传输就是B->A ,为什么开启缓存会有问题?

作者: 希望缄默    时间: 2014-12-23 09:58
tulipyyf 发表于 2014-12-23 09:57
我数组设置的是全局变量
Uint16 upp_buffer_a;
Uint16 upp_buffer_b;

使用缓存需要编程的时候考虑内存地址对齐及缓存一致性的问题~

作者: tulipyyf    时间: 2014-12-23 09:59
谢谢,我再学习学习~~万分感谢

作者: 378087736    时间: 2015-1-16 14:01
希望缄默 发表于 2014-12-23 09:52
使用缓存需要编程的时候考虑缓存一致性的问题~

那如果不关闭cache,操作UPP的时候,数组起始地址需要64字节对齐吗?

作者: 希望缄默    时间: 2015-1-16 16:36
378087736 发表于 2015-1-16 14:01
那如果不关闭cache,操作UPP的时候,数组起始地址需要64字节对齐吗?

需要

作者: 378087736    时间: 2015-1-21 15:06
希望缄默 发表于 2014-12-23 09:30
你是怎么操作的?
直接在内存管理中将缓存全部配置为内存

syslink下关闭DSP的cache是在config.bld中把l1DMode:"32k", l1PMode:"32k",l2Mode:"32k"这几项去掉么?还有DSP的内存地址是从0xC3000000开始的8M,如果指定UPP传输数据的数组地址为64字节对齐的话,我怎么决定这个地址用哪段呢?

作者: 希望缄默    时间: 2015-1-21 20:27
378087736 发表于 2015-1-21 15:06
syslink下关闭DSP的cache是在config.bld中把l1DMode:"32k", l1PMode:"32k",l2Mode:"32k"这几项去掉么? ...

看 DSP 视频教程 第5章

作者: cqf00    时间: 2015-4-28 08:59

如果跟upp没有关系,那如何对一段使能了L1、L2缓存的DDR2内存数据,实现upp的正确收发。(使用的是C6748评估板 + Starterware)

作者: 希望缄默    时间: 2015-4-29 13:38
cqf00 发表于 2015-4-28 08:59
如果跟upp没有关系,那如何对一段使能了L1、L2缓存的DDR2内存数据,实现upp的正确收发。(使用的是C6748评 ...

用了缓存大部分情况就要维护缓存一致性
作者: cqf00    时间: 2015-4-29 16:13
本帖最后由 cqf00 于 2015-4-29 16:15 编辑
希望缄默 发表于 2015-4-29 13:38
用了缓存大部分情况就要维护缓存一致性

在这之前,我找了不少的资料了,很大程度上,也认为是缓存一致性的问题。
我也查阅了TI的关于cache方面的资料,但是,我还是不知道,使用C6748 + Starterware的情况下,具体该如何“对一段使能了L1、L2缓存的DDR2内存数据,实现upp的正确收发”。
作者: 希望缄默    时间: 2015-4-29 17:23
cqf00 发表于 2015-4-29 16:13
在这之前,我找了不少的资料了,很大程度上,也认为是缓存一致性的问题。
我也查阅了TI的关于cache方面的 ...

参考 EMIF_AD7606v2 例程

如果你还是不清楚的话 就等待我们发布更新的例程吧
作者: fish    时间: 2015-8-28 17:42
您好,请问您提到的 直接在内存管理中将缓存全部配置为内存 具体怎么配置呢?
作者: 希望缄默    时间: 2015-8-29 14:31
fish 发表于 2015-8-28 17:42
您好,请问您提到的 直接在内存管理中将缓存全部配置为内存 具体怎么配置呢? ...

[attach]440[/attach]

作者: fish    时间: 2015-8-29 20:37

谢谢!
请问在将UPP的例程 从starterware移植到sys/bios上时,upp的EOW中断直接移植过去呢,还是要作为硬件中断HWI?
作者: 希望缄默    时间: 2015-8-30 13:46
fish 发表于 2015-8-29 20:37
谢谢!
请问在将UPP的例程 从starterware移植到sys/bios上时,upp的EOW中断直接移植过去呢,还是要作为硬 ...

参考视频教程

当然是 HWI




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4