嵌入式开发者社区

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

作者: tulipyyf    时间: 2014-12-22 14:35
标题: upp问题,在SYSBIOS下的应用问题
下面的任务,只能在第一次执行UPP时成功,后面的均不成功,请创龙工程师看看为什么?
. o7 M1 `% D7 S. j# j
Void UPP_TASK(Void)% n: d/ n/ T! l/ ]7 K% X6 v
{
& |* r/ i2 F, }9 m: U' R  h8 t3 D4 a3 f& z- t
    int i,j,k,target_int_count=2;9 I/ ?& A" \- K2 v0 O% e6 @
    char ch[2];
- }+ T0 N  w5 Z3 y5 C& v
2 M+ h' v, X/ `8 _% V  `1 S# t' p- l- n

7 [. g/ g3 z5 b' `    upp_interrupt_count  = 0;4 T  ]8 f( K  Q8 V  O
    upp_error_count = 0;1 e  p9 u+ g3 E. U7 m% u

; O. J' |0 {4 A* i% {  d. a. Y1 H    UARTPuts("\tResetting uPP buffers...\r\n",-2);8 O9 c% x* ]# X
    // Initialize data buffers
9 J6 o+ q/ b/ W, n! R8 U    for (i = 0; i < upp_frame_size; i++)
- E2 g7 k) \/ F8 n$ P3 u1 ?' H+ F    {
" N/ f& I3 Y# h/ u, G       upp_buffer_b =i;
: P0 I' f  Z2 N: W* K       upp_buffer_a = 0xDEAD;
! Z5 w9 D* K  o) O& W3 @    }
. j. Q) D5 C, k' P
5 K$ v+ a+ v6 \. U    //for(i=0;i<1024;i++); ?8 ~* s0 z0 G7 J# \
    //    temp=0;5 A9 `7 Q" o7 F( g
' m9 _" H$ F# @8 Y, V7 }, C: v
    //UPPReset();5 D" @$ p5 g, w* ?# `! D1 v/ h
    /*启动UPP DMA传输*/3 S: U5 G, S" ~' y8 R6 w/ j
    UARTPuts("upp_prog_dma_i\n",-2);) F3 ~4 H/ b% t& c! m7 {7 p
    upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;
0 P$ \2 e0 ~; b: U8 R1 F9 S( J. f* c9 U    upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);$ }/ B6 X7 T4 F: C/ ?0 E
    upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);
0 n0 a' s; e3 n: P3 {' Q) L/ ]8 n8 Z: @7 R8 x
    UARTPuts("upp_prog_dma_i\n",-2);
  n' s' O* e* }" M    upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;% p5 ^0 A2 H5 a5 S2 N+ T* ~
    upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
. v. ~8 V# q( w/ f! }- w    upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);
9 S0 v$ j; O1 e! G% J2 l% b1 z* ^! Y; t' u/ H
    /*等待UPP传输完毕*/
) d7 c& ^% o% ?" N1 L4 C    //i=0;* I6 l) r& S" R( i* z
    //j=0;
  p( @' T. ?, B: w    while (upp_interrupt_count < target_int_count && upp_error_count == 0)
, H* z' V: q, g& q9 Q    {
# F0 X* m" I. N& `3 |! E0 d. w        /*  测试UPP传输的同时操作普通DDR数据
% L: d+ t2 I& X' o- g$ W7 C9 c        temp=i;
8 e( `0 x$ s. }* o        i++;: g" ?6 ~  N( N3 @
        if(i==1024)
) A8 w! v  _* a" e' r. J        {
: O" l8 J. L- X( y            i=0;" I, V/ P4 E2 D/ S: y
            j++;2 r8 {, k9 j5 ]* h/ X: v: U
        }
& z5 n& n1 ^- _        *// ]  \4 ?- K! c

# S7 P/ A3 M+ G/ u/ c# j       asm(" nop");0 i% P2 ?  D% f" ^" C+ ?% t7 H
0 P# n  N* K7 v, Y1 C0 Y6 i
       //UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);$ E) ~) z' S, J! h1 B2 z" y
    }
( E' P) {9 I( m9 T1 Q$ B8 k" h/ X  r  R
    /*检查UPP传输的数据是否正确 (loopback modes only)*/
" A7 @% U% o! T% |, x4 N) q    //UARTprintf( "i=%d\n",i);
/ L3 q7 L% d6 y4 ?6 x- S    //UARTprintf( "j=%d\n",j);
2 l$ ~$ n- T# ?    UARTPuts("Data mismatch in buffers.\n",-2);
0 g$ m+ k, A$ L* A$ N8 h    if (upp_interrupt_count == 2 && upp_error_count == 0)
% K6 U# Q! E2 n5 e3 s2 X    {. R4 T6 U7 G: [2 |! y8 e
        for (i = 0; i<upp_frame_size; i++)
2 }4 v0 ~4 U$ U0 D% ]        {" e' M1 m! T6 N9 ?) W
            if (upp_buffer_a != upp_buffer_b)/ |( K% @* t8 Y
            {  z3 i5 n7 i% Z0 r
                upp_error_count++;7 a" H/ T/ W; E7 a
            }3 c8 N7 ~6 o2 [
        }
3 s$ S& ?+ v+ z    }
- K: V+ H0 z1 {7 E0 @# i
* O+ L: K% ^' V- ~$ P    /* 报告通信结果*/
$ w' b) `' T1 k7 e8 A    if(upp_error_count != 0)
# a/ s+ ^$ O7 P9 ~' \3 e% S        UARTprintf( "upp_error_count=%d\n",upp_error_count);/ E) r; W' q  `. T7 Q! C5 Z
    else
+ Q  x  l% Z2 E4 b" L6 n/ D4 M0 V        UARTPuts("uPP transfers complete!\n",-2);) X% Z# K6 X8 J4 `4 t. @

) w! T' P+ ^2 s" n* t    UARTPuts("Do you want to print all the data?(y/n)   ",-2);
- t, J! P+ U! R9 C    UARTGets(ch,2);- _3 r2 I3 Q4 z( x; }3 N/ }
    UARTPuts("\n", -2);' h5 ~; b! {3 g( h1 g, M
" M+ R' @! K! H  Y3 V
    if(ch[0] == 'y')% ^! x0 X9 g2 u- N6 L
    {. f* |! [0 [7 H
        /*打印全部读到的数据*/
; @" C  ~& A2 a. c        for(i=0; i<upp_frame_size; )" `% }5 U) G1 L" @- N
        {
: [4 ]2 s) R: a1 Y            for(j=0; j<5; j++)
* [/ @# }+ C# Z" \            {
% U3 f+ r! w/ t; G! z" z; \* A$ F# J                UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a);# t# j1 s( A- [9 |! v
                i++;
, a' z7 |) Q- X$ |( X/ O' ]                //if(i >= 4096)
, \- a, O" \' u) t" [! }8 b                //    break;
% r: R3 N; _" }; N6 K0 ~  A: R. l1 k" P2 j
            }; h+ g; u0 z0 D. y5 j
            UARTPuts("\n",-2);
9 {2 f+ E" n2 O/ q& g        }7 h# c# b  j/ U3 ~
    }
0 f0 J* {7 m/ k/ z% y8 W
4 i' Z3 D& Y/ z' [3 }9 t}

6 Z. H  ^- h5 e7 J8 |( v8 |
  e) A/ C8 h1 y: ?$ D, D
0 F! z* p: A: m/ E

作者: tulipyyf    时间: 2014-12-22 16:08
追加说明:任务是空闲任务,因此没有做循环。
3 W4 s+ P: C5 \, G7 g0 T' Z5 @5 d
作者: Lewis    时间: 2014-12-24 18:06
多次执行是没问题的,最好不要用空闲任务,优先级太低。
  R$ V; v5 F6 D4 y. L! ^- U. G




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