嵌入式开发者社区

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

作者: tulipyyf    时间: 2014-12-22 14:35
标题: upp问题,在SYSBIOS下的应用问题
下面的任务,只能在第一次执行UPP时成功,后面的均不成功,请创龙工程师看看为什么?
9 o% k3 {/ k6 A; W
Void UPP_TASK(Void)
& R% V7 }) T8 S6 K4 R. ]{/ w% R5 ]% c2 ]8 e. n3 d

; M4 d2 H' O, X- ?2 s. P7 }    int i,j,k,target_int_count=2;( L9 z5 i7 f0 |" R9 n
    char ch[2];8 i" m2 N8 K4 X; F0 [
0 z" F  P" u( C: D' d) E7 j
1 e9 j- s7 I* Q& S0 {& t& z" S: F3 i

6 B2 Q$ j: n/ `4 P4 S: D% R* n8 _    upp_interrupt_count  = 0;
. n% s/ B! w) W    upp_error_count = 0;$ n6 u  X' r" s' {7 M

0 \0 F$ Z; F! j+ q; [4 K" {    UARTPuts("\tResetting uPP buffers...\r\n",-2);7 B  R' i7 v# B
    // Initialize data buffers6 G' R. p! u% @+ `, b. T& K# z$ d
    for (i = 0; i < upp_frame_size; i++); O  R0 E, H1 d% u4 U; }& T: I
    {( h0 {, t' M) v4 T1 u2 u5 K
       upp_buffer_b =i;
* l3 |: n0 G3 x+ u" a       upp_buffer_a = 0xDEAD;
' L, I2 V3 X1 v    }
- u6 M/ R# p* b% y! T0 e( u; _
; ^8 [! G) s! D# d$ {3 F5 C    //for(i=0;i<1024;i++)
* d+ o* j5 b4 k- L( o+ J8 w" j    //    temp=0;- i  f0 w  O( G" R

" M4 N2 f- Y( R  S  d+ ^    //UPPReset();+ b: e0 }4 S9 V+ ?% ]+ h
    /*启动UPP DMA传输*/; v) j/ O& y4 O, {9 T0 V
    UARTPuts("upp_prog_dma_i\n",-2);5 i7 ^4 Q9 k- T: v+ B
    upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;
6 h! I; b& o3 b2 r7 u% e    upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);* ^; |9 D' I' t' T
    upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);6 Z' b0 v# \& r2 m* M
6 `5 _- G' {" i
    UARTPuts("upp_prog_dma_i\n",-2);
0 ?. E; L' O: |: Z" h/ [" l8 U. ?    upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;
- ~5 _! a7 L  ]" }$ }0 |* m4 ^    upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
, ^3 x+ M# A7 b& h, \1 c    upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);; N( o$ ^+ g! k; w

& i5 t% N! f% N* E. K3 D    /*等待UPP传输完毕*/
" u5 I+ C; O: w7 E    //i=0;' L' H1 L1 _4 B9 F, S/ g# |
    //j=0;4 p0 x0 S) E/ ^# I3 ]  }  k
    while (upp_interrupt_count < target_int_count && upp_error_count == 0)
; J$ u/ Q# K3 A6 o1 Z6 b8 f4 k- u/ N    {9 H+ t/ Z2 L0 t! J( j- l6 i
        /*  测试UPP传输的同时操作普通DDR数据; }* b* g! J: @9 F' S
        temp=i;
5 o# A$ o+ B# T- A. E5 m        i++;
; l* x. O8 m! T- \# u4 V& f        if(i==1024)
: }, C7 K! ^. S        {& ?8 [/ |% O9 |/ ~7 ^  S1 M* Q' G* V
            i=0;; g2 Y  U8 a* }8 v
            j++;
! O+ D8 B, x+ t+ `( H8 ]+ |3 `- \        }
8 r# Y8 q) j' `        */
( ~$ k5 ^& H  U& W+ J. B- @
7 M) M. w! N2 }" s       asm(" nop");7 Y" o9 d$ S, U8 j. E1 M

2 U# n5 e$ e7 ?5 O2 q" m8 e       //UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);) \. \4 X" S/ x0 W7 p4 y% G3 U
    }1 p3 f# p2 P& z
0 Y/ [$ Z6 K/ R) p/ C
    /*检查UPP传输的数据是否正确 (loopback modes only)*/' l1 {" O6 e7 L; }' [( S
    //UARTprintf( "i=%d\n",i);" M9 a0 X7 v- Z. b; O6 r* R8 }  r7 M
    //UARTprintf( "j=%d\n",j);. n! C  S1 Y. l, B9 {2 e5 C9 C
    UARTPuts("Data mismatch in buffers.\n",-2);
9 t9 A: L0 u1 F7 E5 H    if (upp_interrupt_count == 2 && upp_error_count == 0)4 @, K' E/ }9 W; ?
    {9 J. r# g0 y; }! k3 w) q; S
        for (i = 0; i<upp_frame_size; i++)3 {/ s! ?( r4 q; H6 b
        {7 v/ K/ }, v/ b3 U+ o8 d/ [; l
            if (upp_buffer_a != upp_buffer_b)
9 T5 o, Y, j) @0 y            {
' y$ U" `) J, D. Z                upp_error_count++;4 S3 i4 a" V( W2 k. Q
            }
+ ~! k+ Q: w, e/ g# X6 w$ ?% J" \        }2 r5 z! n: u& M
    }0 S: \5 b+ j6 h6 K' d7 _

% g0 a) W/ f, m" m. r6 K  g    /* 报告通信结果*/
# X# \4 y# W% v/ q  Z8 S5 m    if(upp_error_count != 0)/ D5 ~: r) l, ~4 Y
        UARTprintf( "upp_error_count=%d\n",upp_error_count);
( p2 A' l6 m. v4 y2 J$ B! Z+ Q: ]    else
5 n" e, @# A/ V0 E        UARTPuts("uPP transfers complete!\n",-2);+ l) \1 c7 o/ i: [

; ]4 L6 h4 V% {+ \    UARTPuts("Do you want to print all the data?(y/n)   ",-2);7 k$ T0 k. X; O: ^! ~; m. Y
    UARTGets(ch,2);7 F1 o8 |4 d! t* o
    UARTPuts("\n", -2);
+ p7 q- J3 N$ k; s* J2 S( L' {$ s: _9 E) l: }: y' v2 x  ?! n" Q: x
    if(ch[0] == 'y')
! W: M2 @6 [" L. F! y6 ~. |; @    {: H! X4 K: u2 J& A( M! k
        /*打印全部读到的数据*/
5 I5 e7 u+ P' u5 j        for(i=0; i<upp_frame_size; )
* f0 X: d2 U+ j% D1 r9 `$ \        {
8 L. e7 T( {, G3 d; z! e1 ^9 J0 E0 p! u            for(j=0; j<5; j++)8 T$ Q% a3 l6 i) Z( Y4 ]( Q3 F) g5 W
            {
& S# V2 p1 \1 j( B) N& c                UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a);
% l; g. B0 ~) `. q$ D) `, P                i++;
1 ], k7 h) |9 U                //if(i >= 4096)
5 n+ Z5 J. k* O* p                //    break;
* W' [: ~* q7 m9 p
8 d; p& V' s( I/ u            }
4 M' F, X+ O. K! n            UARTPuts("\n",-2);. K, g$ H' ]2 Y0 C0 b3 ?" ^5 A
        }: S) a1 W5 ]+ Z- y5 u
    }
- D3 G1 c/ Q* x4 f- m' R" h9 c6 _9 x& S4 E/ s$ g" [
}
% F- ?9 [4 s2 v5 F

4 J: c& p: W$ p$ u7 E0 p# p9 J4 @0 X& Y/ ?: _  G8 e

作者: tulipyyf    时间: 2014-12-22 16:08
追加说明:任务是空闲任务,因此没有做循环。
. g5 l* ?+ Q  z3 ~. u
作者: Lewis    时间: 2014-12-24 18:06
多次执行是没问题的,最好不要用空闲任务,优先级太低。
* s# _; w: u5 D$ _




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