嵌入式开发者社区

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

作者: tulipyyf    时间: 2014-12-22 14:35
标题: upp问题,在SYSBIOS下的应用问题
下面的任务,只能在第一次执行UPP时成功,后面的均不成功,请创龙工程师看看为什么?( l* |# Z* A  U- g
Void UPP_TASK(Void)
! K7 ?# [* G, m{0 ^4 ?  O4 ]% R  z
$ Y* T" f4 t# ^5 |" ?
    int i,j,k,target_int_count=2;
# w5 c* d& E4 T1 _8 f% }$ H4 S    char ch[2];
+ B5 J' n( G4 H' e+ B, Q
* e  ?& q2 z1 j: T$ k3 E& H" X1 [4 w  q, b* B  L5 q7 t% m6 l0 A4 l* o4 E2 [

- M0 f' f9 R- k" C; W1 E    upp_interrupt_count  = 0;
- t! s, T: ]+ @$ i9 d    upp_error_count = 0;
  H( |( B8 E, l  P! ]
5 R  M* x5 V, j8 a- d, i5 {    UARTPuts("\tResetting uPP buffers...\r\n",-2);
+ @4 b8 f2 }( K6 o0 k5 o    // Initialize data buffers8 i1 d6 e4 T3 @4 q  I
    for (i = 0; i < upp_frame_size; i++)! R; P6 K! S$ e1 o
    {
8 v$ \9 I7 i* N# C# k$ {       upp_buffer_b =i;% d9 E/ z5 ~; J6 @) Q, Y9 P
       upp_buffer_a = 0xDEAD;
' I( C7 a* P0 {5 H    }. C1 P- ?$ B  q1 V
  E0 v( D1 Z: ~- v% h' `6 s3 {- f
    //for(i=0;i<1024;i++)/ G/ Z" d1 N. x  |# o$ c  q& ]
    //    temp=0;
0 w4 b/ U# e8 }( q, t1 q9 d7 q6 S; S7 Z$ A/ H# V
    //UPPReset();) Z& r+ I2 E6 a* c& h& A! S! I
    /*启动UPP DMA传输*/
  V9 k+ e4 E" Z    UARTPuts("upp_prog_dma_i\n",-2);/ F/ T) Q& @2 w, ]" ]. J* l
    upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;3 ~1 Q# O1 F9 D* E& t6 o& w6 W
    upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);. f( ~  X% R! }8 K# c
    upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);' R3 [3 R7 _$ r$ O
7 p, ~7 w% n  c6 A
    UARTPuts("upp_prog_dma_i\n",-2);3 V! B7 }0 y7 F
    upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;
: _, G9 D3 }& t, k+ V4 R    upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);" ?% O& J( \2 h* N* _) ~
    upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);& f& H" n# G0 O
* d3 x2 t  h% `' o1 b7 T
    /*等待UPP传输完毕*/) v" W- o5 v$ k
    //i=0;/ {# }# m& b9 h$ B. i, l
    //j=0;/ O$ D1 S* b( A
    while (upp_interrupt_count < target_int_count && upp_error_count == 0)
% b! Q9 z2 j8 t/ K5 D2 N. f    {
: ^+ w9 e9 V" @7 L- d( ^2 H        /*  测试UPP传输的同时操作普通DDR数据$ J) k. W5 I4 c+ T7 e2 M
        temp=i;
, `+ s% F, [' \7 U7 u        i++;' n9 {! ~: q% T8 K# D0 g! s
        if(i==1024)
7 j; T; W; f. i: h! \( M# J        {/ C# n, ^, g, l( r
            i=0;3 B" O+ w8 [  S3 |) p  V( z
            j++;
. I3 x3 W9 S/ {        }1 D5 ]6 W/ O7 X2 {  d  C1 s, J
        */9 V; i0 i: O; g# t) P  u
# R. v' f% o2 i/ O% ^  Q1 ]) {
       asm(" nop");
8 G! H1 a$ }! B5 @2 J- [0 g
& s, z8 t; t% r' ~( q, W& o       //UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);& m; \- o0 _# T! j0 p- T
    }
$ |% N2 P) m% r: X; Z; t: B
1 D! @  t8 J3 o" q- {- l5 m    /*检查UPP传输的数据是否正确 (loopback modes only)*/
! {5 v7 ^6 b% X2 A, k& e: ]1 a    //UARTprintf( "i=%d\n",i);3 f7 L" |! p- |7 q
    //UARTprintf( "j=%d\n",j);
  z  \' ]" }, r7 `6 ~. }, e    UARTPuts("Data mismatch in buffers.\n",-2);
" I, i" F; A! `! G    if (upp_interrupt_count == 2 && upp_error_count == 0)% U) h: C  f+ T: ]( g# p$ z
    {, t7 \% y; f# o4 }- c0 A. ^
        for (i = 0; i<upp_frame_size; i++)
( [* P7 s% e/ P7 U        {
) d; \% t; e3 r: s) x            if (upp_buffer_a != upp_buffer_b)
. S$ o0 ~% u. W* T) k            {
! C; X' Q5 o- o4 m$ R! ^' O                upp_error_count++;
; E; p% M# p9 y2 L            }  B" ~; H% @2 N1 ~4 m$ W: v8 ?
        }
3 q4 H; p- B* N; b. j6 q  P    }) B& M2 a/ X7 R/ ^7 G0 [/ F) u
/ K4 b5 R  X/ s) w
    /* 报告通信结果*/2 _8 o) X* n( f+ z7 x
    if(upp_error_count != 0)& S3 h9 U0 \( ?+ h. ~0 X" u0 G/ T
        UARTprintf( "upp_error_count=%d\n",upp_error_count);# `( {% d7 w/ a) y
    else
" W/ i6 L" l& g. b6 ]        UARTPuts("uPP transfers complete!\n",-2);1 r1 s5 ^! ]( u& C; f

# p, O1 `  d% ]3 E    UARTPuts("Do you want to print all the data?(y/n)   ",-2);
2 |; |& E4 Q( }' f$ d, z2 g    UARTGets(ch,2);
# ?) \5 b" c0 i+ S    UARTPuts("\n", -2);7 a3 ~) f7 @& E

5 c& e9 l  G' h4 G5 f( h9 h# y2 f    if(ch[0] == 'y')( ^4 e) x2 Q, ^- ~+ d9 a2 |/ x
    {# ~, R& e) \; L& `  r8 o4 q" m
        /*打印全部读到的数据*/
9 e4 `/ o( P% j+ d5 w- O: \        for(i=0; i<upp_frame_size; ), v( h/ u" _" j6 Z
        {' ^" [; Y- m2 p/ @- A4 I
            for(j=0; j<5; j++)
  G! y; R+ J3 N" z            {
7 Z: Q7 N, k) [2 a, e4 o  \                UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a);8 D# x) E2 ~9 ~
                i++;
' n) s6 B6 `; A! Y4 E: p                //if(i >= 4096)
" L! \: w# H! `& r0 H. [+ c. w                //    break;
3 j1 y. _$ J* N0 T3 T; B$ I, \, b+ o- y) X+ K+ \  O7 t, ~
            }! B2 h  h4 Z5 t- _" y5 g) g
            UARTPuts("\n",-2);( Y2 Z' b# X' B
        }
' K( F( O; K, |9 c0 d7 r: V: X    }8 N$ A2 a& d, O7 N7 E+ P  X

& E2 I# {( H$ P) v+ h( L}

/ D% D! L3 ?2 O3 E9 W' Z4 k

  l  m- A: \$ I/ c: U, U1 B# `
; V0 H/ [$ N4 W9 u6 P- ]
作者: tulipyyf    时间: 2014-12-22 16:08
追加说明:任务是空闲任务,因此没有做循环。
: h6 K% ^: ?3 E0 d" x
作者: Lewis    时间: 2014-12-24 18:06
多次执行是没问题的,最好不要用空闲任务,优先级太低。* f/ y6 `8 `# q) k; T. U





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