嵌入式开发者社区

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

作者: tulipyyf    时间: 2014-12-22 14:35
标题: upp问题,在SYSBIOS下的应用问题
下面的任务,只能在第一次执行UPP时成功,后面的均不成功,请创龙工程师看看为什么?
$ R* ^; r* ^/ u" M/ S% J; b$ Z: m7 N
Void UPP_TASK(Void)
4 A$ U. x" q& d7 ~. [! N{& r# q2 l& u+ X/ o, n

% K$ j/ R, y  M7 b    int i,j,k,target_int_count=2;. Z0 ~1 @+ c1 E* Y1 A' w* X4 r
    char ch[2];" g, ]6 l: R- B; z
& |" b& Y9 I) q) h8 b8 K1 r6 U& U# [, Z* F

6 R9 b# q9 m4 y, p" l7 O7 |5 c. y7 I# e& p. ]
    upp_interrupt_count  = 0;  F" g9 X; d/ ^
    upp_error_count = 0;) p, g; @+ G& v9 G% P  G8 V
0 D8 H, r' m& ]4 h+ c" `8 n* ~
    UARTPuts("\tResetting uPP buffers...\r\n",-2);
! M9 H* p) I6 Y3 F' M    // Initialize data buffers
8 k( f$ H3 n" ?% H. e* Y) e    for (i = 0; i < upp_frame_size; i++)
1 U' c3 P, ^- v    {5 `; v, R0 A$ |7 V
       upp_buffer_b =i;8 j; s5 j& n% n6 I# A2 G
       upp_buffer_a = 0xDEAD;
3 n3 L- Y4 {4 a8 l' S    }! t; }) f' v) N1 ]& s
8 X, n$ t5 V1 u, Z# m. G
    //for(i=0;i<1024;i++)+ A+ ?) ]& S8 i- N
    //    temp=0;
) p/ X$ u- K' q) t5 }$ w
) u! D! e' U% r9 W8 h5 b    //UPPReset();+ W7 ^4 d0 i# V; |* I0 P* p
    /*启动UPP DMA传输*/
; [, S  q& I  l" W    UARTPuts("upp_prog_dma_i\n",-2);
8 J6 }# X3 I% }5 s6 j    upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;
9 q% y5 b8 M8 Q6 f; ^    upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
$ K0 v  G8 q; _% `4 k6 f    upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);
' _& |  t$ s: a5 r5 B% G) f% m. r3 ^5 q
    UARTPuts("upp_prog_dma_i\n",-2);
5 @$ o% w9 E7 Y( a    upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;
# I# u& n, r- b! T    upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
' }$ A4 Z' S; ]3 j9 g    upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);
! y' x% L& }4 a6 }% A0 E* v
$ Z  d6 H. |; E8 I; V8 M6 Z    /*等待UPP传输完毕*/" q, P- Z1 y, o! P$ B# W
    //i=0;
! G" I: I9 r# z- l# z    //j=0;0 {2 ~0 g7 o5 a" w
    while (upp_interrupt_count < target_int_count && upp_error_count == 0)
% k' J5 ^4 O! g& N! H+ q    {6 ~4 D+ [, m* E1 ~5 y. \2 ]1 i
        /*  测试UPP传输的同时操作普通DDR数据# u( Q. ?) y3 f* y1 ]1 R
        temp=i;8 d5 a2 H1 R& A2 Q! y
        i++;* `  k7 q4 j+ v- c# Q5 e
        if(i==1024)7 s9 w7 @4 i% }- \# d1 Y8 i" f
        {
6 A6 j: }/ a# W            i=0;
7 n( A4 c' U3 |* b            j++;* J0 p0 d) |9 ~! B% K2 X
        }
8 l' A7 L5 g, f$ N3 F! E        */4 V0 Y- J/ Z6 T) X7 T

) X+ i% e. m6 ?& \$ N* Q  R+ h       asm(" nop");  a$ f) s" T2 }

# e% s; |. [+ P4 g/ o$ n       //UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);+ O+ I, I) r9 `9 ~# F% ~/ p
    }8 R  m6 E# Y* M6 k! B8 ]7 U7 ?
+ b* ^5 [8 H# g5 [
    /*检查UPP传输的数据是否正确 (loopback modes only)*/8 \0 b, @0 N/ f! g$ d- N' T
    //UARTprintf( "i=%d\n",i);
. v* ^  T# I0 c0 S3 T$ Q; C4 x0 b; I    //UARTprintf( "j=%d\n",j);* J9 u) p, O1 l
    UARTPuts("Data mismatch in buffers.\n",-2);# d" y1 t" M8 U) _% G' h! s
    if (upp_interrupt_count == 2 && upp_error_count == 0). y8 P0 u8 d  a
    {9 y1 h/ Q3 F; ?8 a5 M1 C
        for (i = 0; i<upp_frame_size; i++), k+ R: x6 A- m) M3 l
        {
- q% r/ c# w, b4 A) a            if (upp_buffer_a != upp_buffer_b)
. D' v0 p  d+ L7 ~/ M            {1 s# q/ X& {5 w7 b3 W
                upp_error_count++;9 h. W( p" O+ d! ]: b0 l# J" z
            }
) [- t3 r) {; a2 I! ?* [. _0 ]        }
- q: R+ v9 K' M* n    }9 p! e. j4 Y, I) m

! P1 g3 t! b2 _1 X  A    /* 报告通信结果*/) w* w6 ~! q" d( O$ _( `2 q
    if(upp_error_count != 0)
& r/ n+ V# S3 j9 w+ ?( Z8 S; ~        UARTprintf( "upp_error_count=%d\n",upp_error_count);- z$ k" u) ^4 o& f4 L- K
    else) `0 N9 ^" r7 I5 e8 \1 t& e& M( d+ U4 S
        UARTPuts("uPP transfers complete!\n",-2);
5 U9 q$ k( Y) N2 G* S+ V1 d/ b, Y* r* f& k, Z& O5 a) J1 [! `
    UARTPuts("Do you want to print all the data?(y/n)   ",-2);; W& i" D+ T5 S) a5 \
    UARTGets(ch,2);: ?0 ^$ A! h9 m5 i$ M
    UARTPuts("\n", -2);
; @! `6 E# @* J6 z) @- P7 z1 ^7 N( H4 T; K. D6 d5 J
    if(ch[0] == 'y')+ d' B* p7 U: H+ X) ^, N) b4 F
    {
  _$ Q1 G  f7 @3 J/ o3 \! y        /*打印全部读到的数据*/
6 k; x; L7 w( T9 o        for(i=0; i<upp_frame_size; )
) Z3 _7 k5 ]! c6 B* u+ H        {; \. B4 a0 b# U( n
            for(j=0; j<5; j++): U" I! {5 Y( z( O  s+ A
            {
1 X4 c- o$ M' m7 D/ b8 F  j                UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a);: x/ C. J  {5 E
                i++;. B$ L2 R4 \* h3 ~$ S
                //if(i >= 4096)
  L) |+ c' x) I                //    break;2 D; I  k' N4 y* }

+ G, d( n; S" g: S$ J( g            }
( o+ }2 o0 K$ m+ ?6 Q4 l            UARTPuts("\n",-2);( a6 A# v( J. A, t0 K# U9 S2 h+ O
        }
5 v' `( h& c& r4 X+ l% p  ?    }- O7 u% a# \1 z) {# ]

3 Y- Q; [. H: L  ?# ?, Z}
0 e. q6 v" {$ R' |/ R1 @

, v3 T) i: T2 q! A/ _' ]& C  \7 ?
' i7 p# U( V9 X- `& ~3 ]! O$ o, [
作者: tulipyyf    时间: 2014-12-22 16:08
追加说明:任务是空闲任务,因此没有做循环。' m* q: O, G1 Z+ \: h

作者: Lewis    时间: 2014-12-24 18:06
多次执行是没问题的,最好不要用空闲任务,优先级太低。
9 v% |& e; q- c0 E




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