嵌入式开发者社区

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

作者: tulipyyf    时间: 2014-12-22 14:35
标题: upp问题,在SYSBIOS下的应用问题
下面的任务,只能在第一次执行UPP时成功,后面的均不成功,请创龙工程师看看为什么?  `" \' ?1 P6 _1 D2 d  l$ h! m' M
Void UPP_TASK(Void)9 N: S) W+ D- R) Y* {  S2 s1 J: _& o
{4 z$ Y1 @- E! P. X5 e! d
0 t" V" w  r' \( T5 o" v) o) f
    int i,j,k,target_int_count=2;
# r" @% F7 B. C    char ch[2];' u; B/ {% q& P- r! ~
& j, h9 Z7 w* U8 A- n0 D( s7 `$ S
6 a8 f6 u, D8 j1 X) h0 _
/ E! l1 u) r' ?& V# c  X. K# J
    upp_interrupt_count  = 0;5 `: x: Z! A, ?; x1 K1 Q
    upp_error_count = 0;
0 f/ o* ?' i$ U& S0 [. J; ~5 x# Z) z1 Y! }
    UARTPuts("\tResetting uPP buffers...\r\n",-2);
# j* T" ]( V% j! R$ F4 L    // Initialize data buffers# p  \6 O4 n& Z' Z
    for (i = 0; i < upp_frame_size; i++)  @. U8 `+ _; J! @( g
    {
& e. Y0 Y1 L0 ?; v3 r0 K/ R       upp_buffer_b =i;
) i5 u" i* y) L1 Z, N! b       upp_buffer_a = 0xDEAD;
' r: Y8 s1 _6 l    }
) `' s# W3 V: P! C* g2 {" w
% p( K* j0 w& W    //for(i=0;i<1024;i++)) L4 `% _7 A8 v) k) W& f8 b- S2 ]
    //    temp=0;
1 a/ R  |2 }" B& c) o) P  d( R+ t/ D5 H
    //UPPReset();! J$ I/ x6 M1 E( S& C5 u9 C0 h' Y
    /*启动UPP DMA传输*/4 d% q8 G- }& r: T, `4 b
    UARTPuts("upp_prog_dma_i\n",-2);
9 x" X. O! f3 j6 [    upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;
- G8 h* M8 @+ {2 l$ ]" @: d    upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);  h* \+ i: m, f/ `/ _: ?
    upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);
! T: G, G. L' D) f# O
1 E4 j. T$ A5 [/ r) g    UARTPuts("upp_prog_dma_i\n",-2);; b% E) t, E5 W6 Q& f# n
    upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;% b1 I6 ]0 c. P. U2 }9 T
    upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);" N& E" k$ H: C4 n5 i6 s
    upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);
, H& h8 a1 I8 V9 j) y! V  A6 k  V7 ]8 ]9 u: N5 p6 \
    /*等待UPP传输完毕*/
. q  B$ v+ ]8 t3 U    //i=0;* \. k% i1 K$ C5 s/ R& y
    //j=0;! N( G* i( Y: s# S2 c  ^/ F, @
    while (upp_interrupt_count < target_int_count && upp_error_count == 0)
$ K, Q0 P0 z5 d5 G5 C    {1 [8 i6 q* R( E- P1 L9 K) B* H
        /*  测试UPP传输的同时操作普通DDR数据
- J/ @! \9 E- V+ T        temp=i;
- L# `" K& d8 l. x        i++;
( o- o! |% F% `) x) G0 b        if(i==1024)1 f: h# ^# |$ t' H6 [1 o
        {( {! f6 b2 N" S/ }& u1 U
            i=0;2 s- Y  ^  ?" W& }, j
            j++;4 q* E1 e9 {& }
        }1 R, y+ _2 }% e8 }
        */
- b5 y: R: E+ c  v  e4 ]6 M  v7 z& i* e, g! R
       asm(" nop");/ L# G, a# V6 q7 D6 k# r' ]2 `

$ q+ A( g1 w' r5 ^9 f* ]. Z       //UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);
- r$ e% a5 @* g7 @/ S+ }0 l    }
4 X) o3 ^! e* P
, Y3 C2 Q: \9 t    /*检查UPP传输的数据是否正确 (loopback modes only)*/; f* R  ~; S' q, M& V
    //UARTprintf( "i=%d\n",i);
9 b2 r* O- K$ t/ m" t9 H    //UARTprintf( "j=%d\n",j);/ B- v$ C! b2 h  m$ m
    UARTPuts("Data mismatch in buffers.\n",-2);" d/ d: U0 Y& Y8 V1 G
    if (upp_interrupt_count == 2 && upp_error_count == 0)  i7 A% v" m% b/ A; s
    {
# s" z8 P9 I' X9 I% N7 A; j7 \& r- I        for (i = 0; i<upp_frame_size; i++)6 V/ r$ E7 M) ^- v
        {# B* c; P( g9 h* N3 V( v
            if (upp_buffer_a != upp_buffer_b)
( A% z* S- x! z2 Z            {$ a1 Q% w+ j; ]0 G  F
                upp_error_count++;
8 d1 o# S3 [9 m5 W            }5 k8 P: W* l0 W( ?! C% e; |0 c1 v
        }
& o, g* n, {1 B# t, P' Z    }
7 r& M' L) f  m/ B9 r2 ^. m. E: f# z9 V1 u% T, t
    /* 报告通信结果*/
" ?2 J" i. s' i8 ^) n8 w' k! g* W! p5 k+ {    if(upp_error_count != 0)' s2 C) a8 ^5 _! p
        UARTprintf( "upp_error_count=%d\n",upp_error_count);0 a7 S7 h. |9 x4 W$ {8 v; j
    else
& V2 d& q( u& V        UARTPuts("uPP transfers complete!\n",-2);
2 R- Q; g! ]$ I- X1 s( W& ?% K! C
% K' f! n8 B4 P* v9 p5 e    UARTPuts("Do you want to print all the data?(y/n)   ",-2);
1 P9 _8 S$ E- H" |5 e" W$ a    UARTGets(ch,2);
1 [" u4 }' _" G2 q; U1 H% T& x    UARTPuts("\n", -2);
4 o, P1 X: P" A% K( G. F$ A. P, J
2 p2 z$ F% O2 H5 J    if(ch[0] == 'y')
; h. E1 k' m3 j$ }1 r/ ^8 W! t    {
& \" X0 ^! D- T        /*打印全部读到的数据*/
. `3 U! w1 ]$ Y6 a2 ?        for(i=0; i<upp_frame_size; )
' T" C+ K9 g- i  C        {4 c7 b  B8 L' Z# H
            for(j=0; j<5; j++)7 u. i5 q! l8 J# V7 z  m2 O' h
            {
% s# S; D. M. k- ~                UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a);
/ z/ l( X& K, P! I; t( G                i++;
. d% V1 v, y4 o4 t                //if(i >= 4096): ~% W  {- g3 |6 R, v7 t8 b
                //    break;8 }# x6 }- q4 T/ M+ B

5 |: \* h- O8 l  K& U: |! _3 l( H            }- ~: N( K: C& P; f8 m1 }( L3 i3 P
            UARTPuts("\n",-2);
3 }4 C3 Q0 v6 l        }! `6 U4 [; T: B3 L% K
    }
9 O' B" m& \9 [; m# d. g) W4 X
' U0 G+ W  {. q}
: N: z# H& K# q+ ~# J9 X

& `( d$ a7 ?+ h. U4 z6 S, d" X# k9 V' ^3 d6 H3 i9 r" T) B2 ]( |. W

作者: tulipyyf    时间: 2014-12-22 16:08
追加说明:任务是空闲任务,因此没有做循环。
# M, H- f6 u& \0 v
作者: Lewis    时间: 2014-12-24 18:06
多次执行是没问题的,最好不要用空闲任务,优先级太低。
) H7 E; Q' \/ c+ K3 H5 u




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