嵌入式开发者社区

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

作者: tulipyyf    时间: 2014-12-22 14:35
标题: upp问题,在SYSBIOS下的应用问题
下面的任务,只能在第一次执行UPP时成功,后面的均不成功,请创龙工程师看看为什么?
$ |+ Y+ i6 Z, t3 M$ @
Void UPP_TASK(Void), i5 D0 |! D$ X+ [' S
{
1 M" n% ]7 V) G+ y3 h9 `* ~+ e
. D: j' b) T+ ?! e4 O) u    int i,j,k,target_int_count=2;
* d4 o6 @0 M1 S* m  [6 f    char ch[2];
# V0 J" k) m& y- ]
  \5 z5 J: r( z
- ?0 p1 E* D) i7 t! b3 w! V6 V& g  p' f: U3 Z& V! ]( f
    upp_interrupt_count  = 0;
  X  I1 S4 c4 z6 I4 i    upp_error_count = 0;
$ h2 {/ J* T% M1 n
: L% \% P& t! U0 p' c    UARTPuts("\tResetting uPP buffers...\r\n",-2);
; w4 `9 o5 B8 g# h% d    // Initialize data buffers+ J7 _0 R  U" A6 R& @8 X- q7 m
    for (i = 0; i < upp_frame_size; i++)' X+ |' p# @3 |& c7 }: Q2 l
    {, e: v' w4 R6 n. g
       upp_buffer_b =i;
" v. q; X: h/ c' h3 z       upp_buffer_a = 0xDEAD;* _' Y( B3 D& g
    }
& f5 g- ]- Y' M5 g+ _" h7 H, v1 n! m6 z: Y
    //for(i=0;i<1024;i++)+ Y6 B0 o# s5 r( A& R; U
    //    temp=0;
" O8 \. V5 j2 z$ |' Z3 h4 ~# V' ]6 F; p6 Z: d( Y7 D2 S
    //UPPReset();" C# c7 e3 X" |: @1 B( j2 W! P
    /*启动UPP DMA传输*/
* X* z9 [4 n9 m9 o0 q2 N    UARTPuts("upp_prog_dma_i\n",-2);
1 D/ l. t: W3 g- }, c    upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;
  ?! T& y, y* w    upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);& L/ g5 o: a9 v% D: g$ Q
    upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);
% q2 y0 ?2 J; E. ^4 C8 ?3 M0 H* u$ D- Z! C
    UARTPuts("upp_prog_dma_i\n",-2);
! u( {/ _7 E8 F6 ^    upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;' _* f3 ?; ^' ]# P+ E! m8 l
    upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);% n2 V$ o% G! U* y# a$ l: |
    upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);
# O% t* U1 o1 A6 p- o2 C  l3 ~3 b
6 w- O' {# m* y5 y. s$ z    /*等待UPP传输完毕*/
. s1 e$ j, N) }$ z$ G- ~2 o- T+ L2 d    //i=0;
$ L  O0 w( o: w    //j=0;
7 p0 Y! d7 l5 I' v    while (upp_interrupt_count < target_int_count && upp_error_count == 0); E5 W8 v, l# d# `+ M8 e+ J
    {
. Q2 J8 |9 W+ O, g; \$ |        /*  测试UPP传输的同时操作普通DDR数据3 p# ~. J$ b" q4 i, M7 P7 b/ _! W0 g
        temp=i;0 U+ q% I6 S: |) M* I  h6 {
        i++;( P4 p  h; d9 x6 Q  o! h
        if(i==1024)/ R' P) m8 ^, \$ I1 s1 K
        {
( D& Q/ ?' x! v            i=0;3 U6 g: H9 n  U9 k
            j++;8 r5 Q( E* {8 z2 I
        }
/ ]2 P6 b& C9 H  N9 E" C        */0 }( O# P+ A! P- j6 B0 z
& i/ z2 i+ u* X. I) M
       asm(" nop");6 M! T0 l, n2 z. U& }$ D6 C
' T, q" v+ Q' S2 h  t# C% ~- P( k
       //UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);1 C" M( Q3 W% ^$ h0 |( A% B- K: ^' y  j
    }
. J2 T- v7 t* g$ l. A' y/ C+ \/ X; T/ d# `+ _  Y" ]' u
    /*检查UPP传输的数据是否正确 (loopback modes only)*/+ v; ]$ s" V6 ?# f& W
    //UARTprintf( "i=%d\n",i);6 i5 d, _9 S9 `  l% G! s+ r
    //UARTprintf( "j=%d\n",j);
/ s$ S# O2 k! d- k; E    UARTPuts("Data mismatch in buffers.\n",-2);5 B0 g) r8 |& m3 P' _
    if (upp_interrupt_count == 2 && upp_error_count == 0)
2 O8 W! l& p$ s& [6 S0 T2 L    {+ U( K# ]  P6 P4 X+ U
        for (i = 0; i<upp_frame_size; i++)5 i$ G/ |1 a3 P+ y8 u* b' p
        {
7 B6 t+ A( n5 J/ b- T            if (upp_buffer_a != upp_buffer_b)+ _5 V) p6 ?9 I* w; m# C3 l- Q6 L
            {
; u- q1 @8 @" Y% u4 R4 w5 {1 E                upp_error_count++;
% c. U' W  O! ]# b            }1 V2 L4 M' W! S. k# ^6 @) M
        }( T' r- V" C2 ^; z" D
    }
" y  r' M4 ]8 m; z' X4 N% r: o- @9 B" y1 e* U/ w2 a
    /* 报告通信结果*/6 g. l- d0 K, I  F8 @
    if(upp_error_count != 0)4 a/ i( R+ O! H( c3 w' H
        UARTprintf( "upp_error_count=%d\n",upp_error_count);# a- y" B1 J4 a" W* z; q
    else
/ |* G: V) Z6 i        UARTPuts("uPP transfers complete!\n",-2);
& Q5 o. A9 s. W$ s/ P. h- _, I5 x6 d1 v; E0 l# N% k" s
    UARTPuts("Do you want to print all the data?(y/n)   ",-2);
$ z0 }" B1 r2 g! [' D' h    UARTGets(ch,2);! u2 ]( F* s$ @
    UARTPuts("\n", -2);" ]) D2 g4 F( N
/ s2 U% h, T# J* F* g" Y9 x) u
    if(ch[0] == 'y')
6 h  ~8 `; M6 m, }* y    {
# Z* v4 ?$ n& G9 t; d        /*打印全部读到的数据*/$ e9 J4 F$ I  j8 E0 o
        for(i=0; i<upp_frame_size; )! I8 c& z- b) R1 N/ B- A
        {
* [. ]7 G. W3 {$ F" K            for(j=0; j<5; j++); Q+ M; Z7 h0 S
            {( O* U& Y% }# I8 Y/ Y
                UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a);1 G- T+ {9 [* C2 U
                i++;
0 ?3 j2 V# Y- X, ?: x7 n                //if(i >= 4096)/ j+ j! M6 L0 n2 }* e
                //    break;; `6 x- m+ \- Y0 Y+ J" j8 }! S

! b/ r! O& [" y            }
5 J4 ~1 x5 G  ?# `8 B            UARTPuts("\n",-2);
: H8 E# n, C2 [3 ^+ {        }
8 V9 D* z; n1 @    }
  O* \7 K3 h) l, V6 S; h+ T4 c1 f8 C( l& I! y# Y1 D* G8 D
}
) O4 W9 k9 k7 Z$ }" u

# v& b( _( t! r" P; E2 \2 e( Q* d7 d4 N
+ `' R# p  L# a
作者: tulipyyf    时间: 2014-12-22 16:08
追加说明:任务是空闲任务,因此没有做循环。! p% R6 S# N( G

作者: Lewis    时间: 2014-12-24 18:06
多次执行是没问题的,最好不要用空闲任务,优先级太低。
% Z! g- K$ E' [! M




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