嵌入式开发者社区

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

作者: tulipyyf    时间: 2014-12-22 14:35
标题: upp问题,在SYSBIOS下的应用问题
下面的任务,只能在第一次执行UPP时成功,后面的均不成功,请创龙工程师看看为什么?3 x8 B1 W+ c1 {3 U
Void UPP_TASK(Void)
: f" q5 `: ]* L7 y  r8 |2 ]2 r{
) A% @( u! u& \% O+ m! u; ~5 a( T% z9 t) }7 T/ R0 o" P
    int i,j,k,target_int_count=2;
% M. Z$ v1 J/ y$ K1 Q    char ch[2];0 n5 N( o% j3 M3 d  a
* i. z. L9 W7 @% l/ ^# U% |7 t
/ G0 ]0 `5 `. w$ v2 j' h# H- G
- h* y! S; m: z2 z2 ^* }
    upp_interrupt_count  = 0;/ i* _6 L0 C' ^1 d
    upp_error_count = 0;
7 Y0 K/ `( [. o8 S: A; [: b7 r* [2 J
    UARTPuts("\tResetting uPP buffers...\r\n",-2);2 t' A; r$ \' b. L1 k8 Q
    // Initialize data buffers- i7 P+ L% w; e4 i. \9 l
    for (i = 0; i < upp_frame_size; i++)
. K" P8 ~' l6 g+ G    {3 U3 i4 t3 Y5 A3 a5 |3 L' ^0 K
       upp_buffer_b =i;, B9 D8 b! C$ X6 \) \3 I
       upp_buffer_a = 0xDEAD;
7 x3 q  S% e: x& o    }
8 \/ Q& p* ^' O# j
4 }  B/ D6 \' x1 b& G    //for(i=0;i<1024;i++), f/ K* P& A; z1 a1 `
    //    temp=0;
! r5 p( |' y9 X2 `9 [' p& d& r) H% z
    //UPPReset();, k  i1 n( k. w# |! G2 W+ U1 T
    /*启动UPP DMA传输*/' v" U8 o% M' m4 C! z. W+ F
    UARTPuts("upp_prog_dma_i\n",-2);4 `2 @) ^2 ^4 {
    upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;
7 e) h& i6 U: M2 D& h    upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);' o: U; t9 q; C5 d
    upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);
; o4 I0 B+ `6 D: H1 i5 {
% m! p+ e8 @! L; g- B4 i( X- U8 Y    UARTPuts("upp_prog_dma_i\n",-2);
' f. L! n- L) v# c$ \) s    upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;
0 Z8 Y; L- E! p+ b1 B    upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
# W; b5 w3 R, l+ |' \; v    upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);9 @* C3 I( @0 z" }8 |- C3 @! U

7 j  Z0 D0 O: b$ k, @) z, K* s    /*等待UPP传输完毕*// C8 U& a. L4 [
    //i=0;* W. Q6 O& e4 M1 H
    //j=0;+ L( |' r& X8 W/ F  a
    while (upp_interrupt_count < target_int_count && upp_error_count == 0)  E$ U3 K- s! \2 |, o  Q3 N7 F) N
    {4 r# l- h* d. M$ j  `, U
        /*  测试UPP传输的同时操作普通DDR数据, k- F, F5 h5 i5 G
        temp=i;0 l& l; f& e8 b3 P8 P# M  A4 {
        i++;
& F/ _& H. m4 q1 u4 @! J5 O        if(i==1024)* t8 M5 r- S4 k  z. c
        {3 {; c# Y* E1 X5 V" P: R
            i=0;8 D* F! k6 d' Q3 J) U% J/ D
            j++;' V4 N1 ~( S, Z7 Z3 y' Y
        }2 O! t" \" Q3 S8 _- y) A
        */
: h5 C( M& ~/ H  X: m/ u: b; G4 ?
  x- I) V. n* ?* {1 D/ w' ~       asm(" nop");
& K2 B% K  ^5 }0 P9 o5 i6 }8 {" B: Q# \. E1 q- E  Z0 z# l7 @
       //UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);) N2 k1 m( B3 f. ~* C1 |! P* P
    }
. Z( X1 o& V4 g$ l
1 v: P- ]& R0 d' j3 R  H    /*检查UPP传输的数据是否正确 (loopback modes only)*/$ X3 s# o; m% A- K1 K, X! j
    //UARTprintf( "i=%d\n",i);7 {+ t$ t* j# M' A! L( b
    //UARTprintf( "j=%d\n",j);4 b1 G& C2 M% K" |
    UARTPuts("Data mismatch in buffers.\n",-2);. F; O, @7 W/ M1 Q/ j
    if (upp_interrupt_count == 2 && upp_error_count == 0)$ k3 |0 d5 h4 ?  A$ r9 Q$ |+ Q' |
    {. a5 Q; F% o5 I1 S! n
        for (i = 0; i<upp_frame_size; i++)+ \. a. ?$ i( t7 ?
        {
. }& b) ?% O( N4 L+ L            if (upp_buffer_a != upp_buffer_b)3 m7 ~  T$ p2 Z: J4 q# r! s0 p
            {. n9 E6 h0 c7 i& j" C* G& L
                upp_error_count++;
% z2 a1 `. U" ^, z9 q) Y9 B! Y0 |            }
# V' K4 `& P* s; I! a( ]# H        }) Z  m) B+ @+ Q5 \9 R$ F
    }: Z! p. J8 K3 K9 z6 c8 F; q
- q" e' y% O5 ]" r% K, D. C
    /* 报告通信结果*/2 g& a9 w/ M$ k* o& b+ I; x, g
    if(upp_error_count != 0)) q7 l2 X" ^7 R& H0 h
        UARTprintf( "upp_error_count=%d\n",upp_error_count);
& ^8 o- W2 L  H    else
$ I  y2 I) ?# J  x9 D8 k5 d        UARTPuts("uPP transfers complete!\n",-2);8 M5 U0 _) l/ S7 V$ u
0 T0 W( x' g& V; m; Q' x8 }, D
    UARTPuts("Do you want to print all the data?(y/n)   ",-2);5 b+ T( D) w$ p' {
    UARTGets(ch,2);2 w2 E4 ]6 M  T0 r) J7 X4 X+ D
    UARTPuts("\n", -2);
3 J$ F( Z/ f9 k1 _) c
* Q2 V% E% r4 d! Z    if(ch[0] == 'y')! v" }, t( v/ Z7 A, H4 z$ S$ W
    {
7 \0 E! X# U5 g% W        /*打印全部读到的数据*/
; ~4 b4 x; c% w6 a+ i9 U8 ^( b1 h$ U        for(i=0; i<upp_frame_size; )- @- P0 S3 g8 |0 [# T0 m2 M
        {
0 z& a) K; ^* Y2 W            for(j=0; j<5; j++)" Y9 d: i( d/ b7 _  w8 {) D) I
            {' m+ I9 Z, Q% l3 K6 d0 G
                UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a);$ d6 M- l1 F2 [$ k
                i++;1 }1 m0 q) _# ^
                //if(i >= 4096)
% ]" M0 d- H  p6 j6 R                //    break;$ }* m4 ^! M! l3 W) @. P

4 e8 s! g$ ], q2 n; q" U            }
* p; c' K5 r2 u            UARTPuts("\n",-2);
( b6 S) t/ j' ]# z; A. }        }
7 k+ Z$ T  \% H$ A6 b& n1 ?9 Z1 `- _    }6 J& U" l: a4 Y9 x  r9 b/ y) o
7 x/ f; V* s/ X
}
$ ^# [, e8 ]/ i3 u( ^1 S" f) _
4 Z- e) I- R$ R. i' ?6 J, l
5 E* u9 O; ~, o" G  ^  J7 E( T" X

作者: tulipyyf    时间: 2014-12-22 16:08
追加说明:任务是空闲任务,因此没有做循环。
5 D6 U! [  D8 Z  A: J, g
作者: Lewis    时间: 2014-12-24 18:06
多次执行是没问题的,最好不要用空闲任务,优先级太低。
" ~) P& `5 k8 a( c7 G




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