嵌入式开发者社区

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

作者: tulipyyf    时间: 2014-12-22 14:35
标题: upp问题,在SYSBIOS下的应用问题
下面的任务,只能在第一次执行UPP时成功,后面的均不成功,请创龙工程师看看为什么?
$ Y- I  E, X/ I6 P; h5 M) b
Void UPP_TASK(Void)
3 E; `9 @, o* S$ ]- E{
; y8 Z) H5 a, s% d0 ^( l% H
, S/ ]  q/ O4 C6 J. |7 F% l! q* y    int i,j,k,target_int_count=2;$ \8 O# ~2 X' V0 U: y" ]! q6 T$ I
    char ch[2];
. f6 z' l) ~5 }+ w. j/ {0 l# {: a0 ^1 _6 X: x; ~

7 Z" R3 o: v( z; r' N+ T! {
4 p* g6 E- m  C) [: I    upp_interrupt_count  = 0;
7 C) Y6 c$ ^- q) _; x' S    upp_error_count = 0;2 h) E2 S! W0 s! Z

' t" x: e" O; T! Y* @( I    UARTPuts("\tResetting uPP buffers...\r\n",-2);
* j. ?$ P/ B; ^6 F( w    // Initialize data buffers
! N# U0 M/ L! a! ?! T    for (i = 0; i < upp_frame_size; i++)1 y6 c7 q- ~8 Z. D% h. p
    {
. v! G' f6 Y) X% v. Z3 S9 T- `       upp_buffer_b =i;
3 S; C- M: I: K- u6 O$ K, d0 F% M       upp_buffer_a = 0xDEAD;  q( X$ |) l9 H* a2 m& H
    }# X1 B; F3 b. l8 a" ]6 }
( \& b; N' u  W( j+ B, H' A' q
    //for(i=0;i<1024;i++), n5 T% Q! ]6 k* j( q: \$ L
    //    temp=0;. Q1 B9 A# S7 K+ R3 X2 I

$ u4 Q) y- E+ }    //UPPReset();( T1 }$ Z4 C! l) d8 |
    /*启动UPP DMA传输*/
5 E( f0 @0 V. L% y* L    UARTPuts("upp_prog_dma_i\n",-2);3 X4 U; |3 h$ M* I5 s
    upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;1 U3 N( v$ n% E! z
    upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
, ]8 k( o/ k) M! h    upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);; S+ q1 Q* f+ y2 p
. M' L0 p8 W, {4 y+ O  k
    UARTPuts("upp_prog_dma_i\n",-2);2 D9 ?( K" b) R2 L
    upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;
- U( h$ q$ E( F    upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
: _# z! g9 G7 y; j1 n. h: \    upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);2 g$ N( u( s! |! d7 g

4 Z" V  G8 _1 Q    /*等待UPP传输完毕*/2 E1 i$ ?0 H8 d- I, ^1 b
    //i=0;! i' k/ J1 B1 U; W9 r4 D
    //j=0;9 _% M0 u0 r5 D  u- x" v/ e
    while (upp_interrupt_count < target_int_count && upp_error_count == 0)( y5 T5 W, r6 U8 L5 n8 v
    {1 r; g/ o+ R% `& ~" S
        /*  测试UPP传输的同时操作普通DDR数据# g, J- [9 @& R6 H# `
        temp=i;
) n6 s, M' C& S4 w( E        i++;
% J2 h/ S) A, N& ^4 O8 M2 q6 J        if(i==1024)7 F$ @4 L8 c1 Y
        {
& H  F4 z4 e+ a& g9 |- ~& {- }            i=0;
0 L" b4 o8 D6 `, Z! u% G2 j            j++;
+ ~0 u7 U; m5 [* O; P' v        }( o0 H( `1 i6 o0 p! W% D
        */. O& g! u  Z% e* R
2 c, g2 g, R! i/ X" p
       asm(" nop");+ t6 j4 U5 E- P. H& _. p. s

4 b7 {& |, l  _7 X. T' }       //UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);
0 U2 J: u: n; F* B2 n+ @7 ^2 q& Q    }
6 O- v! F3 l( z! M! I; T7 N2 c5 K  O
    /*检查UPP传输的数据是否正确 (loopback modes only)*/
5 W' s! l$ }5 B! a, Q    //UARTprintf( "i=%d\n",i);: `+ m! m3 H' V& V) T, |' `# c9 R8 L
    //UARTprintf( "j=%d\n",j);
4 [4 ^& s2 O( K    UARTPuts("Data mismatch in buffers.\n",-2);
+ l" y6 R+ K  t6 Y0 P    if (upp_interrupt_count == 2 && upp_error_count == 0)+ u, ?4 d, ]# h, u
    {" }9 W% Y% ~. p$ {% \* ~
        for (i = 0; i<upp_frame_size; i++)( h$ g6 N, H- k$ ?5 l* u6 \% g
        {5 r; J  J% u6 R/ ^
            if (upp_buffer_a != upp_buffer_b)
+ s5 H! ^$ q! t; F. i# S8 S            {, l% ?1 P" Z# v3 R+ W. b/ n. `( k
                upp_error_count++;7 _0 {# x4 X* q9 p
            }
  M; b! T# a* u7 C        }
( [5 ?8 _9 h4 D% q+ P    }- D. \# T2 G" A/ o5 \* f
( c; ?8 Z4 T0 \8 o8 b0 j
    /* 报告通信结果*// F9 U8 ?, U; {' n
    if(upp_error_count != 0)
$ a$ X% _" y' o+ F7 l        UARTprintf( "upp_error_count=%d\n",upp_error_count);
/ I5 Z  e; q* u6 Q9 }* r9 @; _    else
4 ?4 L1 m! h) e8 E$ A6 y8 |; K' {        UARTPuts("uPP transfers complete!\n",-2);! m' s- W2 a5 d8 D4 F; T1 ^
; R! E( ]( R1 C& j5 S
    UARTPuts("Do you want to print all the data?(y/n)   ",-2);
- f6 s, [! E, l3 B- m. u7 [    UARTGets(ch,2);
! k' }5 u  o: l3 E- q, U    UARTPuts("\n", -2);
% _: {' B  B  s& u1 q3 ^! J# f$ c& @, G9 c# a( O: ^1 u3 q( r
    if(ch[0] == 'y')
" u( ]+ j8 b( n' p! N& {/ e9 z    {
& j9 r7 e. b4 }' {, k. e6 K) g9 K        /*打印全部读到的数据*/' [$ P' U6 k2 u! T9 X! P* u
        for(i=0; i<upp_frame_size; )" R; f' {& }. X/ z- g
        {" l* S- q9 ^0 X' l  h9 U
            for(j=0; j<5; j++)
3 i2 q* i$ A" p' U$ o0 M            {
0 \# l1 C! m5 E+ ^4 u$ m* Y! Z                UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a);
2 ~2 y3 z# Y( G6 J4 P. D                i++;
$ V1 o4 L. H- g5 b                //if(i >= 4096), b' K8 @) _0 i2 c/ z
                //    break;2 \; U% Z' b. W; Q; [5 {3 L9 t$ g1 C

; r% I9 ], f& S$ \2 T$ q; E3 v            }+ d- T1 ~8 J, \* F! g- `/ W
            UARTPuts("\n",-2);
( y; P0 t/ G, ]4 q/ A        }" l( ?: ]+ j# p# D6 L
    }
0 a# l5 T" d: G2 k/ W/ [) {" n4 J& p" O- L( a4 q
}

! z$ j2 Q; D* u. b% Y

8 {+ k" [1 m  o7 K; L1 G- w! Q0 w* j7 x

作者: tulipyyf    时间: 2014-12-22 16:08
追加说明:任务是空闲任务,因此没有做循环。
; w8 t+ r  O% N
作者: Lewis    时间: 2014-12-24 18:06
多次执行是没问题的,最好不要用空闲任务,优先级太低。$ \9 ~( t* J2 l5 d7 @; j$ Z# _, H





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