嵌入式开发者社区

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

作者: tulipyyf    时间: 2014-12-22 14:35
标题: upp问题,在SYSBIOS下的应用问题
下面的任务,只能在第一次执行UPP时成功,后面的均不成功,请创龙工程师看看为什么?% m7 S5 a8 }. M3 k9 H* `, f$ W
Void UPP_TASK(Void)
! e( Q6 h. s3 {' g{
  l. {+ c+ r$ f/ t- `, Z& f% ?, G0 W& [4 a9 k; o
    int i,j,k,target_int_count=2;$ \" k! Y9 E8 v2 Y: ?, a1 u
    char ch[2];. g# L9 c% c  P- n  W! ?" G
5 V$ t) L$ ^6 W7 B( e
; L! a+ k! m) M
; U, O6 Z% L( S5 {
    upp_interrupt_count  = 0;
9 y1 r: `& v7 ?  y    upp_error_count = 0;* S- D1 `1 n  d- g6 O
" }: a8 z" R6 M  `) C
    UARTPuts("\tResetting uPP buffers...\r\n",-2);! X# w* J5 P5 M; b- h
    // Initialize data buffers( |3 _1 K% x. a& b" v* `  c" a) Q
    for (i = 0; i < upp_frame_size; i++)* Z) I6 M7 E- f
    {% g" T3 r1 m! ]6 F, ^2 Y3 F1 K
       upp_buffer_b =i;1 J0 L3 M$ M8 [' b- X% |2 M: W  ^1 L
       upp_buffer_a = 0xDEAD;/ f( ~7 v7 l$ }: Q. C. V& I+ ]
    }! f9 y& e0 A  P7 v

: n% A# u7 I$ N    //for(i=0;i<1024;i++)( e# `% K! @- J9 X& c
    //    temp=0;
* [, l1 `% M- `! D/ d
1 ?  q  r/ E8 ], C4 \, W: J) I5 s    //UPPReset();: m% o8 J5 l. D$ Y, l3 \* N
    /*启动UPP DMA传输*/
+ [9 d2 v% R: c- n    UARTPuts("upp_prog_dma_i\n",-2);
. T& W  u- _+ W    upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;8 E0 c7 a& q7 l8 Y$ {" z6 d, _
    upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
4 J" h5 v4 t' c3 A4 w5 z4 d) D    upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);
) h! `8 p& `* H6 I8 E
+ `% N$ }- C0 m, Q, v: \    UARTPuts("upp_prog_dma_i\n",-2);
3 {! K+ N/ s, _8 r    upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;' p; ?  \' i9 ]& q2 J( U7 \. I
    upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);/ c9 d& X  z3 |+ z
    upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);
1 t5 |6 N$ W/ t, ~" ~# M# d. ^% @7 I3 L/ h
    /*等待UPP传输完毕*/
; b5 J- U) h8 |5 q  x7 j% A0 `7 C    //i=0;  S$ T+ d+ X0 N8 p
    //j=0;
1 Y' D0 n# f) ~: V# |* }4 ~3 S    while (upp_interrupt_count < target_int_count && upp_error_count == 0)
' ~4 p) j. h9 j  i8 l. ?6 p8 ]& A- f    {& [  Z2 y5 e0 E: _1 ?/ k( p& v
        /*  测试UPP传输的同时操作普通DDR数据
  R0 |. ?; P8 l3 D3 `2 z        temp=i;. Q' Z% Z4 P# b2 p/ y- Z
        i++;& o' o2 D( _5 O4 w5 P  a: \/ b
        if(i==1024)
& d4 H& O8 O0 H8 \  O% t/ z0 o        {
4 {5 N8 m0 _4 l! x" X% s) a            i=0;
, ?/ K% E# k) w/ K. C            j++;
4 b  ?  u# q2 Q" k- d% {1 v# {  O        }
1 {& I: x' d2 g9 T( J8 m# E0 N0 [        */
( Y  f9 Q1 F% i& e( P
2 B! }: }# a$ F- {: s       asm(" nop");3 D/ w  v/ F/ f7 Z  ^7 L/ S$ O
' H# n5 e1 b. |9 z' k$ o
       //UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);
8 J3 y% a1 G% c  s5 G% \7 I    }
6 l; I2 Z5 C7 A! t$ f4 y7 a6 _/ W' r5 }) O
    /*检查UPP传输的数据是否正确 (loopback modes only)*/. n* J4 A) A% j0 M
    //UARTprintf( "i=%d\n",i);- w0 V7 g$ z/ l4 n2 U
    //UARTprintf( "j=%d\n",j);6 ?( f  v6 m1 v. E; |8 I4 h9 ]7 h
    UARTPuts("Data mismatch in buffers.\n",-2);- _# a8 S7 h9 L
    if (upp_interrupt_count == 2 && upp_error_count == 0)
+ F7 |! S3 [) D  M  L9 Z    {. _! U+ x' K3 K0 D
        for (i = 0; i<upp_frame_size; i++)
0 A& a1 Z& `! w' r% r' L        {7 \2 N$ [, S5 h/ @( k5 A* Y
            if (upp_buffer_a != upp_buffer_b)
. S; n# S" @* U* B9 T            {
1 Z* ]& }  z% q6 ~9 N0 J, U6 \' A: w                upp_error_count++;
- \1 f+ {6 J% |  T            }
  j! P6 U8 B5 `% m) p5 H        }
- `( o3 u9 S+ L( E    }+ p9 a: _6 H7 g$ ?

, }# y7 K# e& a& u' A9 t    /* 报告通信结果*/8 ]2 Y. h% n  ~$ i4 V2 ?
    if(upp_error_count != 0)
7 o- A0 M) }" P0 X# R* O$ c        UARTprintf( "upp_error_count=%d\n",upp_error_count);
! t+ M  a- d2 u- Q  u    else
6 a9 R7 W* ^6 f        UARTPuts("uPP transfers complete!\n",-2);
) U4 c9 f3 J& [- N/ B. ]3 o0 Z/ S
    UARTPuts("Do you want to print all the data?(y/n)   ",-2);* i; s) A' M9 `2 F5 I! F2 H
    UARTGets(ch,2);9 ?4 C- @7 L2 j5 q- S3 j5 s. s+ H
    UARTPuts("\n", -2);5 @. `  K3 E2 p. o$ S( m& G4 ~/ M, Z6 X

/ a6 ~& i* ^- |( c3 e0 X1 Y$ i- i    if(ch[0] == 'y')
4 |7 e/ J% |$ Z$ j1 T    {; c" B6 O$ U  o  [6 W' P& }  P! F
        /*打印全部读到的数据*/, v1 e; V! r1 R( ]/ H
        for(i=0; i<upp_frame_size; )
* B) |: ]9 g( Z" d        {; R' p2 e' f. _7 ~* G! s
            for(j=0; j<5; j++)
9 Y# I" {# l+ k# p# [4 U            {
6 a. J# x2 m1 z* B6 u                UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a);
( T* N5 v6 `& ~                i++;/ [# y% [# A: W* ?4 a8 A& L' K$ W
                //if(i >= 4096)" v8 T0 u) b6 M1 M) M
                //    break;
; Z* o$ ^- U5 I: s  q
+ B1 e; y- m5 d- m7 _+ D* G4 Y            }
$ |3 C8 j. f; x9 E- p            UARTPuts("\n",-2);
$ g. |! Z1 H1 K- Z; v        }3 H9 u7 D: [8 P; p: o
    }
2 U$ A# M1 a4 R
* L& q' ^6 `) d}
  X* C/ P& k$ @  w7 T9 q' r9 L8 E) Z
$ w. o* D7 D7 u9 K. q
3 s1 |+ [! J( ~3 C$ `

作者: tulipyyf    时间: 2014-12-22 16:08
追加说明:任务是空闲任务,因此没有做循环。0 d) Y0 v1 C/ \" b  j  c& u: p

作者: Lewis    时间: 2014-12-24 18:06
多次执行是没问题的,最好不要用空闲任务,优先级太低。
, L: w; T! A& U1 v: E, x2 \* Q




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