嵌入式开发者社区

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

作者: tulipyyf    时间: 2014-12-22 14:35
标题: upp问题,在SYSBIOS下的应用问题
下面的任务,只能在第一次执行UPP时成功,后面的均不成功,请创龙工程师看看为什么?
7 E! w  w/ r% y4 F2 s& Q6 Z# u
Void UPP_TASK(Void)! C- O* n4 i% {; I( L$ V$ O
{& T  n5 `, z* ^# p3 n
# I$ f# d& z/ X: {# S. r& T: U8 L
    int i,j,k,target_int_count=2;4 W& j" O  ]9 ?
    char ch[2];
; r7 f0 H+ p, P! }# j& J  r
' i% @1 o8 e6 {7 K* r7 K# |5 F0 Y. ^; j6 _6 q

0 B' Z+ |+ x) \0 F    upp_interrupt_count  = 0;
% p1 s( |/ d4 C# @    upp_error_count = 0;8 g3 S* h+ X- G# o9 q6 v

6 t/ w! Q+ A1 O7 x# J" w$ x4 l    UARTPuts("\tResetting uPP buffers...\r\n",-2);
* H9 n9 ~3 h" d5 P" L    // Initialize data buffers
* h# c2 ~( E$ d6 Q9 L  }    for (i = 0; i < upp_frame_size; i++)0 i1 s+ M% N8 U3 W# Q' D
    {8 c; f6 P% I; Z; F7 m2 }
       upp_buffer_b =i;6 L. C: ]& l) L4 F4 u$ q
       upp_buffer_a = 0xDEAD;
5 ^4 b8 [: S3 E    }
6 G' y" H7 ^' S$ e9 Q2 T! v- i1 ~9 U9 b" t0 i6 p8 Q
    //for(i=0;i<1024;i++)
( L7 X  W  B8 X    //    temp=0;3 \- z& z8 l( M) {5 X

# {3 E, I% _. ]1 T9 R    //UPPReset();) _, j$ U8 R1 Q4 I
    /*启动UPP DMA传输*/
& R+ _8 H! v) n) ^& s3 F    UARTPuts("upp_prog_dma_i\n",-2);
) }8 m$ I+ F( i    upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;
% e5 C' e3 Y3 L0 t: H+ i7 W( P    upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);3 m% @& X  y0 v. r- b
    upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);
9 ^9 Z5 u# Z! Z# A
0 e# U7 F, w5 t% _    UARTPuts("upp_prog_dma_i\n",-2);
- ]' b7 f& x7 A8 K; n' g. d- q    upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;8 {% i+ P! s0 w6 _
    upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);: C. v% O" ?; ^, s$ `5 p) d- A  B
    upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);
- ?+ L, G: O& C4 K" F5 p( M8 f5 N; R7 W- x
    /*等待UPP传输完毕*/
& U$ l2 p" z/ a. L% Y    //i=0;. z4 e! z4 L& [; y1 }) ~
    //j=0;2 q) A+ y' U5 a1 t, W# J9 S: e/ ?
    while (upp_interrupt_count < target_int_count && upp_error_count == 0)% M( M1 l" A8 W$ s6 V4 |/ h
    {
8 G5 R; K0 A5 G, v# d        /*  测试UPP传输的同时操作普通DDR数据  d9 e0 l. y" I: B( p, A
        temp=i;- R, f4 E4 o' H. T2 J* V; d! p
        i++;. U8 z+ Q6 r; o6 N
        if(i==1024)4 Y- t5 s5 `4 S' [, T# u# U5 Q; @$ `5 R
        {
1 P3 I$ ?4 l2 p/ V            i=0;
8 u: n, J; n0 e7 z1 Z2 G9 b            j++;0 `- f# S9 t  Q2 Q
        }
6 E7 `/ C1 k" p$ e8 g) d7 j8 E        */3 l9 O# A3 i% k8 ?8 a

7 }4 t4 Y8 ?5 l5 C* f- U       asm(" nop");
5 G% g1 a. @! y$ b- J2 v9 z3 K: A+ c8 p: z0 [5 T$ i7 z
       //UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);& g8 }* u- ]' O7 U
    }/ e$ X5 x4 A" A6 x

+ m" C+ D$ u8 V    /*检查UPP传输的数据是否正确 (loopback modes only)*/
& C8 b% m% C8 h    //UARTprintf( "i=%d\n",i);
" S2 ]/ ~0 l  |& `' L    //UARTprintf( "j=%d\n",j);0 a6 |% ?- Q# i4 G' T
    UARTPuts("Data mismatch in buffers.\n",-2);
/ W' G- j8 C) ^) i, S! y8 i  Q    if (upp_interrupt_count == 2 && upp_error_count == 0)
; S1 B- R$ ]8 R) N* _1 f! A    {
% v3 q6 _2 I' x$ b* r+ q- U7 `3 J        for (i = 0; i<upp_frame_size; i++)8 T6 h* V. T& E! j9 G; O# u
        {: E4 }! O% B# |2 q; Y" G
            if (upp_buffer_a != upp_buffer_b)
  P% ^  A$ s- g% I6 Y            {0 m; Z3 b* A( U5 y2 U) D
                upp_error_count++;8 ]1 m, f; |7 `1 u: M. r
            }/ m" q# M2 Y- p0 k" P. A
        }
- d4 k% r0 G9 @    }  Q  V- O6 y" e( _) E0 W
$ T8 _$ A9 ?* S/ v2 U' C2 N
    /* 报告通信结果*/
) ?5 H. U) J( n: d* h, `! k* W    if(upp_error_count != 0)
9 _2 D: M  b0 `" H        UARTprintf( "upp_error_count=%d\n",upp_error_count);
9 g6 g5 c. ?: ~; p2 _0 Q8 W    else% b& J+ x/ ]  ]2 K: b' j
        UARTPuts("uPP transfers complete!\n",-2);
: P8 N$ b; u+ R8 j" l2 s% [3 |
6 L& g5 J! l9 `, J* v) W: g4 l    UARTPuts("Do you want to print all the data?(y/n)   ",-2);) \4 `% W- Y8 V0 X& V
    UARTGets(ch,2);
! ]5 o+ Q6 n" O" i; h; |6 r    UARTPuts("\n", -2);
' O5 t7 w9 N# x1 P4 Q# x% H  \
( h) K$ |& ?+ j0 ^+ u7 O    if(ch[0] == 'y')$ O+ \8 U( ?& M4 @  v; k
    {; P; ?$ {! @0 J) c7 y6 x6 s
        /*打印全部读到的数据*/1 r* {2 t: q* f8 E! {7 K
        for(i=0; i<upp_frame_size; )% M3 B9 F6 o$ d- K6 M$ v. C
        {
& S2 {6 Q/ X% |. J6 ^, T* Q  B. y            for(j=0; j<5; j++)0 v( s4 J1 y4 Q+ @& w4 l
            {! j% m  \( J$ C% G! O9 H  ?
                UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a);
+ y+ o5 @( Z: ^8 r* y/ X) G7 `                i++;3 _; V# `2 o( |3 l8 p
                //if(i >= 4096)
" n: X% i- V  I- h& |. b                //    break;* x4 @  p% o5 P* g, o
2 }2 g8 q$ F3 u
            }( C; h" Y* }9 W5 G1 c
            UARTPuts("\n",-2);
$ Y2 f" L/ x: ]. Z0 }        }
  c# {4 k- K9 c- K6 X* R    }
' v$ l' Y- r, j# v9 ^3 x  `
2 F! M$ }# ?2 E  ?' ?- m}
+ ?. V6 z( E$ \) W8 ^

% d" }' R4 r# O6 c- C
1 S9 J# `% Y# a* y, d
作者: tulipyyf    时间: 2014-12-22 16:08
追加说明:任务是空闲任务,因此没有做循环。- U7 X$ Z2 \4 w) m8 u

作者: Lewis    时间: 2014-12-24 18:06
多次执行是没问题的,最好不要用空闲任务,优先级太低。
" D4 _' r/ t- Q6 p% e6 e8 @2 t




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