嵌入式开发者社区

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

作者: tulipyyf    时间: 2014-12-22 14:35
标题: upp问题,在SYSBIOS下的应用问题
下面的任务,只能在第一次执行UPP时成功,后面的均不成功,请创龙工程师看看为什么?& R0 U! y# L9 V# N
Void UPP_TASK(Void)
9 G! {$ z6 Q6 w{
& c0 w; I+ Q) F+ T0 z! E% L5 P- p$ W
    int i,j,k,target_int_count=2;
: |# q6 h6 s/ c, b8 |* v; Q    char ch[2];
& s2 R) P! ]  x% f( d6 E
# l& H5 ?$ \1 Z5 Z8 L. |5 j" t
, g/ q+ R3 q( t' f) Y
, k5 R3 [) b: b+ b5 W" y    upp_interrupt_count  = 0;: P' M+ L) k1 `. y! y( o9 [; V2 N
    upp_error_count = 0;
# H, }7 x: e$ I; I; S! m$ _; d& B
3 Z1 u1 L; a7 a! [& ]    UARTPuts("\tResetting uPP buffers...\r\n",-2);7 O* K6 \6 u0 K7 B
    // Initialize data buffers8 I* t- v" v3 I, E2 x
    for (i = 0; i < upp_frame_size; i++)) s& Q+ E& L! |& u
    {. v2 Y; j! T  Q. [' |! j9 D4 Q( k
       upp_buffer_b =i;* Z- m! r( H( n2 p6 G3 n/ g, W! |5 ?
       upp_buffer_a = 0xDEAD;+ W0 \' ?  ]- P" U
    }
' m' g# F& ~" m+ |9 A) U" H( `. K+ B6 P
    //for(i=0;i<1024;i++)
+ \& d  w; G; t6 d    //    temp=0;
4 ^+ Z5 |) s2 J
+ g/ u  P8 A0 C$ v: y0 N    //UPPReset();
. }& f8 B! K9 }  L" G# m    /*启动UPP DMA传输*/9 l# D) p& m1 a$ r/ b0 d. {: ^
    UARTPuts("upp_prog_dma_i\n",-2);8 q- S9 _/ e, O, h# T
    upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;
9 i; x* d6 |" Z    upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
5 O3 B3 u  q, O+ M2 L    upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);5 Y$ ~! p: x7 h
$ K6 c# n6 ?$ G. U
    UARTPuts("upp_prog_dma_i\n",-2);
/ V3 D- h4 }* z0 o/ t    upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;
# @5 j! J" J  n, V, u- v    upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);7 ]* ^1 |* H8 X: ^  [! X" k+ i
    upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);7 h' W: {2 _& c3 G, o

# b. Z) \# A& T. t2 i2 F9 s    /*等待UPP传输完毕*/0 w7 u7 X2 C4 s' ]6 k5 j& W
    //i=0;" S* ?6 N7 \4 U
    //j=0;
' c+ j/ h- u- d0 I    while (upp_interrupt_count < target_int_count && upp_error_count == 0)
: A9 K, F3 |2 H    {
( u8 {: B8 Z4 M9 Y! }# O        /*  测试UPP传输的同时操作普通DDR数据
) E! p2 x0 X; O, X% w9 ^        temp=i;0 o' M( E" g9 [( b0 t+ y6 A
        i++;
9 A4 X& L' r& j0 A; D        if(i==1024)
4 [) f" E6 O' [) |& G" T  o        {
- @/ c) {& y3 v            i=0;4 U8 S. ~6 a, u3 p% C, s
            j++;
  I# j  m7 i$ E0 T- F        }$ }! P. h0 N5 Q  n, C7 i
        */: R9 M4 }( [5 ^9 A

% h! I3 y- P% V  ^, q. c. z: |       asm(" nop");
) @6 _0 ~  p9 n( z( u) n0 A
; D; \9 k" Q( h$ S  X       //UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);
8 x# B+ U  X' v: [# @5 L7 z9 r: D    }) l/ I* x7 N8 Y# j( w

+ G8 }5 n6 d8 u8 Q+ x    /*检查UPP传输的数据是否正确 (loopback modes only)*/
0 B" U. t( u9 A$ @: D- V$ B' p    //UARTprintf( "i=%d\n",i);
: |/ j1 a# b3 n( f# g: _    //UARTprintf( "j=%d\n",j);0 X  v" X1 @& q7 N0 G' `: h
    UARTPuts("Data mismatch in buffers.\n",-2);
  ?; k1 `& \8 U3 }& v    if (upp_interrupt_count == 2 && upp_error_count == 0)8 j; m+ y! m' d. d# P1 s
    {  s, m( t( T2 t% X3 E. z7 a6 o
        for (i = 0; i<upp_frame_size; i++)- `% e7 G9 ~- {4 @
        {' U5 i: O1 u- e2 y
            if (upp_buffer_a != upp_buffer_b)6 g4 O  {7 G  G: h8 n
            {# H5 F5 W3 m3 H" d$ j+ r
                upp_error_count++;
8 X  {9 y1 T9 Y9 O1 L# @) q% D  a            }$ R" A: a6 k* ~' a
        }
6 Q5 s  O4 j0 z- w    }  q/ Z8 Y5 v4 M
8 U, o9 t$ i+ W( z
    /* 报告通信结果*/
, J8 ~- N1 |: C1 D    if(upp_error_count != 0)9 a: }& F0 q& n) F4 e8 r+ T$ Z
        UARTprintf( "upp_error_count=%d\n",upp_error_count);# w* V+ Q: p% ?3 M
    else- w" T7 e5 ]! D
        UARTPuts("uPP transfers complete!\n",-2);
/ T+ [. e% p0 S+ h6 D; f' n. R) X% @$ V* d. y
    UARTPuts("Do you want to print all the data?(y/n)   ",-2);, f0 {% O4 s% _# P, i: y& l
    UARTGets(ch,2);
1 |; E1 i5 v* m+ X, Z  Q2 Y    UARTPuts("\n", -2);
- I! X$ T6 d5 [4 I8 e; ~4 Q# f6 A4 n$ N3 ~- J1 P8 o1 G1 {
    if(ch[0] == 'y')8 o) U1 ]! ~! C- w
    {
6 [" A( ]. x" N: Q/ _! `2 e        /*打印全部读到的数据*/
$ a+ M1 c  d! b; L8 V5 ?8 N8 i        for(i=0; i<upp_frame_size; )
; F, `4 R- [9 }. p: s2 B& p% M        {
2 ]/ X& w' u3 s, p' z            for(j=0; j<5; j++)
( c1 p2 y6 C2 w+ C            {
4 @) P7 Q3 O, U' Q5 m" x2 j/ }                UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a);
  c$ h  Q3 _" Y5 W3 a. |                i++;
9 o6 G  u8 L9 i! \) Q! R                //if(i >= 4096). P6 t2 u' \, Q1 F' B
                //    break;) q" F4 e* q. K

! H% g) ~5 y. O9 Q3 f$ A! Q            }$ y) h" z8 ?. L! q) D
            UARTPuts("\n",-2);
* U- n9 U' }: S8 z! T        }
& @1 Y0 ~9 s; s, q$ M; F" s% c- \    }
/ R  ~! V4 I# t, I( O' e! J; b8 g, t0 H& x" e1 m
}
  {! Y/ m5 O% I" t' B8 C
" K8 f8 B+ s( ^: m

/ g2 f% a' _# x+ t3 q
作者: tulipyyf    时间: 2014-12-22 16:08
追加说明:任务是空闲任务,因此没有做循环。
- L' G: u3 _; I! G
作者: Lewis    时间: 2014-12-24 18:06
多次执行是没问题的,最好不要用空闲任务,优先级太低。
# K# D% Z- Q& ]7 y1 }, b. J




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