嵌入式开发者社区

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

作者: tulipyyf    时间: 2014-12-22 14:35
标题: upp问题,在SYSBIOS下的应用问题
下面的任务,只能在第一次执行UPP时成功,后面的均不成功,请创龙工程师看看为什么?1 c- J7 c- J: h' |
Void UPP_TASK(Void)/ X1 Y6 B# \( p! R2 A
{$ N+ i- k* D3 f* N; i- H+ X% i- Q* D8 R

) @6 z$ B1 K' @    int i,j,k,target_int_count=2;
* I$ [% N! P6 r    char ch[2];$ [) _9 q6 V$ v7 w

' z% R4 |( R  ^( q: Z4 o0 C* |, `- C% m) Q8 w1 V" }7 e
- c6 l: u% Y' Z% E7 }4 P, F# b
    upp_interrupt_count  = 0;5 H1 C( s9 N- `" Y: _, @* y1 ~
    upp_error_count = 0;
9 R9 l% W4 T! W: p* Q3 L
. S+ L( \, G& ?    UARTPuts("\tResetting uPP buffers...\r\n",-2);! c0 z. m* L- L
    // Initialize data buffers
2 E- M& g' e! r  k! L+ ?    for (i = 0; i < upp_frame_size; i++)2 K! C* X+ i- N: @4 J- U" O6 g
    {% ~! q: F* C+ M9 _- R3 v: S
       upp_buffer_b =i;
5 b$ A* K; a& m       upp_buffer_a = 0xDEAD;* W; j' E: E9 K4 @" B. M; p
    }
$ E5 T* E) K% _; A& f# I7 F- H7 z
1 w% E( s' f/ d% v9 A    //for(i=0;i<1024;i++)
: K: }3 r! \0 c  T7 V3 g    //    temp=0;
: _$ g" C3 H/ y% C5 Q
: c  T( @6 f' I( Q# h    //UPPReset();. \( q8 w$ V) W2 U* i' K0 s7 k
    /*启动UPP DMA传输*/
" Q+ C: ^; u! L6 Y    UARTPuts("upp_prog_dma_i\n",-2);! h2 v4 B& F% t3 T/ t
    upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;
. X& v0 A  B6 P8 T    upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
* p* f: ^, @3 ~3 d. E% i    upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);
9 s* S9 q( p# P4 [
  ~: ]( g/ u& ^( J    UARTPuts("upp_prog_dma_i\n",-2);/ K! T$ t- Y4 r; t. K3 Z; f9 k
    upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;
. t) d+ o% o5 D4 X# k    upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);5 W+ @! k9 U& f- s: Q
    upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);) y; S) V5 {* Z6 A2 U
. ]3 m9 E/ |7 S9 T% `
    /*等待UPP传输完毕*/# D$ y6 E. r8 Y- y
    //i=0;/ r7 h" v+ C& v6 ]; [
    //j=0;
" @! y) F* U  B    while (upp_interrupt_count < target_int_count && upp_error_count == 0), X& G' x3 D8 c5 M. \
    {
0 I3 R/ H- M$ j1 G" }  w3 t5 ]+ j        /*  测试UPP传输的同时操作普通DDR数据
- N! L! v4 m  m% y        temp=i;8 f0 J( q# M& J) ?, e# Z9 A
        i++;
! s0 M; R8 U- L3 M4 Y. v( |% Z7 Z        if(i==1024); m' c  m4 J' }3 o" G: d& t  U; N
        {
8 O, O( s: i9 Y2 j, {, q6 A            i=0;4 A$ O# k/ m& [9 S. b6 r( Y8 W0 g
            j++;
+ \# J/ X5 ~5 C$ z; ~7 W        }
+ ^/ I7 E9 G3 ?        */$ |5 g4 l5 s2 ]- [( X' c
! ^& \& f4 W7 T
       asm(" nop");' B* \+ _) g  V5 @+ l

1 h0 Q" p$ A: c  d       //UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);9 T* j! N$ v- X; k
    }: ?3 V* T6 R+ `- ^
, e) q  W( z: k, H+ t
    /*检查UPP传输的数据是否正确 (loopback modes only)*/; k* F+ Z0 Q3 ]/ X5 Y2 x- r/ W
    //UARTprintf( "i=%d\n",i);
2 O# p, j2 y7 M9 ^. c. y8 J3 g1 X2 b    //UARTprintf( "j=%d\n",j);
( W$ h) E1 O1 u5 F2 m) n1 u7 m' L    UARTPuts("Data mismatch in buffers.\n",-2);3 _1 H8 \; j9 J6 y* Z' K* q
    if (upp_interrupt_count == 2 && upp_error_count == 0)" E2 W0 H, {7 }  m+ a3 e9 i# P
    {
) p/ T' ]- |3 _" f) @/ k        for (i = 0; i<upp_frame_size; i++)
- F3 H: i! N4 \; S5 ]2 S9 o% u        {  u4 i6 ?2 {. d3 E# c3 g8 @3 u
            if (upp_buffer_a != upp_buffer_b)3 V4 Q8 R! C' f3 s8 I  p
            {
. w3 w; C: p3 V5 r$ {                upp_error_count++;
- Y+ Y9 M' }5 z$ L4 e            }
( X3 i5 h! m  B. c        }2 E4 e- {- e9 h. e: y: M! e$ V. L
    }" j8 @; C7 I- y$ {3 T% U5 R( v! T/ ~

( Z+ u7 w; N6 R& ?% L    /* 报告通信结果*/$ w" q" i% _, t  y
    if(upp_error_count != 0)
% n# D( T. ^7 h; I7 p9 ^  o        UARTprintf( "upp_error_count=%d\n",upp_error_count);
* v. k& p& N! b    else
7 x+ B8 Z2 b0 m7 m# e/ @: q6 ]0 M        UARTPuts("uPP transfers complete!\n",-2);& w3 n! V* q- ?/ t

( g: O/ e- |! t    UARTPuts("Do you want to print all the data?(y/n)   ",-2);
# T  S, A  K% N    UARTGets(ch,2);) l+ O) o. u! O7 }- I
    UARTPuts("\n", -2);
1 f: ]( W) s7 a8 \  ^4 P  y6 c' k5 a& M
    if(ch[0] == 'y'), s& D6 j' n& \1 q$ }# Z% @8 T  n
    {
3 e4 i% g* p  D        /*打印全部读到的数据*/1 `0 `  ?9 |2 I' r3 j" E- d
        for(i=0; i<upp_frame_size; ). u' f. i/ c$ h
        {
2 p3 x9 y8 C6 Q$ B- S6 F0 Z            for(j=0; j<5; j++)
1 J9 Y3 ~1 b% d            {
' D, b/ I' f5 X. N) j                UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a);3 w. Q3 _: l; t7 j/ R
                i++;) f8 X9 m6 l; l0 x  W
                //if(i >= 4096)
* T  r3 g7 L# i/ F8 z                //    break;. i( o( o- b/ J! \8 Z/ e
4 s: V- E: v9 X8 P( Y% _+ ~
            }. i2 R( x* W  F8 t# D, Y
            UARTPuts("\n",-2);0 R4 Y, \- p0 R: X$ N6 Q
        }
" F1 t* R0 Y0 I' P6 N4 Y8 Y    }
! ]4 s+ y4 ^6 p$ b& F  S9 y, X) O5 u/ a$ a  u
}

2 @7 |" B( B' n
3 j7 b  }! [# b; ^

9 P) H. }# ^1 P( e$ Y
作者: tulipyyf    时间: 2014-12-22 16:08
追加说明:任务是空闲任务,因此没有做循环。8 w  u0 A8 d  G: p  ~

作者: Lewis    时间: 2014-12-24 18:06
多次执行是没问题的,最好不要用空闲任务,优先级太低。6 ~% q3 H3 q* d  @0 c2 [





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