嵌入式开发者社区

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

作者: tulipyyf    时间: 2014-12-22 14:35
标题: upp问题,在SYSBIOS下的应用问题
下面的任务,只能在第一次执行UPP时成功,后面的均不成功,请创龙工程师看看为什么?
/ b$ j  ~. R: t( M! x* v* y" y9 p
Void UPP_TASK(Void)
4 @! E: Y3 M3 N% P- z{. d2 U. Y% _" L+ q' N8 O# u

3 X, B+ s- h& j0 i# G8 V3 O    int i,j,k,target_int_count=2;* [$ Q5 F$ G; I( a7 X
    char ch[2];- H  r/ o5 P5 l% v. C2 V
- H) S* v* Z: D; X3 [" Q
) c. ?# ~; n: V5 x* J! j# \

  _' x& G: h" Z1 [    upp_interrupt_count  = 0;$ z- e1 q$ g' V: E, C0 s
    upp_error_count = 0;
* u* f7 q4 E$ D" N# T9 c" D
* G4 b1 @7 [2 _. P% w    UARTPuts("\tResetting uPP buffers...\r\n",-2);2 e  q; h6 u% [8 Z# p- o
    // Initialize data buffers
6 Q- Y% F/ V8 r+ B2 p    for (i = 0; i < upp_frame_size; i++)
" }; Q& }" a( p& {/ c; B    {! l+ G! p  c& ~/ \" d7 L
       upp_buffer_b =i;' ?6 E! ]+ l& G0 |
       upp_buffer_a = 0xDEAD;
) S, x! @0 N+ v4 @. c, }    }8 B1 M3 A2 `$ b% d! G
/ a2 Z7 i: f' Q  M$ V: b
    //for(i=0;i<1024;i++)8 Y5 e. D; |+ X
    //    temp=0;$ p+ m' B- q9 x

/ U# Y2 g4 ^. z5 h/ u    //UPPReset();0 ^5 x' l: i& _8 Q- F6 f  F
    /*启动UPP DMA传输*/
- [2 m4 ~, _3 k    UARTPuts("upp_prog_dma_i\n",-2);0 Q& w' W4 [7 N' }" |
    upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;% |% {5 c$ b0 }0 U2 L. H- Q* z
    upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
8 g0 }! L) z1 R: g" w/ a/ r    upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);
% C1 t! e. A( ?. `/ R
9 q- \+ N2 E( }" |, Q$ `% ~    UARTPuts("upp_prog_dma_i\n",-2);
; F& @& }( {+ D  K2 y1 ^/ D- h    upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;
( p9 `  Q5 b( ~3 J: G* d- r% h    upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
8 X' E# I5 M7 ^$ G, p, U8 d2 k$ a    upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);
6 W, A4 b! K. y3 _- b- j; W7 }, [7 n: X3 Y+ Z
    /*等待UPP传输完毕*/
8 t) t" ?  n4 ?9 t& f) w1 ~9 y0 w    //i=0;; h/ e! t- K* D1 N# `
    //j=0;
: n% f& E+ D" x    while (upp_interrupt_count < target_int_count && upp_error_count == 0)
* H+ H. [! ~! O8 r/ ]* @- D$ K    {2 |; U" W& \- g/ }
        /*  测试UPP传输的同时操作普通DDR数据* E% l% _1 l9 u) f0 b& a! A0 C
        temp=i;
2 D8 o: Q! v# b+ o1 X8 G        i++;
: m9 B) M) j4 S* C3 k; n/ y        if(i==1024)
9 P5 p  ^6 s3 s7 L& v5 u7 W        {  P9 e. g# U4 T, Z4 w
            i=0;
9 B* [, C' t$ N. F            j++;
* z( B# [& Y" X' d5 G: K        }
6 \- Y5 G8 s( z4 f5 y        */
' @$ ?3 ?% ]8 n$ }$ s8 P6 e
. L( d6 J, G5 `+ p* F  Y. u$ R- C- {       asm(" nop");: y# R/ Y6 h# |) P4 ~
4 y# v% \' l) E3 _) F2 t
       //UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);( z2 C- S& u7 I( D5 w
    }
4 ~8 y! N4 l) v- g9 ]
' D) ?9 ~7 U! T. D' z! ~$ P: u( c  G( s    /*检查UPP传输的数据是否正确 (loopback modes only)*/9 v; L( i; |  Z  B* Y6 W
    //UARTprintf( "i=%d\n",i);4 Q8 y4 }& ]; l% B2 ]0 O
    //UARTprintf( "j=%d\n",j);
0 Q: Y; J; O8 f! J. t2 f* T    UARTPuts("Data mismatch in buffers.\n",-2);% U7 [+ f" [) A) ]# X9 N
    if (upp_interrupt_count == 2 && upp_error_count == 0)
$ ?1 n9 M+ r8 i5 ]6 D3 @& u    {" w% r+ ]2 c8 h- Z5 o
        for (i = 0; i<upp_frame_size; i++)
( Q0 T5 k- ^5 w) m$ Y4 m6 R" y/ i        {, V8 l6 D) }' T8 H+ A
            if (upp_buffer_a != upp_buffer_b)$ G" N9 G: J, _. {8 D5 h
            {6 c* H- D) ?* h2 |2 G$ f
                upp_error_count++;
2 F2 C, ^/ N( k. }& W" x            }! T# _4 K9 B! e3 ~9 W
        }
3 C. r# V7 H8 X: [( U8 y    }
& \6 N" q: R7 X% j9 E' q8 e; c! m+ K( \, ^0 T. q0 A5 V
    /* 报告通信结果*/' u6 J* _$ b! c2 }3 y2 w0 n+ i
    if(upp_error_count != 0)
. A! i7 c( u  O5 e, ~& k* Q0 Q        UARTprintf( "upp_error_count=%d\n",upp_error_count);. U" \& E- ~9 @/ B
    else
5 U: E5 }8 g* Q$ d        UARTPuts("uPP transfers complete!\n",-2);
4 I+ u( w4 k9 g9 b) P! y
* L+ L8 ~6 }: `+ d5 |3 m, P    UARTPuts("Do you want to print all the data?(y/n)   ",-2);
, K5 G1 i) T! {$ d6 b2 M$ j9 J7 w    UARTGets(ch,2);
4 P5 i* _7 [8 ?  b% F8 }. W- ^. D    UARTPuts("\n", -2);
, E% ?- V: [% M! W) _4 W
: k. S& G# z* ?    if(ch[0] == 'y')
9 @) O2 f: E7 y* D    {
, K8 y; m7 T7 F- ~7 O        /*打印全部读到的数据*/! H% h  g( l) V# t0 n* ]
        for(i=0; i<upp_frame_size; )
3 _8 J% ~& h. l( C        {& Q) v- `! O9 U2 _. y
            for(j=0; j<5; j++)* n: [8 t. n2 q4 Z& f# G: C
            {4 u* q& G0 ]' |1 @4 n. l! r. |
                UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a);, a" ?9 D, i- z
                i++;7 ]& Y8 l) g) a' E& \
                //if(i >= 4096)" B+ I! |1 T( y! u' P1 x9 _
                //    break;" E: N$ ]  \8 G* Q* g9 E

5 p' i4 s( H5 W' |1 \' d) [/ ]" V            }  e+ Z3 N1 j4 b& p  Q* o$ e0 F
            UARTPuts("\n",-2);
' t9 m' m0 y8 T3 v+ V- ?        }
) _! w* D6 S( \+ m& c+ u    }1 D; ^6 y. _% I* x! k7 l7 y! b

# w$ [5 B% W( Y$ B}

  p2 s; T5 I8 P3 Q- Z2 S
% H8 }1 v6 l9 L- }

. K; l. s! \+ ^- ~* X
作者: tulipyyf    时间: 2014-12-22 16:08
追加说明:任务是空闲任务,因此没有做循环。! d4 }% B9 w, ^5 c/ h$ r2 d

作者: Lewis    时间: 2014-12-24 18:06
多次执行是没问题的,最好不要用空闲任务,优先级太低。9 |$ t, j" I2 g. _: e3 _





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