嵌入式开发者社区

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

作者: tulipyyf    时间: 2014-12-22 14:35
标题: upp问题,在SYSBIOS下的应用问题
下面的任务,只能在第一次执行UPP时成功,后面的均不成功,请创龙工程师看看为什么?
* `; v! x5 N; F  d9 a
Void UPP_TASK(Void)
: D5 e  r9 x1 p{
, t5 R1 J: ^  K7 b2 p
" u! C0 K& x0 U5 h; b5 O% _: T    int i,j,k,target_int_count=2;
: S# m, D# A, o7 k1 _2 S' g- k% @) K    char ch[2];# x6 C1 S6 t3 j- r

5 b- B1 ?6 ~5 e* j  X- M) [0 L. B/ {; P3 r1 L
; b4 r! T6 z2 T2 W$ ^
    upp_interrupt_count  = 0;: z2 N5 I0 u; D$ B1 E" m- k7 C1 j3 p
    upp_error_count = 0;; s3 r! x. n" x  J

6 P6 J& d$ F2 g; x* A: A5 p    UARTPuts("\tResetting uPP buffers...\r\n",-2);
* p8 D' Q% T9 D- G    // Initialize data buffers
6 f9 u0 S9 ~, _    for (i = 0; i < upp_frame_size; i++)% }$ c9 I& H6 m% g( I( J4 o
    {6 D4 j) y; ?+ Z/ T+ B0 a
       upp_buffer_b =i;
+ O; q+ ]" C2 M2 h/ f, d       upp_buffer_a = 0xDEAD;
  @$ ~( P1 T7 t+ l! |, q    }- ?0 J1 s0 N9 p9 X4 Q

9 [" x) A9 \# w& d" h    //for(i=0;i<1024;i++)
0 a" C# C$ ^7 q3 N" w* _    //    temp=0;. b* e# |! m# i

4 a2 C" u" I/ ~1 Y6 b9 M# D    //UPPReset();
8 X0 o: e0 h0 x    /*启动UPP DMA传输*/
- F* a- L3 P1 c/ U9 P% |    UARTPuts("upp_prog_dma_i\n",-2);
; U4 j3 Q: s/ E* Q; p" J    upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;% Z; u) V+ c! j" }
    upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
& H7 r  L. Z& m3 ], L% s    upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);* B! k+ m1 G- k

" e* C' L! [/ G' L    UARTPuts("upp_prog_dma_i\n",-2);
; b* d: f3 _: p# z' _    upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;8 g  s/ a8 |) k1 {. a7 }
    upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
, I2 d' N+ L  A! e    upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);
1 {* a5 V& i" D- ~' Y: E( [& s
4 Y7 G: ^+ M" h/ O    /*等待UPP传输完毕*/& G- R' U$ @1 N7 k, {: g
    //i=0;
" T) x$ _5 M0 W' k3 j3 ]5 P2 h5 }    //j=0;1 Z3 K. [& W% F7 O
    while (upp_interrupt_count < target_int_count && upp_error_count == 0)) Z0 s, L3 D5 ^
    {- _, q7 J1 w; v0 O% h
        /*  测试UPP传输的同时操作普通DDR数据
; V- E. S" u# Z3 [  m* i        temp=i;
- K; F3 G# b$ A        i++;# Z9 ?: U$ S  I' c
        if(i==1024)
/ M5 d7 _# w6 B) W        {
# X% J9 t! I4 \( O4 d            i=0;& p# \; n* `4 p4 I5 T0 s4 `0 D# N
            j++;/ c6 P- t6 y" l1 ^
        }1 M9 a5 h8 Z5 g8 [; G% i: z0 l1 n1 l  y
        */, U( k. B/ G  l, e( R: u$ p, c3 ]6 a% e
0 o. w+ T; H$ Q7 }3 X" S
       asm(" nop");! i; ~* v. e, g  O
& W4 P0 s' J$ L. _8 q
       //UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);
/ X8 l/ N# X: `+ x, y: U    }2 H. f6 u  {' v2 r

1 ?+ a& o/ F2 t    /*检查UPP传输的数据是否正确 (loopback modes only)*/
# [; e, V0 X' ~( p6 ]8 n; m    //UARTprintf( "i=%d\n",i);
2 `2 B# y6 l+ ^; m8 I0 i0 u    //UARTprintf( "j=%d\n",j);' ~& [4 ^! U5 u9 w! {+ t- g5 u+ M
    UARTPuts("Data mismatch in buffers.\n",-2);
# D# i! _' [6 f3 s' I    if (upp_interrupt_count == 2 && upp_error_count == 0)
: h3 u3 S$ z/ v    {
5 U' `% U3 o+ E        for (i = 0; i<upp_frame_size; i++)  ~/ ^: S! v0 k6 o
        {
1 R! N! h/ ?% Z( ^+ [3 Y            if (upp_buffer_a != upp_buffer_b)' A9 O6 _  |( u7 K& L! x
            {" N3 Y- w# z* @1 h! w/ w0 P
                upp_error_count++;
) l+ o" ?0 L4 U  _' A9 {            }" D6 H, [! i/ {- G) E' U* ^
        }
+ D- {- U0 d/ _# s    }
7 {0 [. d0 a4 ]1 d& e( k5 S& p6 |/ L# u& ?
    /* 报告通信结果*/
, [+ e0 Q3 G, w' y" d+ K' }- r! {+ q    if(upp_error_count != 0)* S) M' I0 a. x
        UARTprintf( "upp_error_count=%d\n",upp_error_count);( K0 k, h7 V* q/ g. k
    else, q* {" D  K; F0 E; y  p, H% Q
        UARTPuts("uPP transfers complete!\n",-2);/ \4 O8 `7 h8 x0 D3 t0 f# L* O9 G

' h& j& d/ X' }; k    UARTPuts("Do you want to print all the data?(y/n)   ",-2);! H6 P' `# A; W! \& f: ^# b9 G4 y
    UARTGets(ch,2);
" [) [0 J7 ~9 v    UARTPuts("\n", -2);
4 _$ @3 I+ L8 j- W6 W0 ]+ r; E" g6 W6 m" M
    if(ch[0] == 'y'), v0 A' C; Y1 c0 ~
    {
% B* j0 K% _5 N! N2 l- h* T        /*打印全部读到的数据*/  Z  G0 V3 A/ T* q: q) F7 b" h
        for(i=0; i<upp_frame_size; )
' E; p# y6 c  v: w) w0 t! U        {0 R% P  T: m. a* W# k- P( y; h! S
            for(j=0; j<5; j++)
4 q; J$ a) a' j, v; F7 g" `. U4 p2 y            {' S1 Q) W5 e3 J' A( h8 r
                UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a);' L. K6 _% w; B1 V& W' W
                i++;2 ?% m6 H# h5 a# h! L8 t
                //if(i >= 4096)/ Y0 ^3 q) _: @* o: u
                //    break;
  H7 m( I7 a; L4 Q. C' D4 U# }, ^% F2 {( @& e7 T: q
            }8 }8 E: L7 }7 R
            UARTPuts("\n",-2);
# O0 q! M# s! l6 G" H: C        }
  r% \( E7 p/ b5 }1 z6 r1 H6 o    }
4 Q0 }7 a# ^, S7 S
/ B' E' O' N6 _% k}

) B: S& j9 b" i3 |; Q
! F+ p: V* r3 @$ `

$ Z; O/ i4 G  e% O" i. }/ \' f
作者: tulipyyf    时间: 2014-12-22 16:08
追加说明:任务是空闲任务,因此没有做循环。
, c! ]! L7 P* U! D% Q* Y
作者: Lewis    时间: 2014-12-24 18:06
多次执行是没问题的,最好不要用空闲任务,优先级太低。
' _& O# x% X/ m$ u: J




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