嵌入式开发者社区

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

作者: tulipyyf    时间: 2014-12-22 14:35
标题: upp问题,在SYSBIOS下的应用问题
下面的任务,只能在第一次执行UPP时成功,后面的均不成功,请创龙工程师看看为什么?
' O) h: _1 d; M1 ]$ @2 O
Void UPP_TASK(Void)
' i# m: d+ _) P3 E7 j9 Z{
  w& ]: L6 e' f4 I+ o; C: A: N$ q' [& T  @  t: K$ v) K
    int i,j,k,target_int_count=2;) i% ^9 M% F0 A; c* b/ G! i
    char ch[2];( _  l( N! f% v" U
% v, P3 P9 a3 t$ ^3 _
* [& i, D4 P. B) {/ U/ Q5 ]

' ~% Y$ p! V  q$ N* P  z4 [    upp_interrupt_count  = 0;
; Q; q5 d  Y: X+ x0 K8 X$ x  n    upp_error_count = 0;
/ w$ h/ n+ }* w! e
% b# d* Y2 a" b/ I+ D( J; |    UARTPuts("\tResetting uPP buffers...\r\n",-2);
$ {9 |! K+ K3 v% ^) I0 R0 _) l    // Initialize data buffers
- p2 N7 J% n; A) A4 p6 \    for (i = 0; i < upp_frame_size; i++)
& g  T8 s4 ^8 u1 p    {0 r' [& q" V0 ~# H$ k( x
       upp_buffer_b =i;' ?% T0 }# S& c
       upp_buffer_a = 0xDEAD;
& @" W& ~" v6 p7 r! n% r! ~/ N    }
8 V: ]# o$ `, G8 Y" [8 s
4 }) n. C- J. @% `) n9 B) b" x    //for(i=0;i<1024;i++)$ C* r( `) E9 A
    //    temp=0;
5 l: t" G+ T( ~8 X/ H& ^0 @6 E3 a+ {% F1 j- |- o" O
    //UPPReset();
* l, ]0 }- j* h' l/ C    /*启动UPP DMA传输*/, p9 L) Y4 A% a0 A
    UARTPuts("upp_prog_dma_i\n",-2);( F+ d& y8 e5 A- Z( T& J; i
    upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;6 G' V) v( z! U' M9 \4 U: I
    upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
7 u1 T1 i8 G: O# s7 y    upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);! q! t: m* q9 j! A& `/ H/ t' ]
# _! ~/ {4 F  Q" D& d3 S
    UARTPuts("upp_prog_dma_i\n",-2);
1 G  F3 d, I2 Y4 ?. p. ?    upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;- I+ y5 R: P/ ?' o6 ]9 H* t+ j
    upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);0 I( _/ \, Y; P: P
    upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);
) J2 _* w+ I/ o" B- Z" j8 L
8 Z  i  O! ~9 ~: A+ {    /*等待UPP传输完毕*/
  g9 a& n7 H$ Y6 w' y) ^& O6 X    //i=0;
8 I7 ^; N" h3 S    //j=0;
: p9 |7 ^/ ]! w" ~) L+ j    while (upp_interrupt_count < target_int_count && upp_error_count == 0)
5 k/ {* a) b* q# K+ Q2 I& s    {! P# A, j" V3 z0 \
        /*  测试UPP传输的同时操作普通DDR数据
- S7 z( H- t: w/ p- s7 w, h7 i/ x        temp=i;
' @* v, k3 Z: `$ ^3 T2 V        i++;6 G; w8 L5 ?1 R4 T
        if(i==1024), [( [- ^& n" \2 R* p
        {& K. D5 G+ Y4 u( n6 j& l
            i=0;
/ L! V' i+ N; S( E  R/ e! K6 O            j++;
. h  u/ I- U# r2 }        }
3 _$ p& T% ^8 W$ {        */+ T5 ~7 g# U5 |& `% t) e

3 n" |7 \! T3 s4 C, b1 d. Y       asm(" nop");
0 I1 w3 ~& i+ m5 p
) {' e" J$ K$ u4 |4 t" L+ C9 \4 O       //UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);( k+ T0 K0 z7 E& {4 d* N" ~0 ], o
    }
) a  x' y0 r. ?' \2 w! L2 R/ r+ w  z, U) z
    /*检查UPP传输的数据是否正确 (loopback modes only)*/
- A" s  Q' a$ x( H; e    //UARTprintf( "i=%d\n",i);, Q3 m& Q5 _  q) z
    //UARTprintf( "j=%d\n",j);6 v  q  @! F2 B/ k
    UARTPuts("Data mismatch in buffers.\n",-2);7 W9 G5 z/ r! Y$ ^) g* f$ P
    if (upp_interrupt_count == 2 && upp_error_count == 0)
+ @0 k3 T, b1 b    {
' K; U! C  i6 [3 l6 J5 Y, V        for (i = 0; i<upp_frame_size; i++), j: |: ~7 o) G/ X  v7 n9 a! T
        {* a. R- q; M0 l' x' i
            if (upp_buffer_a != upp_buffer_b)
: Z( u$ }7 y$ x7 ?" V0 D/ e0 y            {+ P9 B0 _: q. D+ H
                upp_error_count++;+ C! g3 F; U' b2 M" k8 w
            }
6 q- _/ j: A2 L) f4 J# I        }
3 M! I" [) x' X, b' e/ C    }) `% C* w  m" k& h

1 S$ H- b( l: @/ _5 q    /* 报告通信结果*/
0 G: \: z: Y; G% p3 D( V    if(upp_error_count != 0)
: q  q+ i, U+ N  r5 S$ [        UARTprintf( "upp_error_count=%d\n",upp_error_count);7 H' |  b) D& K& \
    else: E9 l; r9 q: a) z; I, l1 x: Y; y! Z
        UARTPuts("uPP transfers complete!\n",-2);& {7 n9 n$ }. ~, u. r

1 ?' M7 a) ?% t: a7 \. T4 h    UARTPuts("Do you want to print all the data?(y/n)   ",-2);
2 G% _0 T& v- x9 H5 Y    UARTGets(ch,2);
$ a8 B0 i0 q9 Z    UARTPuts("\n", -2);( \5 z" n) y' X* X1 b
% K$ q4 A$ ?) W+ a! g; K
    if(ch[0] == 'y'); a7 }& R( v& \" d
    {  ^. G3 [# k, r8 B' `
        /*打印全部读到的数据*/5 t( Z% A7 Q' n$ A0 ]6 j0 ?
        for(i=0; i<upp_frame_size; )
+ B2 R. ^% k% ~8 K5 ~! K6 v. d' B        {5 L3 W* n: i6 t: ?" p4 T
            for(j=0; j<5; j++)8 b* |: m! J7 u: V& t
            {
" E: _, k& t, I8 h7 o0 C: ?* x5 j                UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a);
6 ?3 |5 S) l3 P. v" k                i++;
( j: W0 w  x5 V4 b                //if(i >= 4096)
: U7 ~# u7 ]( |                //    break;7 \' d8 H3 o5 T; |3 m

& _0 L, q: E* h4 P1 X            }
' H# @9 y' E/ Y            UARTPuts("\n",-2);
* f/ U% Y5 [2 ?        }' X% r7 a5 g: G2 E6 R* c
    }
0 d( P9 L. j) }+ z7 w
9 L7 C( P. @5 x0 K}

7 B  x7 A* X; e  D  c
) Y  T, }( T; t- w* s
; p3 n( s8 ?9 f& i# N7 q6 W$ e

作者: tulipyyf    时间: 2014-12-22 16:08
追加说明:任务是空闲任务,因此没有做循环。
& |8 e2 a2 d0 l) c: H! L) \
作者: Lewis    时间: 2014-12-24 18:06
多次执行是没问题的,最好不要用空闲任务,优先级太低。
9 J6 ]2 Y3 P, V9 L) J, G5 A




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