嵌入式开发者社区

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

作者: tulipyyf    时间: 2014-12-22 14:35
标题: upp问题,在SYSBIOS下的应用问题
下面的任务,只能在第一次执行UPP时成功,后面的均不成功,请创龙工程师看看为什么?( j. C- W. b: `' E
Void UPP_TASK(Void)
/ C3 T/ d, T$ O7 a, O, ]{; N+ a) L  ?* t/ V: j

7 ~5 R% k% o* Z    int i,j,k,target_int_count=2;
( Z" B" i  @2 y% P" P, ^    char ch[2];( {2 p$ P8 g; x/ P: p/ p. D$ ?4 Q6 [
6 r3 X1 s$ p1 P8 B! J* [. E$ a
3 C5 X% x4 L5 S, R6 d

$ Y% g* a! T) |6 p1 t! ?7 m    upp_interrupt_count  = 0;
/ K" H: X9 H% ?" I  X    upp_error_count = 0;
% W7 }2 z# P/ N# ]; H
  S9 B1 D% y2 W0 i8 c- G    UARTPuts("\tResetting uPP buffers...\r\n",-2);( m0 {$ Q& M0 V" Q- D
    // Initialize data buffers
" w$ n- A! m0 {% C& L    for (i = 0; i < upp_frame_size; i++)
) X0 M$ Y4 ?+ _; g6 w7 ^, X5 `) `; r% k    {
  v* X( l) X, p) w       upp_buffer_b =i;
" r) z2 m) [# A$ t8 L6 `( K" @       upp_buffer_a = 0xDEAD;4 ^8 }9 g3 w- z8 M. b% O# h
    }
+ Q6 t' u) L+ H2 ]2 ~
! e: ]7 l- X' e3 w    //for(i=0;i<1024;i++)
$ v0 D, ]( u6 r    //    temp=0;9 T6 k- ]( x) p7 {$ F9 l

& G5 V" }1 H. @0 r    //UPPReset();
* p# I" q3 ?2 s; f    /*启动UPP DMA传输*/
- k: j; q+ P: p3 `. F7 X    UARTPuts("upp_prog_dma_i\n",-2);% i, Z% @- B2 A5 _
    upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;
# T4 t; }4 N) N    upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
+ a+ G9 N( ]5 ?    upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);: @6 H5 p+ c: |. T0 }; C3 b

& B9 q6 ~: z5 y: N9 _    UARTPuts("upp_prog_dma_i\n",-2);/ J% w8 j- X5 e" ?$ j, E0 A) Q3 }4 f
    upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;3 f( v1 J9 k8 q- h( P
    upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);: b) R0 Z$ m7 p% R  J# ]. V) R
    upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);- K% X0 ^6 T! q) l
0 [7 y# {7 A9 H% Z" q( N- j
    /*等待UPP传输完毕*/
8 o* ~8 X) r) T5 @    //i=0;' Y9 ~+ g4 D& H* l2 ?
    //j=0;
, \" D0 \5 M0 ^- L    while (upp_interrupt_count < target_int_count && upp_error_count == 0)0 O# w, [! @7 J% s
    {1 g3 q6 Z+ q, {
        /*  测试UPP传输的同时操作普通DDR数据& M. U( o" X6 m; I- S
        temp=i;: s8 p- }4 G; |
        i++;! U6 t1 ~" @6 h5 M  J
        if(i==1024)" m  Y3 h& Q/ L4 G' ^" e
        {
" |( a  F& S& W% ^# V" G  n            i=0;2 E) M8 ^# ?" g; S. ^
            j++;
; s2 L5 L( L! b7 V/ K. |" U5 ?        }* F0 X' k: e" k; ]
        */
/ h) v2 |' \6 e/ X5 s4 z& O
' h  R0 {, ?5 N       asm(" nop");
7 T1 M( n& `9 p" l$ C, ^
9 N) i  H6 X, a7 M/ m/ @' d       //UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);. T/ K0 q5 d& _0 y
    }, q; ]- q$ z6 C
  u/ x9 G& N- Z& H
    /*检查UPP传输的数据是否正确 (loopback modes only)*/8 t- _8 }7 i. E: K
    //UARTprintf( "i=%d\n",i);0 j  K- l! C: x- H- m8 n1 g
    //UARTprintf( "j=%d\n",j);8 w6 I3 w3 `* w! T9 d, m
    UARTPuts("Data mismatch in buffers.\n",-2);6 a9 }: m  e1 D% y; M/ {
    if (upp_interrupt_count == 2 && upp_error_count == 0)
! v9 I7 v. |' i8 Z( P: I    {7 n% i+ i. F' N+ g4 O
        for (i = 0; i<upp_frame_size; i++)8 E( f! Z" r1 [* j
        {
. D) w# y5 l- u8 Y            if (upp_buffer_a != upp_buffer_b)0 o$ _- C$ p. W2 C) X
            {; I5 ?! n8 ?$ v$ Y- u: a
                upp_error_count++;: H, I0 k4 `: N  @" n  {- o+ t& z
            }6 j, _$ b( B8 Q9 Y' v9 }8 A
        }
  `  h1 X3 d9 T% f1 q! M* @    }! ]: p) p( X' M9 J7 F9 D
* E/ L0 h$ M/ M2 b, p& |
    /* 报告通信结果*/- d* w: T  o; X6 P9 w$ g5 ]2 B
    if(upp_error_count != 0)8 o7 J' m% Y4 v8 j
        UARTprintf( "upp_error_count=%d\n",upp_error_count);
$ j7 C, b) R: r: t3 O" I# a    else
/ g8 Y4 t; Q1 S( e. z5 }& O        UARTPuts("uPP transfers complete!\n",-2);/ Q2 U$ Z1 u/ B: Y, @: i" f
, l' r# r& n  K! j8 `7 U7 q
    UARTPuts("Do you want to print all the data?(y/n)   ",-2);8 C9 S+ P0 L4 Q
    UARTGets(ch,2);0 [( L  Z! _$ L9 l) u6 O
    UARTPuts("\n", -2);
, i* s- q0 A1 B/ |1 w! n& w- O2 ~% Q' B
    if(ch[0] == 'y')9 I( O! }6 H& H, s
    {  s5 Y# e7 [7 L) l5 Y+ m- C
        /*打印全部读到的数据*/* o- n) q: n. x1 K8 `2 b
        for(i=0; i<upp_frame_size; )
2 G+ w8 P5 t/ a- @7 x" d; C& o        {
( ~9 P( ~, r% v: V+ f* {5 k. V3 C            for(j=0; j<5; j++)
- }1 `" J+ i1 w            {
) ]+ T* G! _  w+ B% C& q                UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a);5 A( S1 s& ~4 U+ E% R4 l' W
                i++;/ t: j$ ~6 U& b3 D! E3 m* O
                //if(i >= 4096)2 d- M- ^9 C8 t) g1 }2 X
                //    break;4 H3 u; s" k3 G2 o. ^- w
3 F( I" V% M2 z7 J; ?6 M
            }
8 F( L8 `( t; F4 G3 R0 J            UARTPuts("\n",-2);
( r$ ?3 i2 X" `! X        }
6 }0 I+ N3 Z6 g0 z" t. G- K; G6 Y    }
4 Q% C2 ^, C  x5 Z! _2 p4 V( o$ ?* s2 E3 L
}
0 I( k3 u# J5 I7 F% p% Y( p! T

: Q( e4 v" g- d4 X0 u$ n2 k  K, O5 h( d+ `
4 g8 {/ ?) t9 |# y, @
作者: tulipyyf    时间: 2014-12-22 16:08
追加说明:任务是空闲任务,因此没有做循环。
4 x" [2 R4 K1 A- ~7 n9 P+ D
作者: Lewis    时间: 2014-12-24 18:06
多次执行是没问题的,最好不要用空闲任务,优先级太低。  ?/ o0 ?) R. E$ `





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