嵌入式开发者社区

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

作者: tulipyyf    时间: 2014-12-22 14:35
标题: upp问题,在SYSBIOS下的应用问题
下面的任务,只能在第一次执行UPP时成功,后面的均不成功,请创龙工程师看看为什么?
2 ^- \$ l# ^1 Q) {4 X. L
Void UPP_TASK(Void). O  Y8 a% i0 b- y7 y& i5 M
{1 B1 t0 T8 O; G0 T" @  D' L8 w. `/ p
8 g$ }0 m& Q/ y/ @$ c2 m8 q
    int i,j,k,target_int_count=2;9 t/ D# J* C$ P) @9 F" |
    char ch[2];2 ]* Y( J$ U( t( x$ y5 R8 ^# X; i1 M

0 n5 v5 @/ @  x# ]! z4 A7 Q: {7 c2 x* ~1 z( o9 z4 H. ~- e1 M
& J- k* i! m  X+ `6 M, O5 M. Q, q, a7 _
    upp_interrupt_count  = 0;/ V5 N; c) p7 c: g' D  |5 J) i
    upp_error_count = 0;
" t: i( V' W9 s% o1 P
8 p* }9 ^0 w6 [+ U: z    UARTPuts("\tResetting uPP buffers...\r\n",-2);* L3 S4 f/ n( I! {4 k" u% l
    // Initialize data buffers
- p1 C, A$ o4 H, x1 @# `! r: P    for (i = 0; i < upp_frame_size; i++)
: R3 r3 l  w4 J6 I3 l, h    {4 v% U- ]# k+ P5 T
       upp_buffer_b =i;
# {. l9 o5 K: @4 M       upp_buffer_a = 0xDEAD;
* Q8 V. l$ P, M9 E! n; k1 [    }
  K9 ]% P% r! i. t: W: V/ \$ P5 }! V4 G% S
    //for(i=0;i<1024;i++)3 ?1 L9 T$ [7 f# R
    //    temp=0;
; B% I: r4 Y7 ]1 i2 k, ?9 l! D; H+ N" ~. @9 J+ Y
    //UPPReset();1 D: F% `/ v. [6 T8 v) o6 D( ]
    /*启动UPP DMA传输*// ]5 g; U9 g; ^/ l& s
    UARTPuts("upp_prog_dma_i\n",-2);
. _; ~$ N% k/ G! j9 F6 c    upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;& E: o$ a' w9 j
    upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);2 |) J3 o& X; Q, l# _) H! x
    upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);- {4 a: C' Y# n. a& C0 R
: q* K0 C5 Z+ E: K
    UARTPuts("upp_prog_dma_i\n",-2);5 X6 |# _2 s/ o
    upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;$ J; t, k4 I7 s* {( ?7 N/ I' a# V
    upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
8 Y# ?; T5 N+ i$ N" I; u    upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);6 C/ b5 p' _3 Y9 k3 ?  R3 d
* C8 ?6 J$ U- Q/ v# Y
    /*等待UPP传输完毕*/! o2 E$ Q; @4 u" h) _0 h# t
    //i=0;2 B  j  R6 Y% q6 y( Z. D
    //j=0;
0 G4 t, ^9 B, x; b    while (upp_interrupt_count < target_int_count && upp_error_count == 0): I2 d, `6 `0 i! \
    {
6 ~; e+ m% e, O& C' D8 d7 F' S        /*  测试UPP传输的同时操作普通DDR数据4 \8 _1 w/ a; G+ M2 z3 m* z8 h  |
        temp=i;, F6 T( d& b( b% `" E$ V- e
        i++;
$ x. F' N5 g, c' d  H- i1 W        if(i==1024)5 T' o$ z9 j7 W* W' o2 g
        {7 f) P  C! z. ~+ A
            i=0;
6 \! e" b5 Z$ U7 S5 c1 k            j++;
, F% F8 s0 \: j; v/ J  q: f3 Q        }. L' l/ K* o4 e/ w5 a* X# d3 z
        */
# s9 Y: k; E& T" U1 g4 y* Q& w4 R8 _+ [2 }
       asm(" nop");
; o  Z% j, H$ b  g) K! m
  Y" c, @# `: P& s       //UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);
/ f' f& T4 ~7 m/ B2 j% }9 d, S    }
5 _  _  b2 H9 P. {, P+ S8 @. [2 j- z, K% w
    /*检查UPP传输的数据是否正确 (loopback modes only)*/) \' N1 ]) `+ j9 g
    //UARTprintf( "i=%d\n",i);
. o- @) N' f" t7 t    //UARTprintf( "j=%d\n",j);
; n5 j+ }9 T4 b) S. u1 w- r2 b    UARTPuts("Data mismatch in buffers.\n",-2);
  b: o: m3 C; o0 A; O    if (upp_interrupt_count == 2 && upp_error_count == 0)* r7 B. g4 C6 s
    {
$ g2 R7 @( y" z7 i. d        for (i = 0; i<upp_frame_size; i++)/ l$ z! ^4 t. E" ^. V; f+ \
        {  X" Q" p' }+ Y! C2 Y! y) m! z) _
            if (upp_buffer_a != upp_buffer_b)% X, {& Q& W5 [- p% W  }
            {# Z8 e& |5 p7 p+ D4 t9 {
                upp_error_count++;
( T5 ~) T4 {  i# Q) Y; a( N* t            }
) z3 J3 C, \) l. I0 S0 j- O' B        }
3 n! U% Y. c" }* w% }    }
# p5 J: D! {8 u. L$ _1 R
% i4 |; n( Z$ Q9 A1 Q    /* 报告通信结果*/
9 B- S  a6 h- M+ y    if(upp_error_count != 0)
3 a0 o0 u5 A% W  q4 r% U! y; u) D        UARTprintf( "upp_error_count=%d\n",upp_error_count);
4 z' h6 {( x8 T5 D! T$ r    else
" }/ ]$ h+ A$ |6 F* c        UARTPuts("uPP transfers complete!\n",-2);
) F7 b& G) {; M1 W
  n1 T: }3 `, o5 n. I- y% i4 E    UARTPuts("Do you want to print all the data?(y/n)   ",-2);$ d3 D; @3 D' ~9 y' _9 b
    UARTGets(ch,2);
! V5 b) @% Z, u3 X5 d2 I    UARTPuts("\n", -2);9 B* F/ A' H# _: J

8 h9 [) e5 w  K" ?( W/ P8 |7 W    if(ch[0] == 'y')
8 z. h- r0 M+ E! p- a    {' K& \2 z3 }+ C2 v6 m: z4 H
        /*打印全部读到的数据*/
$ D! @9 C- x6 N' }% j( h0 z& `        for(i=0; i<upp_frame_size; )
& F3 T  `# N1 z; y& o7 P( H8 h        {
" B) J2 f! O0 f0 h            for(j=0; j<5; j++)
' l! x" Z8 N, P& y9 D+ J            {
6 L; V6 c( }- Z: A/ T                UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a);/ |2 s+ p$ b8 \  k  G7 o
                i++;8 T* y+ m+ L1 v0 I# t
                //if(i >= 4096)7 D' p; d; s6 ^$ i6 u3 f1 [# o
                //    break;) O/ @! W& n: o
% S7 y! R8 X6 b# x
            }( X- Z8 W0 L! W. ?1 Z
            UARTPuts("\n",-2);
9 C  g$ U$ X, U$ V        }
2 o8 |3 Y$ Z! m" W    }
3 i+ f* `$ b" Z  K% z  {/ w: j% Y* F" f1 K
}

; V2 e, F1 ~# O4 `

7 K$ ^* K# E7 v# C$ A- o. |' ^! h( P% ]- v9 M

作者: tulipyyf    时间: 2014-12-22 16:08
追加说明:任务是空闲任务,因此没有做循环。8 ?' c7 y( K1 ~9 g% u

作者: Lewis    时间: 2014-12-24 18:06
多次执行是没问题的,最好不要用空闲任务,优先级太低。
0 j& l3 _' w" ^2 p# Q& T0 i" l




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