嵌入式开发者社区

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

作者: tulipyyf    时间: 2014-12-22 14:35
标题: upp问题,在SYSBIOS下的应用问题
下面的任务,只能在第一次执行UPP时成功,后面的均不成功,请创龙工程师看看为什么?( M. k1 Q8 o7 d. `' n& r" H( R
Void UPP_TASK(Void)& O. M' {/ m4 B. d
{
: c  @8 E; y* ^1 ]0 w
. z& z/ J; z& D    int i,j,k,target_int_count=2;# G0 P7 g5 ~% f% K" d+ @. w  G
    char ch[2];
2 @* H) V) ~$ j) Z* Q9 \* E, c$ P( U

) ?. g( S8 Q9 F; O+ V9 x" N8 o. \7 Z5 @' r6 t/ e6 f$ m5 Y* h
    upp_interrupt_count  = 0;
9 a! U6 @6 J  \    upp_error_count = 0;+ h: b' [. U( u- l( A

9 w% {# n- Z: m1 Y    UARTPuts("\tResetting uPP buffers...\r\n",-2);; y* R! n5 z+ ~6 C- L! t
    // Initialize data buffers
& x2 s8 B2 a" j, m( o& P    for (i = 0; i < upp_frame_size; i++)
6 s" S5 l- s) b. G# t! Q. E    {
: C' W' z3 m0 w: r6 o       upp_buffer_b =i;
- \$ _& b  f  M: v0 Y/ @0 S; ~       upp_buffer_a = 0xDEAD;7 U4 C2 q- S0 L  V- g
    }, K" v: |* s( y( y  e5 s  `

; @7 m+ U% l$ c. p2 r    //for(i=0;i<1024;i++)0 g+ O2 w6 F: ?+ ]. p
    //    temp=0;+ f! C  M; @9 E

) t. ^* |- b3 M8 p' K. N% g% k    //UPPReset();+ w" L0 p' K: x: b. Q5 B
    /*启动UPP DMA传输*/; J& G$ P# M' s5 Z/ `7 ]" x3 @
    UARTPuts("upp_prog_dma_i\n",-2);
' \# n1 p9 _# W, ]5 b' Y( K    upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;/ a$ Y  W! i* q  g  j& V
    upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
8 H/ `8 a* ~- t  A" @    upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);
$ F0 ?6 ]# }! d) h6 O2 o! G7 r+ Q
- {& x* e' _$ V; S4 ?; Z! M    UARTPuts("upp_prog_dma_i\n",-2);$ j, e) z; w9 O- ^8 S# y1 s
    upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;
& @7 l0 \# ?( W. {; ]' Z3 R    upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
9 A' s0 N3 @5 T    upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);
4 K) |' K0 A6 @6 L# {0 _$ v5 Y* t/ `" `! o  J, y
    /*等待UPP传输完毕*/
3 q( y% a/ D( o5 b  H$ Y' |: q    //i=0;
4 y( d. U" z! M. n    //j=0;* v% j% E+ L1 `. |; i& a
    while (upp_interrupt_count < target_int_count && upp_error_count == 0), B0 v5 q; t; w0 e; }
    {
! j8 d/ D, E/ n5 b- B) w: b' B        /*  测试UPP传输的同时操作普通DDR数据5 B8 r4 N# V- w7 d. L2 m
        temp=i;# J" e4 u- P$ {9 _: ?) G
        i++;% E- K% E% c; r# p
        if(i==1024)
: B& M: C1 Q3 e        {
& F( k& [  O: C# w) h            i=0;' m, B" G  i8 \' ~5 s1 g2 ^8 ^
            j++;! p. Y1 t) b2 l3 t; x1 c: P% o5 c
        }
9 C9 q- v& ?( h- _        */  o6 R$ C1 k  B) f1 c4 g, R6 m

1 ]! j( T1 s; m" ]2 @4 ?$ O  k       asm(" nop");
- ^( \7 E2 X  E  f9 Z
( D" b+ e" u+ J" b       //UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);
/ @! Q% I) O; V* F) D    }
5 _* W3 ^' V/ M2 }( V2 ~& h# ]$ n. I. B# U
    /*检查UPP传输的数据是否正确 (loopback modes only)*/' a# w6 |8 w6 S( G! h- e" K
    //UARTprintf( "i=%d\n",i);- N: B! K9 r4 W; a* E# \
    //UARTprintf( "j=%d\n",j);4 e* b' N3 j1 g# T+ K( }" H8 G
    UARTPuts("Data mismatch in buffers.\n",-2);" s# g* I5 {6 g1 }; g0 O5 ^7 h3 [
    if (upp_interrupt_count == 2 && upp_error_count == 0): ?3 b( @+ N- [% Y  w# c
    {
8 {/ f- F. M+ ]; Y. |        for (i = 0; i<upp_frame_size; i++)
  B% {- S, D) h        {
1 I# ?; l0 U9 Z! c* g' K            if (upp_buffer_a != upp_buffer_b)
% ?' _2 a/ e' y            {- f  X0 j6 u" f6 ]6 a! v
                upp_error_count++;- t% i% n: ^' m" O& w
            }
* W4 \" u8 x& H. [$ m& U        }" L4 ]. K$ h# L, o4 v+ E
    }! i/ @! x. S$ V# L  ]3 I& Y1 e2 v

& w$ `8 b) b# o$ i& w  d: s    /* 报告通信结果*/
+ x7 Z4 _2 f2 E; v! x8 z6 @    if(upp_error_count != 0)$ B. J4 z2 I2 Z
        UARTprintf( "upp_error_count=%d\n",upp_error_count);  H1 y( c- t' v$ x* L
    else
+ N5 m5 o! ]/ z8 u: R' I: L2 d2 Q        UARTPuts("uPP transfers complete!\n",-2);
7 `8 g6 ^; e$ O9 F( O
: @* `( e9 S0 q: T& Y    UARTPuts("Do you want to print all the data?(y/n)   ",-2);; ^: V1 Z, O, n/ h4 C8 ]
    UARTGets(ch,2);
* N" c) X1 s  w6 y# X    UARTPuts("\n", -2);5 L( G$ g% x7 `& y

- H; x6 ?3 o# ^4 t4 ?, v    if(ch[0] == 'y')3 J  P, o& h* Z; z+ X  _
    {- R! K/ A$ M6 H7 ~3 [( [
        /*打印全部读到的数据*/4 `2 \' _" c. ]. F& q
        for(i=0; i<upp_frame_size; )
( [( m# S4 I4 n0 o! I# A        {
  i$ y1 q6 b; W4 _            for(j=0; j<5; j++)" o; A8 J, @0 }1 P+ h+ @" }/ g
            {
4 V  L+ b4 b+ U                UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a);
; H, S0 i/ w& g) I                i++;
. x! q1 M9 V. O( d# D. l+ H. k                //if(i >= 4096)
+ W  l8 T; d0 B                //    break;
5 a7 ]( R- D5 |/ m0 o; n1 F7 n  K& o
            }; j4 O4 |( c' ]$ T7 e- B
            UARTPuts("\n",-2);0 ^& s* ]3 d1 T' g1 |3 E: E
        }
2 T" h: q& j, _. i! H1 h! _. ]    }
1 |6 X% I; V4 `5 h9 C+ }: f# b2 `4 x8 I6 C" s4 C5 `2 X4 }, c6 ~: a
}

5 Q9 t; |3 J' c/ W7 {( \
+ \5 A' B, S$ n' g( l0 ?

$ v" D9 \( B# W3 T
作者: tulipyyf    时间: 2014-12-22 16:08
追加说明:任务是空闲任务,因此没有做循环。* W7 a' N3 N: o* L3 M

作者: Lewis    时间: 2014-12-24 18:06
多次执行是没问题的,最好不要用空闲任务,优先级太低。' f0 F. O9 Y6 f' i! X





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