嵌入式开发者社区

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

作者: tulipyyf    时间: 2014-12-22 14:35
标题: upp问题,在SYSBIOS下的应用问题
下面的任务,只能在第一次执行UPP时成功,后面的均不成功,请创龙工程师看看为什么?
# I9 V- e2 c" l
Void UPP_TASK(Void)  T' C6 O/ W' ^8 u7 T
{
1 O6 @+ _  M1 D& @% O8 j0 }; |" V9 V6 w" V- t
    int i,j,k,target_int_count=2;6 ^, w$ G, m8 h
    char ch[2];7 H7 l( p" ~' i5 }- F8 S  |

2 C6 F( @2 c; u8 a1 _
* \& t" {" o1 [% x" j% N0 T8 g5 c' k( w6 T# s) ]
    upp_interrupt_count  = 0;
- P8 P! n& T# p5 L  o8 b    upp_error_count = 0;( m2 o* |2 ]+ U: R) H

. k9 \8 m! J5 R% G9 U. t    UARTPuts("\tResetting uPP buffers...\r\n",-2);
0 f1 _. w* T9 j7 c7 ~/ G8 u( `8 C7 I    // Initialize data buffers1 o4 T4 ?4 P8 O) R( B
    for (i = 0; i < upp_frame_size; i++)
. S6 _1 [: S& b( M2 H& s& C    {
4 |( J$ y$ c# T7 `: _( s2 S       upp_buffer_b =i;
; y5 ], |: \6 b2 o$ G7 A       upp_buffer_a = 0xDEAD;' O) g, c8 @* d' z& s! j0 U
    }( D& I+ g( f! D! K" M

1 k- a. r$ `8 G: y    //for(i=0;i<1024;i++)
2 h) L+ n9 p, b6 x) W  Z    //    temp=0;
3 u  f8 Z# q! X" \+ Q8 Y" A8 ?# |  U5 e* D+ h' f
    //UPPReset();
0 [' X% r" V- o! {    /*启动UPP DMA传输*/
( ^1 {9 ]4 U) R    UARTPuts("upp_prog_dma_i\n",-2);
% I, a" M3 O/ t7 Q  L* J3 J    upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;
: Y/ k$ ]  l7 N" p/ A$ o    upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);3 |4 v9 I* }  u7 i8 y( O
    upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);
( ^8 a( I0 G9 y/ c, d% D% I% B9 m6 N. a4 l" w! M
    UARTPuts("upp_prog_dma_i\n",-2);7 y* Z# U8 H  L. t
    upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;: r' M: x2 Y9 N" g/ r" k/ J3 r9 S, R
    upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
% U/ _5 R3 z. G/ f% a& N* ?7 ]" U! N& R    upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);
! e! o6 w, Y' i0 |% O$ b. i7 a* c) c
; ?  d# h4 X- q) G( _# b$ @    /*等待UPP传输完毕*/
5 l0 X+ k( y, f7 F7 I/ Z# J0 Z    //i=0;; S  d5 B/ |7 a7 A/ h
    //j=0;! L7 u; W& m3 ~' Y
    while (upp_interrupt_count < target_int_count && upp_error_count == 0)* `# f8 R7 ]7 H
    {( G+ }) B. }! |2 u+ C$ W
        /*  测试UPP传输的同时操作普通DDR数据
5 m$ a; l0 p, u0 k        temp=i;
, A8 `. S1 i$ O% {9 A! ]# j        i++;4 K5 Y  f1 p  d3 o' Q& }6 p3 Z
        if(i==1024)
) u- C* l! ~6 N0 Q' L- ?+ e        {
: @* `3 A. A4 u4 g5 |3 S5 a  c            i=0;
# i' J: V# n( U& z            j++;, U" A8 R5 O' y$ j3 H
        }3 y' S6 `3 v1 {) t8 E
        */  Y* Y! [0 y1 ~: b: ?
& `( a  L9 ]5 {# t
       asm(" nop");
, R" |$ w: W0 C; }4 N% y" V) ~; l( k4 ~
" r9 o9 i% r5 N/ R       //UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);9 J# m8 [3 H& y3 W3 c
    }
, L9 u$ d7 [: Z; r5 @6 T! D8 l
% K* ]. x! U5 d! |; W) k    /*检查UPP传输的数据是否正确 (loopback modes only)*/
, r) p) P0 u. o    //UARTprintf( "i=%d\n",i);1 A* P5 a6 A. U4 J
    //UARTprintf( "j=%d\n",j);- _2 I- W; r9 ~2 f: j1 ^# m
    UARTPuts("Data mismatch in buffers.\n",-2);
7 z: W4 M7 d5 C0 C: `! r    if (upp_interrupt_count == 2 && upp_error_count == 0)
# q4 U* g8 _  x- v4 o    {
( d8 ]1 o9 u. ?" O$ S, T1 c        for (i = 0; i<upp_frame_size; i++)
, @/ ?- z! C2 Y3 ^; W- k: l8 s        {; J  }* k; `: y$ |" {+ v
            if (upp_buffer_a != upp_buffer_b)
$ D4 S/ |% e" [, H" Y( [- ~# W  @            {- n9 e5 M% i* q
                upp_error_count++;
8 E. z- p- k; q, m            }- ]( e5 q8 [; S/ j2 P+ }
        }
  l8 a6 I# d- m5 A! D8 O, c9 K) c1 D    }! z+ @1 e0 ^/ h; `, I' X7 o
- e- d9 `6 L( V3 U7 ]3 B/ d
    /* 报告通信结果*/" P; b$ n) |+ H) `* ~
    if(upp_error_count != 0)
. `) i. F5 k5 n7 E        UARTprintf( "upp_error_count=%d\n",upp_error_count);
/ J7 V) K" S# B2 i3 C    else
8 I( f9 @" W! \" b        UARTPuts("uPP transfers complete!\n",-2);: _2 D/ e; R$ Q! c3 u0 x& Z
# o& L: o( |- s
    UARTPuts("Do you want to print all the data?(y/n)   ",-2);& [. s7 _; U" S
    UARTGets(ch,2);* |7 v4 N; d0 j" F3 Y
    UARTPuts("\n", -2);
: u/ |) Z- f5 x& i- J2 c* g0 o- D' F2 F" R( }
    if(ch[0] == 'y')
7 \, h4 y5 `" U( a. z; I/ @' I% q    {
0 Y) z7 A1 r& w        /*打印全部读到的数据*/5 |* k. X  X( B: w% i* R
        for(i=0; i<upp_frame_size; )- O7 W$ E' q: V
        {
8 Q% Y9 x! M+ V# U            for(j=0; j<5; j++)
5 d8 i# s1 Z: X. }( b$ P! S6 w% ~+ k6 l1 S            {
( K* |8 A: q+ B* Z                UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a);
& B, j& Q# _/ P8 G+ v8 F# L- d: l                i++;
1 A9 @. Q. @$ l+ ~- |" b                //if(i >= 4096)
7 _( m& r; ~- |& b; M                //    break;
3 r% L$ g$ Y. s) m' S1 V, L% B1 _; V0 I7 p+ N( A0 p5 @- F6 H
            }
. ~. S% i1 ~0 a  f$ z5 Q            UARTPuts("\n",-2);9 D8 e. ]8 o+ K; e- _7 g8 p# _
        }
# ]8 {1 h' `% ^9 s$ k! N1 c    }: C8 P/ M0 {! F
. a8 O! s( ^3 C$ z% ^
}
8 G- s- X, G7 x# k  G7 U- R

- L9 G+ |$ V, c9 z" Y  a6 z5 P$ h& k0 Y

作者: tulipyyf    时间: 2014-12-22 16:08
追加说明:任务是空闲任务,因此没有做循环。
$ C7 c+ M" D# C+ }+ H& R
作者: Lewis    时间: 2014-12-24 18:06
多次执行是没问题的,最好不要用空闲任务,优先级太低。
0 y- p" U1 B& N7 W. D! i5 ?, F* w




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