嵌入式开发者社区

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

作者: tulipyyf    时间: 2014-12-22 14:35
标题: upp问题,在SYSBIOS下的应用问题
下面的任务,只能在第一次执行UPP时成功,后面的均不成功,请创龙工程师看看为什么?' X) T' _3 ~, N% p0 W2 I3 p
Void UPP_TASK(Void)
: [( ~4 g5 c# ]3 N! \0 R{
8 b: u0 ?$ t4 y+ ~4 o! v, [8 C3 L. s$ h* q
    int i,j,k,target_int_count=2;! ]7 `; _5 r0 j8 U0 ?$ j
    char ch[2];) h. ^& T1 U- X

3 Z& {6 J2 s1 H: \2 |4 b7 D; T- I: \
* p- U5 v4 \3 D
    upp_interrupt_count  = 0;8 x+ C0 P* K- i8 j
    upp_error_count = 0;1 F. p2 T3 v5 f" _

9 w" o8 e6 ]) d, w    UARTPuts("\tResetting uPP buffers...\r\n",-2);
! L; }) Z7 R7 a    // Initialize data buffers$ @, E. }2 w$ Z% k  i$ U/ u
    for (i = 0; i < upp_frame_size; i++)" ]2 d) M% F4 W9 o
    {
/ C- F' G+ F3 ]* L8 @8 t! x) H       upp_buffer_b =i;
" q7 u. C( w3 l. S/ q: s       upp_buffer_a = 0xDEAD;, B+ ]. v$ N, i
    }- \* E& n# T9 s, i5 |1 ]2 D1 K' T

& N' W$ o0 V8 k$ W; T    //for(i=0;i<1024;i++)* n6 ^4 d$ C8 W! x
    //    temp=0;
- u4 t1 L% y+ W- V+ P; F- X; W, J4 j
    //UPPReset();1 h3 _  V1 t. K( r1 Y% B
    /*启动UPP DMA传输*/
( n" F7 J) w3 Q  Z    UARTPuts("upp_prog_dma_i\n",-2);
" @- d) d" O) ]2 g& q$ o8 W2 ]& d+ s    upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;
. J& n5 b# S1 O    upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
% R5 R7 g/ ]2 `' q' r$ F; Y    upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);
! k: l3 W! v# F  U0 Y% h% K
( {0 n7 P) `9 C$ d8 d* j    UARTPuts("upp_prog_dma_i\n",-2);
! E1 d% `  k! @    upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;& r% o4 ]3 c0 ^% y
    upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
2 M) N4 l7 r, \* B  n  c    upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);
. ?; @/ y* i4 N1 e1 n# y* ]9 S9 i0 n: i( N
    /*等待UPP传输完毕*/+ e9 p% Z& M, B; \) m* M7 C
    //i=0;1 V' |1 a5 c. F% ^  B! ~0 ]
    //j=0;
, t- V0 D8 M' K( i0 o    while (upp_interrupt_count < target_int_count && upp_error_count == 0)
' Z! ~( a" q6 K! K+ Y9 f2 C    {
# y5 f- c1 X- O. M5 C9 k        /*  测试UPP传输的同时操作普通DDR数据
5 L9 W6 ~, A0 J* s        temp=i;* H. |- S# z( ]' G* B7 }, {3 i
        i++;/ Q6 [: g# S4 Y" s4 u9 _% @* j
        if(i==1024)
; S& F: X% _! q# \2 N* ?2 Q9 G        {9 B, _3 o) p+ v# R, D" Q# W
            i=0;
7 I' \7 F3 M- E' N            j++;+ `  j( ^8 J  p9 U4 P$ ?
        }
) Y0 ]" a  G+ s! M. E        */
6 c4 k; X7 ]2 ]" x& M+ c5 D* S+ W7 C0 t1 m
       asm(" nop");$ e0 c7 o2 }; j; a6 ^
: I* x$ l3 x5 ^
       //UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);
3 I' r3 Q! C: i7 T2 E    }  c) z, M2 b: H$ S

3 A- y" ?" @4 @& q5 u    /*检查UPP传输的数据是否正确 (loopback modes only)*/; v% C) x; ]( {
    //UARTprintf( "i=%d\n",i);& r1 A. n/ U8 N6 _0 s
    //UARTprintf( "j=%d\n",j);% ^  O6 E# `' j5 T  u
    UARTPuts("Data mismatch in buffers.\n",-2);; V$ o% K7 H7 G
    if (upp_interrupt_count == 2 && upp_error_count == 0)4 v9 p0 f( c4 J' y8 ^
    {, `- ?2 U/ ~/ Z3 Q8 O4 m: t) j
        for (i = 0; i<upp_frame_size; i++)
8 ?1 t! |, [9 a4 p0 J) t* l/ W: F        {
) K1 E' U; J9 B; z! |0 H. @* D            if (upp_buffer_a != upp_buffer_b)
) f. t1 a& E1 V3 e( ]' m: G. {$ r5 B; S            {+ W- e( F" B9 I- I! o
                upp_error_count++;4 T" ~0 F& ~* P/ n8 |- C: _
            }& @/ Z( I/ X3 f6 ^; b
        }' o" b8 P7 x% Q( n
    }
% t" }* E) n6 \" }, w! n' N+ X% I9 x0 p1 s2 R# @. k
    /* 报告通信结果*/
: L  L" h8 Z  W: H    if(upp_error_count != 0)
  L5 m4 ]9 e) P7 n, t7 A        UARTprintf( "upp_error_count=%d\n",upp_error_count);
% }2 P' y  M/ B5 Y$ A    else
- N; |+ X. J: E        UARTPuts("uPP transfers complete!\n",-2);
/ f- @7 N+ g& S  _6 i" I  G6 \
" d: U( y# X" ^8 E8 E" V9 V    UARTPuts("Do you want to print all the data?(y/n)   ",-2);
/ K% d2 X( P- U# l8 I    UARTGets(ch,2);
( P- y; |2 W  Z$ z$ F0 ?8 B" `& Q    UARTPuts("\n", -2);* O( _* J  [+ }, W+ e" z* D
) N: Q! y0 ?4 q3 S6 n4 R
    if(ch[0] == 'y'), y. `/ u$ T( G6 ]
    {" u. y2 _6 T; r; ~& v) c+ B
        /*打印全部读到的数据*/( z1 T: q' d- d- b  a" q
        for(i=0; i<upp_frame_size; )
' w9 X9 @* g. p! L' |        {
+ X1 R  M& `5 |            for(j=0; j<5; j++)3 y8 i5 h( B- ?& m" O% B' q
            {
0 v4 C7 d8 s9 t/ F                UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a);% p+ P  C' l! e6 {
                i++;
8 Z8 J) T3 Q8 Q" w2 r8 v                //if(i >= 4096)/ p3 h/ M$ a, H8 h
                //    break;
" |( i4 n# z. f( ^/ G2 w7 i( ]2 ?2 j7 w' A' ?% l* H. \
            }
" t! x6 Q& ^: J1 u            UARTPuts("\n",-2);1 e3 \$ n& A# ?, U- `* ~9 t# ^
        }0 W' e' S+ i# L9 ^/ o
    }
# S* M. \& o4 b( `% g" m5 j/ ^# E5 R% j% K) ~( W. s0 Y3 Z% }. c2 @
}
4 j$ M. b! p9 ?4 A$ S# j! F3 [

; U0 X7 Q4 ~( r# y' H  F# V4 F; t( I

作者: tulipyyf    时间: 2014-12-22 16:08
追加说明:任务是空闲任务,因此没有做循环。0 a) d2 n+ e5 W: w

作者: Lewis    时间: 2014-12-24 18:06
多次执行是没问题的,最好不要用空闲任务,优先级太低。; M% E4 m* e; u: ^: O6 ~/ B





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