嵌入式开发者社区

标题: upp问题,在SYSBIOS下的应用问题 [打印本页]

作者: tulipyyf    时间: 2014-12-22 14:35
标题: upp问题,在SYSBIOS下的应用问题
下面的任务,只能在第一次执行UPP时成功,后面的均不成功,请创龙工程师看看为什么?1 s+ ^0 }) w9 h$ q
Void UPP_TASK(Void)% c4 X1 z2 d+ s& V- m
{
. f  s( E" t+ p: e6 Z" B0 r: A2 \( g4 {, @) H  [- r/ f
    int i,j,k,target_int_count=2;8 R5 n! u4 M  g! M; M
    char ch[2];, j- \% f9 e% `2 V5 q" _6 |2 g

& @/ e: l: o7 E4 w& Z
1 k& K, v  V; H5 J( y* N' F  B. H1 P1 f
    upp_interrupt_count  = 0;  d  ?+ g+ S) X' P1 E! q( o
    upp_error_count = 0;, w- N# |: X* M7 j4 Z/ V
- D: E% \, S+ s" c2 G
    UARTPuts("\tResetting uPP buffers...\r\n",-2);* A5 K$ X' t2 @( R- T% ^: E7 U! ]) g" ]
    // Initialize data buffers
( Q6 M2 h- f! O: u    for (i = 0; i < upp_frame_size; i++)$ j1 }/ M* ^2 e5 T
    {6 h) R- K0 Z: q! f! ?/ V
       upp_buffer_b =i;& J8 K- {6 F2 v/ q& F
       upp_buffer_a = 0xDEAD;
5 P! E9 ]5 P5 Z+ P    }
: n9 i3 e/ e  o% T: p( [" w
4 s: s1 c" u% ?    //for(i=0;i<1024;i++)
4 N& Y+ P' A% V* f! U5 Z    //    temp=0;( ?+ Y2 e6 b1 v. y1 @

9 K/ t5 \- A; ^7 O9 {/ j+ t+ H    //UPPReset();. R! {7 b  h, I* f
    /*启动UPP DMA传输*/3 y; @% x, u5 t9 r6 |
    UARTPuts("upp_prog_dma_i\n",-2);6 b( L' Z8 s! x* [
    upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;
9 [, G! }: Y$ J5 |! s" w6 V. q    upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
1 m5 Q, g, R! E$ M% X+ e    upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);2 {! m- P7 h4 I7 o7 Y1 R

2 T- ~. ?# d" @9 V    UARTPuts("upp_prog_dma_i\n",-2);" e. i+ O- G" q; y/ J  N' k" b
    upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;  m3 y: i. W) X4 n. I. o
    upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
) V5 i4 w, j5 _( y    upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);4 \+ [* J  q1 o2 H; }
* Z7 H# N# h' J2 ~
    /*等待UPP传输完毕*/
1 _" L1 T" T3 t    //i=0;
4 |# i) D8 m8 G: k" a    //j=0;
; _  g9 D, n" ~( G$ i% Y    while (upp_interrupt_count < target_int_count && upp_error_count == 0)
& H" Z! E3 w" h+ l3 e" S$ Q1 t% \" X    {
+ h# x6 W8 H$ K( ]        /*  测试UPP传输的同时操作普通DDR数据
, ^8 ?4 a$ O" A, N; E+ ]9 O) {        temp=i;. M+ B3 j; _0 A6 z% J9 x3 s$ @2 D
        i++;9 F, ^1 D$ ~1 D8 Y0 m6 d- k$ X0 d" E
        if(i==1024)6 g! x! f2 ~9 m& l2 n8 p% i' y; B. l9 Y, G
        {
4 T3 m$ Z/ p' g9 t6 \; g8 y            i=0;
7 v5 r/ @, D  ?# p! ]3 A" A            j++;
: O8 j) s4 I7 s# g3 L2 Z& }7 X        }$ c' e& I( U- E- M
        */+ P; Y4 n% H4 k7 \1 `1 @
; W- ~: p/ v' R% o$ \7 @2 D
       asm(" nop");# H* _1 H& S; T2 z- v/ M: Z
" @6 N  G$ O+ k" ]! b
       //UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);) Q! n# ?. Q9 _' C4 s: |  F
    }1 g4 A- I& _: d' V$ V

; p/ n. Q* _1 n/ ^' F    /*检查UPP传输的数据是否正确 (loopback modes only)*/* G+ c0 t& r% e% J/ b; c, v: l  g
    //UARTprintf( "i=%d\n",i);: z- f$ c5 ^6 D; w+ |, A, t/ f
    //UARTprintf( "j=%d\n",j);
4 v. ~- K0 i5 ]8 ]! B/ x8 D    UARTPuts("Data mismatch in buffers.\n",-2);  f5 `7 i' [( Z. |
    if (upp_interrupt_count == 2 && upp_error_count == 0)
# Q4 y. `3 G2 ~' v2 b    {0 O2 V' V% d0 M5 F
        for (i = 0; i<upp_frame_size; i++)
- t+ _9 t. t' c% r7 |' L5 x        {9 V5 f/ j0 I* o3 d2 |7 Y
            if (upp_buffer_a != upp_buffer_b)
9 h# _  Y0 S& E% G7 b' I5 i; w& a            {4 C& f0 A- T. w4 Z" @
                upp_error_count++;# T0 U+ s6 p7 U0 }1 w/ a2 h
            }' R- u! ~: y* |  m% h
        }
& t3 H  ?$ U: m    }- z. [* K+ K+ I% p  O
. a# U. o% Z) ~+ Q$ f
    /* 报告通信结果*/, U# D; n* v  W
    if(upp_error_count != 0)5 x3 X, T9 u7 A7 {8 X4 ~
        UARTprintf( "upp_error_count=%d\n",upp_error_count);
6 J2 n* v, x4 ]- L9 T    else
9 q% O0 V* F& r" B  i+ m        UARTPuts("uPP transfers complete!\n",-2);
4 X4 |1 Y4 n) C0 t7 i1 T. f. X# _; @; V9 C% ?' e* ~  d% R
    UARTPuts("Do you want to print all the data?(y/n)   ",-2);
' [$ m1 n$ {5 f5 m" F/ U    UARTGets(ch,2);' z1 p7 C( U/ Q( }! u9 e, F7 T
    UARTPuts("\n", -2);
! m, @' |5 }$ |* k- ?) y& e% }8 f9 k
    if(ch[0] == 'y')
7 y* ]( _2 v8 y+ ^# M- C    {$ N: L6 f. j, l0 s. E
        /*打印全部读到的数据*/" _+ ^% Y# a+ l+ w) j1 y8 J; _
        for(i=0; i<upp_frame_size; )# n# z5 B% S+ ]  ]5 I; o
        {
, H7 ?% ?9 _- a            for(j=0; j<5; j++)
- V4 \, n( ]& x! \4 x& I            {
* t2 _% \' e  q9 ~3 q                UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a);, y' a  T% L: R: \4 n2 x
                i++;
5 [" a4 l0 l  C5 P/ d                //if(i >= 4096)" v6 f) r- A: |9 N: M
                //    break;
( u) ^* R- _$ C6 x4 E
0 d6 A6 q8 |" c9 ^3 Y            }
' T! z8 s+ e% w% L# o            UARTPuts("\n",-2);
# J8 ^- x' I, z1 {  Q* O        }2 f# R0 K3 ^3 H  q! W! f; f
    }
3 ^% e0 X) Z9 l+ |  G" d6 l( J& T3 B$ ?# F9 I% B" \
}

6 \$ w4 [; Z  C# I

7 S$ d5 @: [! k. s* K" N  H% @# n

作者: tulipyyf    时间: 2014-12-22 16:08
追加说明:任务是空闲任务,因此没有做循环。' g/ R2 b+ w2 H* @% y# z+ S$ B

作者: Lewis    时间: 2014-12-24 18:06
多次执行是没问题的,最好不要用空闲任务,优先级太低。2 H5 H( L. V: B& a. ^





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