嵌入式开发者社区

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

作者: tulipyyf    时间: 2014-12-22 14:35
标题: upp问题,在SYSBIOS下的应用问题
下面的任务,只能在第一次执行UPP时成功,后面的均不成功,请创龙工程师看看为什么?
) A; ~" e* s5 i+ _2 S- I
Void UPP_TASK(Void)0 V" X+ t: h- m6 }: y
{" ^* O0 I/ M- c2 h) R
1 O( t$ z1 G* Y  q  Y: q: d. r7 Y$ c
    int i,j,k,target_int_count=2;4 {0 K8 Y, V/ `; k1 ^9 [/ m' J4 k
    char ch[2];% |3 B+ d! U7 X2 K/ V

; n' l1 |* u6 h  Z
, E7 j& Y# m. i2 o# h4 {
% I5 q$ G, q4 p+ C    upp_interrupt_count  = 0;
9 E: p/ q: U. b6 K6 l    upp_error_count = 0;
' W' u& h- \/ e& P1 o* c, Y! T# ^2 l8 L
    UARTPuts("\tResetting uPP buffers...\r\n",-2);
. v; a: H. D) x+ J: [    // Initialize data buffers
. V5 H5 z( B, E* k$ p    for (i = 0; i < upp_frame_size; i++)
/ f- u& F* {% l0 L6 J" R    {
2 {% v. w; ~8 Y+ a9 W4 w8 f& v       upp_buffer_b =i;# N' l9 c, i2 K0 z! i+ ]: j  Z
       upp_buffer_a = 0xDEAD;# x* ?$ H& m  ?6 `& ~
    }
9 u6 X1 N2 U6 @
7 X' r; ^6 X! @5 I, L$ i    //for(i=0;i<1024;i++)
: B! \3 W  h* I" z  N4 W3 m& F    //    temp=0;
" |7 {: R  _( f. {( l! o- ?; _3 h- ]9 O
    //UPPReset();6 D5 k) }! v& _+ B+ A6 J. A
    /*启动UPP DMA传输*/
: S& G& H: \* m- s5 d5 R' ]    UARTPuts("upp_prog_dma_i\n",-2);4 D6 p& f( t: f8 P' E- U2 K2 Z
    upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;" p5 a' Y" E1 r0 v: A0 h
    upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);) x! R+ A# F! {  A" W
    upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);
' C' p9 y, o. k' @) I$ a
6 {: k4 k5 p' a: {    UARTPuts("upp_prog_dma_i\n",-2);
* m( A  j9 {7 H+ U. o. m# Z! U    upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;
6 d) X8 {* O1 V4 S- M# X4 k+ R    upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);/ t4 F3 I: j8 q( @/ t
    upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);" m  m" t& `! r, M. [" ?: j9 t

2 S7 g' I: r8 X6 f$ n" {    /*等待UPP传输完毕*/8 ?2 V) K$ E2 H( c; x* ^
    //i=0;
/ m; w& L6 p- x* T2 G; P8 v    //j=0;) ?6 S2 n3 e* V6 y
    while (upp_interrupt_count < target_int_count && upp_error_count == 0)3 n' i9 M* [0 o# H
    {
- t+ x/ E" G6 r0 l9 i( ]& w9 Z        /*  测试UPP传输的同时操作普通DDR数据
5 ?# M% _0 ?+ {+ c, W* o* \0 i        temp=i;
2 _- w7 H! \. K2 p, ]) {        i++;3 {+ x; D1 g( K; `2 k: a2 d
        if(i==1024)
0 h7 i+ Q, [) P% j# K# r! |( O! Q        {# g. A+ q+ d% l& K& O7 a, Y
            i=0;
3 e0 a/ `$ {: K& z6 G            j++;& c' B, u0 J; Z
        }
2 E& S7 q# W% O3 w; A        */
3 A) j$ E  Z/ v! H# N* m6 b
3 n+ A% \- I/ Y& L% i2 x" Y/ ]       asm(" nop");
9 J& ]" D% f, h3 c4 L- U; n- l/ {, r3 d* P
       //UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);2 c2 P9 L$ S2 V  v5 h5 H
    }# h  e+ t4 i7 \- D

( p+ W6 b7 N7 A+ Q    /*检查UPP传输的数据是否正确 (loopback modes only)*/
* V, B. f- ~  ]+ c% S( c    //UARTprintf( "i=%d\n",i);
! O7 y, j* h7 s2 W( T  i' V    //UARTprintf( "j=%d\n",j);
( B6 B9 E) W7 ]    UARTPuts("Data mismatch in buffers.\n",-2);4 @3 I+ u2 ?6 E' j9 g0 F
    if (upp_interrupt_count == 2 && upp_error_count == 0)
6 N9 Q6 e3 y0 U+ P5 L    {0 s' W/ E5 P! B+ q
        for (i = 0; i<upp_frame_size; i++)
; y8 z. d% R1 \        {
0 d0 |, E" Q- O% @0 D% J$ n            if (upp_buffer_a != upp_buffer_b)
9 {$ c& T: c, W& q            {# y! q# S% |9 J2 g% W
                upp_error_count++;9 h& s% V& l( S: `0 M9 w4 w1 N
            }9 ?4 ]: z8 H$ W( Z3 G0 D: C
        }
% Q+ @! r1 `; x6 [3 ~! I2 u* L& _$ {, Q    }
3 x" W* ^6 c# H* h& g! N
; x. F8 J0 K5 M$ x7 F) N' t    /* 报告通信结果*/. ?* z: U% M4 v* e, e
    if(upp_error_count != 0)
8 ?% b; ]0 P$ c2 ^0 `- P) X        UARTprintf( "upp_error_count=%d\n",upp_error_count);7 T/ ?, ^0 T' }- x& h/ f
    else
' A, B) Z) P* M  Q( m% s# a        UARTPuts("uPP transfers complete!\n",-2);
* Z3 T2 f( _1 e7 Y! I
9 Q0 S5 E! ^- s1 C& D8 _* v) B" z    UARTPuts("Do you want to print all the data?(y/n)   ",-2);
5 L4 k. t0 N0 @0 T' o' k* f  T    UARTGets(ch,2);: R) H$ h- L- C. u' R
    UARTPuts("\n", -2);
8 ~' h: X% H5 o; ^: t* s  r+ X% W& I2 R7 b5 g
    if(ch[0] == 'y')! L$ F: T2 ~+ f" ]' J
    {
9 e8 j; E6 E! |  D        /*打印全部读到的数据*/( J- s9 k. ~/ x& q2 K
        for(i=0; i<upp_frame_size; ), L! l' {6 A) k0 A( R& L" B0 S
        {5 c1 O4 @/ _9 q- G$ y; Z
            for(j=0; j<5; j++)
% D  Y% F( x: O6 S. h$ y% \- k$ }            {) \; H+ {9 l$ V! m  w: i6 y5 E
                UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a);0 |4 H: Q/ B2 V
                i++;$ B9 X6 d! H9 E
                //if(i >= 4096)
; P( h! ?9 w+ O' P% U                //    break;
/ Z* ~7 G/ S9 Q7 `6 w' R
5 c5 `. x! M. S) J            }8 c- e" r. U2 R! V# S# r% }
            UARTPuts("\n",-2);
% ^; {# u2 a: k4 j+ t6 X        }
- E6 d; m, l, `    }) @  B# r! s1 m
9 h, d8 q8 h) z% N
}
5 O8 k% d7 G+ U
6 C' B( \. d5 c
! J6 j, `& P( t3 Q

作者: tulipyyf    时间: 2014-12-22 16:08
追加说明:任务是空闲任务,因此没有做循环。. {+ |5 w. R# M, C* E2 S

作者: Lewis    时间: 2014-12-24 18:06
多次执行是没问题的,最好不要用空闲任务,优先级太低。
1 S1 c7 ?* \% b4 n& T4 K+ r




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