嵌入式开发者社区

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

作者: tulipyyf    时间: 2014-12-22 14:35
标题: upp问题,在SYSBIOS下的应用问题
下面的任务,只能在第一次执行UPP时成功,后面的均不成功,请创龙工程师看看为什么?( _' O, h' Q: o- {, G, Q
Void UPP_TASK(Void)
5 W6 f9 p( }8 }+ B5 h{
6 \' J0 T. x  X1 N" Y7 D( K  |% M- W
    int i,j,k,target_int_count=2;+ w' G# ^0 ~# n+ h
    char ch[2];$ j. C) s. x: C" m* k; n

3 J/ H  m5 ^. w& }/ H( H$ @6 q  X3 }# e! R) R! F

' r$ m. Q# i/ |* }4 h, V    upp_interrupt_count  = 0;
6 f" H8 b1 e  G" h    upp_error_count = 0;1 t& G8 {2 c* u+ `: l

/ [$ g( ]4 o& T& |    UARTPuts("\tResetting uPP buffers...\r\n",-2);/ Y0 B. _+ K" r' e. h' N
    // Initialize data buffers
6 x0 g- i, N+ g    for (i = 0; i < upp_frame_size; i++)* e3 ]* `/ B# F; ]0 J' r) P
    {" ~: l5 @. W8 o: z
       upp_buffer_b =i;' ?% g' _1 b; q' \; W& @
       upp_buffer_a = 0xDEAD;# k7 d: I  U; S, j9 N, Y) j
    }9 X, F0 Q4 ~7 C& W( k$ H
. O5 {: w4 I; E5 X  a  L
    //for(i=0;i<1024;i++)5 ~) o' F7 U7 y8 q: I3 y
    //    temp=0;! D$ e1 z0 c) N1 [$ S# v$ D* K; ~
& h" ]+ {8 w+ B+ N# A
    //UPPReset();- \9 d; n* }. M
    /*启动UPP DMA传输*/
+ O. s7 a9 u$ a' P: b8 F    UARTPuts("upp_prog_dma_i\n",-2);
$ b( _1 l' v1 R: G    upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;
+ U2 k' g1 W! o    upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);! O# |6 n) Q# p
    upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);
9 R9 z& B( _' u$ `2 [. ^. F7 I$ N
" L6 D/ o+ m2 r' T    UARTPuts("upp_prog_dma_i\n",-2);
" w# ?& w6 [' o7 P* i2 R    upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;
2 O, O" s" a. r    upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
% x4 X& f6 W  @; P  ~    upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);0 D6 p0 S% W* M9 ]- h' Q3 [
  x7 T; z" F9 a6 X9 \6 P. x' a
    /*等待UPP传输完毕*/
2 m$ @2 i5 C: f% ^3 O    //i=0;! Q/ u# s1 j; A! A+ b+ C$ w8 z( w
    //j=0;
$ }, _' `, A% i* T    while (upp_interrupt_count < target_int_count && upp_error_count == 0)
/ o- r0 |/ Y( y2 o  S6 h    {7 P3 H; V% _2 D" [' d$ K- t
        /*  测试UPP传输的同时操作普通DDR数据
7 U9 I$ H2 i1 T6 ]" y/ M( j        temp=i;
3 }/ c8 e$ G8 `! z! [        i++;( H1 P8 ~* L1 D/ M
        if(i==1024)/ @: V! _; X# {5 w
        {
: B5 ?$ P1 I: D+ \( h6 c: ~            i=0;3 \% P$ J! z0 D" h: L- M
            j++;. L$ M! }: D+ I* Y# y$ ?# e
        }" z+ j* E+ Z$ W7 q
        */
/ D3 V0 @* r0 D, N- i/ K- j9 H  |: p, l1 x2 r, ?6 V$ d8 t
       asm(" nop");, V; ^7 p) `4 ^( o

! P1 x' K; w: H/ Y! _- X' \* [       //UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);
7 G: y/ R8 v3 g, t: b* ~    }0 c# C* B- h3 t, S/ F# g# O

6 ]; d5 _# X5 s    /*检查UPP传输的数据是否正确 (loopback modes only)*/
; U8 _6 s, A  H" l    //UARTprintf( "i=%d\n",i);0 N1 q, w; a( Q/ o3 F+ t5 i
    //UARTprintf( "j=%d\n",j);
( k7 s- Q7 H; `2 b: U    UARTPuts("Data mismatch in buffers.\n",-2);
* c; C5 o9 N& {; I+ j1 W/ I2 Q: Q    if (upp_interrupt_count == 2 && upp_error_count == 0), V  t% l) H. H4 V; T: |
    {5 Q& x! g0 ^, Z8 i8 Q% ~/ C
        for (i = 0; i<upp_frame_size; i++)* _: n) S: z. t' a) M. B) X: R  x
        {
7 C4 X7 i$ E6 h$ l/ \" ~            if (upp_buffer_a != upp_buffer_b)
- s4 A) y, _% _3 I% B& C8 H            {3 ]% D% z- G; r; X3 L
                upp_error_count++;3 t  K8 z: ]6 \4 [! t
            }* Y6 {) z9 j9 Y  Q) W8 Q$ X6 Y- H5 G
        }
, j9 u! B# s7 |    }# |. v' w) s0 t

" s& @8 a" F' y7 U  X0 h& I    /* 报告通信结果*/
4 F( j" W8 h; l" e    if(upp_error_count != 0)
! d/ q$ q" I# u        UARTprintf( "upp_error_count=%d\n",upp_error_count);/ x( D! s* g0 v; O2 P
    else! z6 V! d% b# s/ ^
        UARTPuts("uPP transfers complete!\n",-2);4 I, s. {) a2 w$ ^1 w
8 r8 }9 W6 `2 F5 F; {
    UARTPuts("Do you want to print all the data?(y/n)   ",-2);5 f) v* W8 ~: ^, R
    UARTGets(ch,2);
9 z) s$ w6 d' E( `1 v" n    UARTPuts("\n", -2);
9 u1 o" S; T0 q% K, a' {# h, P! Q7 O5 E+ Q
    if(ch[0] == 'y')
3 Q, z0 c& [' b$ i; I$ n; \; m# N    {
  {* O- T3 v+ H1 m% ~# U# H        /*打印全部读到的数据*/) A: O) T  R7 D. I1 C
        for(i=0; i<upp_frame_size; )
2 p; L2 D+ z, U; Y$ ~        {
6 n. s: v7 v- W6 l2 W            for(j=0; j<5; j++)9 p1 N3 n2 T( x) A% p- N1 X! [0 L6 ~0 D
            {
$ f0 ?  ]& }/ s# R6 G, w                UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a);
' w1 c- l1 y4 U                i++;, A# v6 Q) c: c2 ~
                //if(i >= 4096)5 y. j5 @# @+ I
                //    break;
( W; M0 |/ t# I- h4 W" p
5 \$ i* ~$ }  x0 C/ S8 u            }( V& k6 X* f4 F5 ^' ^. X
            UARTPuts("\n",-2);: X0 z1 o/ y4 c0 z
        }
6 E, s! u' O* }- j3 z    }
" g3 A6 v; Z0 H1 h/ J9 V' A6 B  t  ^+ Y7 I5 y3 J
}
5 p  R& q! \$ ?4 ^

3 a1 L( m( y5 p; b( ]0 v& E2 ~$ ?# J: j1 M

作者: tulipyyf    时间: 2014-12-22 16:08
追加说明:任务是空闲任务,因此没有做循环。
: \4 @' ~2 h5 P6 Q
作者: Lewis    时间: 2014-12-24 18:06
多次执行是没问题的,最好不要用空闲任务,优先级太低。/ L, \$ m( y7 x





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