嵌入式开发者社区

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

作者: tulipyyf    时间: 2014-12-22 14:35
标题: upp问题,在SYSBIOS下的应用问题
下面的任务,只能在第一次执行UPP时成功,后面的均不成功,请创龙工程师看看为什么?- ^7 N* y1 r6 u6 G& x8 L4 R5 Z
Void UPP_TASK(Void)
$ Q4 P$ v  ~" \/ \1 Z) O{5 B: l  k6 L/ ^* P7 M# P; r8 E  v% w, i6 c

4 q% s& l0 I/ G+ ^  J& ?    int i,j,k,target_int_count=2;  V5 R8 n- [! Y" ]# \
    char ch[2];+ Q7 R5 V5 g: B9 G. s  T% r
1 e5 L* X3 g0 S( h0 v; q( H
1 ~: Z2 q( m, z( m/ Q' a

3 m  p8 V/ I4 i& J    upp_interrupt_count  = 0;
% e! q7 y) Z/ A6 z1 z    upp_error_count = 0;
! h/ E8 H$ S  u6 n& s5 I- ^: Z9 E- c% R
    UARTPuts("\tResetting uPP buffers...\r\n",-2);
0 o" c- {, j" a. y    // Initialize data buffers
8 x$ T% _0 W5 _/ S: i% B/ d    for (i = 0; i < upp_frame_size; i++)* r* C5 R4 J: f+ I% g4 f' m
    {
, b* X! B. b# O0 k# J3 b4 h       upp_buffer_b =i;: K5 Q; g: {( X7 J9 x* T. O
       upp_buffer_a = 0xDEAD;+ N. T8 A( X3 d' u: j
    }
- {; V) K, f7 L3 \
  X/ _2 N/ }, u- B    //for(i=0;i<1024;i++)
* V* [3 y" \) G3 U9 a0 p    //    temp=0;; V) T, d( ?$ E  h( f
( n% h  c2 |' ~. ^# M9 W
    //UPPReset();
  U$ m, g& ]: Y! V6 y    /*启动UPP DMA传输*/
- e0 q1 i) m7 E* A# h0 N6 m    UARTPuts("upp_prog_dma_i\n",-2);/ I+ h: A0 i+ Q' m1 x) n7 Q" w
    upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;7 W4 G% H: \& B0 ^( E- ]* Z
    upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
2 \2 q. \) H8 g% D2 x    upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);
0 [. p4 ~1 ^' {# y( q* R0 c9 k# {2 k9 Q. |! y! l2 O5 F0 |
    UARTPuts("upp_prog_dma_i\n",-2);0 o. f3 Q& e7 u& M: K
    upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;, C1 m. R% e3 [. G4 R2 ~) m
    upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);( V! [# J, H, a- n, a7 q
    upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);+ [3 Y( |7 N9 q% k% N6 j9 Y4 _1 M

0 t0 S, G; Y  G# q& i) [    /*等待UPP传输完毕*/* y" j* I% O. p8 p. i8 u
    //i=0;) H: Z+ [- u1 k7 L- D
    //j=0;9 `$ s2 W! P9 k) _
    while (upp_interrupt_count < target_int_count && upp_error_count == 0)
; t! f4 |* ^7 X0 G    {
8 E1 i6 E9 U% Q4 t& _+ b8 o* j        /*  测试UPP传输的同时操作普通DDR数据
  T. C' x  S; n) E* q$ F        temp=i;; |, U1 J8 U+ g8 u( `% \
        i++;6 a' H6 R' u6 ?" z) ~% R" r
        if(i==1024)
7 Y; d1 `( T: T  y. v/ W# a) g; E        {
: G  h/ r; S2 L1 f3 v( ?            i=0;
3 m' ]0 A# c& t5 R8 g            j++;, P# Y3 R3 \  ^# f4 W, V
        }3 m( Q$ a7 Q" K. Q$ Z
        */' E* O" @; k9 I2 q
# f; J, j+ ?1 `4 L! J, z7 e! {( l
       asm(" nop");
0 g; @( ^+ }# M5 L, l& X3 r& H  E; g8 d) x
       //UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);
7 w% ^8 z6 C0 n5 }, s0 y) y    }
; P6 {, n7 y2 _" _% A; T) h/ M% D7 [  d2 m- }* Y( A9 y
    /*检查UPP传输的数据是否正确 (loopback modes only)*/
9 e6 z. j9 \) s, _5 }    //UARTprintf( "i=%d\n",i);
2 O! o) e) Q" G    //UARTprintf( "j=%d\n",j);
9 Y% @' s/ f: S3 b4 c9 d    UARTPuts("Data mismatch in buffers.\n",-2);
+ j4 A, M, S1 i: \3 B- B# \' n    if (upp_interrupt_count == 2 && upp_error_count == 0)9 N! z$ h) @2 m# }7 A* ~
    {
% H1 `) g& h# u        for (i = 0; i<upp_frame_size; i++)
$ _0 K0 l) p% K, e/ Q3 N        {
( }% L% F4 k( ]            if (upp_buffer_a != upp_buffer_b)
# Z; v* k' P2 Z! n. N+ T% }            {$ ?2 n  z" D  A
                upp_error_count++;- c0 R+ B. Q4 l( {9 e
            }* `1 _1 i0 o) z4 c9 q# e/ N" a/ u+ E
        }
" E' o  F" P1 z; N% J: f    }; i- _  m: m7 y0 L# j' ?. A: z1 c0 S
8 v8 w2 Y0 ~5 @" f
    /* 报告通信结果*/
" B. C4 }- g1 a, V- ]    if(upp_error_count != 0)
; v/ W0 g* K$ m4 h: ?        UARTprintf( "upp_error_count=%d\n",upp_error_count);& ?# V8 ]  o, T+ D' e4 S  N# s
    else
% S* {5 a! C7 P9 q. g        UARTPuts("uPP transfers complete!\n",-2);% b, j, H: ^* z5 }7 H# v( H
* S# {1 z% h# ~; `( l# v6 l( b
    UARTPuts("Do you want to print all the data?(y/n)   ",-2);
5 Z# ]2 G8 S- {2 Y4 f/ t    UARTGets(ch,2);
0 x) b8 L. t5 H" j8 a! d. d    UARTPuts("\n", -2);+ F# v, ]9 S$ {, @0 Y

! U( U& b& O' ]5 p- y$ z' j    if(ch[0] == 'y')
  t" S% ?/ T( n' P% ?1 B    {
: S; w  k$ g/ w# q* l8 |/ Y0 U6 w        /*打印全部读到的数据*/' K2 U+ {* s( ~
        for(i=0; i<upp_frame_size; )5 F/ }" W: N) S6 K2 s
        {
; H2 @* h3 I/ Z, q5 _            for(j=0; j<5; j++)9 N  t4 S0 [; r! m" x
            {& k; s9 K0 F- d1 _( J$ H
                UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a);& [! {5 F2 g7 Y, M' E" n! P# v2 V
                i++;
7 {" H% e4 y" I  g& w6 I7 C5 e                //if(i >= 4096)
" w0 v* e" G' t; A. v6 f+ o                //    break;5 r* d5 q* v8 _6 g0 t1 l6 L- @8 b
& x2 m' J& a' [+ Y
            }
$ x" J& L: {; s( {4 R4 \) W            UARTPuts("\n",-2);! F4 n" u$ S2 V+ G) r: A6 R
        }
, d6 x& ?5 O- U# [$ F' k    }
. w6 z1 ]1 p& r# _
2 a6 M. c6 N7 |3 C5 [6 D3 G3 |: g5 ~}
% o1 s8 \: |5 n7 V

# h6 s: b/ F- `) k  u: O* L2 p/ m7 `1 V% ?5 }

作者: tulipyyf    时间: 2014-12-22 16:08
追加说明:任务是空闲任务,因此没有做循环。/ X$ C1 X7 q* n7 @

作者: Lewis    时间: 2014-12-24 18:06
多次执行是没问题的,最好不要用空闲任务,优先级太低。/ J+ c$ w) W5 R( k- F3 y$ P





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