嵌入式开发者社区

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

作者: tulipyyf    时间: 2014-12-22 14:35
标题: upp问题,在SYSBIOS下的应用问题
下面的任务,只能在第一次执行UPP时成功,后面的均不成功,请创龙工程师看看为什么?
$ X/ s. \& \1 l1 s# z
Void UPP_TASK(Void)% I( S/ u/ R1 c2 ?4 u
{
/ l* l* T; e. ]8 k8 O2 [% t6 I5 [* U4 y* y% k+ u
    int i,j,k,target_int_count=2;2 [# ^" ?4 }2 z7 L$ P- a4 K' l
    char ch[2];4 n. d. \& s, |7 M/ a* r* W

* W% R9 y/ \( n! U3 r4 c* @5 H7 v- Q* o$ X# J4 w% X

# a' b* u( ]3 S* e    upp_interrupt_count  = 0;
* @6 j+ W% D/ ~, u7 S, O+ m    upp_error_count = 0;. T  X  C- g1 [& V

# `5 C/ e' I2 K" J* R    UARTPuts("\tResetting uPP buffers...\r\n",-2);
( @6 K$ M  r$ d$ R! j8 H9 `    // Initialize data buffers+ O" u& \1 M$ X2 V0 R0 X
    for (i = 0; i < upp_frame_size; i++)
4 A, h% `! Z. _& g# l1 P/ @. l    {
) R4 S6 {3 N5 \7 U       upp_buffer_b =i;+ l8 p# L  h. X9 p, V0 N$ S+ t, E7 c& c
       upp_buffer_a = 0xDEAD;
  _; e$ B0 `# P" ]9 n$ J& b    }! ^+ w( ?, r0 d0 w

9 R  X/ r* B7 D: |$ y; ]    //for(i=0;i<1024;i++)
, ]4 z! P) `% c" m3 ~7 l" [4 N/ }    //    temp=0;
$ P* f7 w. a$ }# [, a
. B! s1 f. _* [7 |6 ]    //UPPReset();
6 ^$ l/ x+ X& l' U  [    /*启动UPP DMA传输*/
* \5 b/ z, Y3 t; T    UARTPuts("upp_prog_dma_i\n",-2);
( a  r4 S- `: g1 r, q% e    upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;. ~# q8 V) g( k7 j" G
    upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
& [( y, r: m) y- p1 p0 ?    upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);4 A5 @8 Z+ N" B6 ]" N' N% I* Y( h
  r+ M+ F! ]" O7 z) N( N( s* C0 W
    UARTPuts("upp_prog_dma_i\n",-2);
; F" _- F: \6 E" k9 [    upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;
2 A3 u$ a& n: Y( r    upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);" T" l6 q( r, @! U! D9 D
    upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);
8 d6 |/ c( w; u* m8 ]  |' n) i. i3 [0 g4 i% k* f
    /*等待UPP传输完毕*/
/ X/ \' x7 \; P. ~    //i=0;) I8 q8 d1 ^; d
    //j=0;
6 g3 t/ Q7 b9 u    while (upp_interrupt_count < target_int_count && upp_error_count == 0)
- b; p8 k7 p* M0 p& q# p9 [3 w2 ?    {
4 C6 V9 n( v- K0 v5 l7 h: o        /*  测试UPP传输的同时操作普通DDR数据
6 j4 }$ e. E( e- u5 `$ y        temp=i;* _0 T8 F& H/ p% }# o7 z
        i++;
! h( m7 j% ?  S! n' D) a        if(i==1024)# N/ `6 \6 A) U; ]& H
        {
6 h% `! `4 a+ T: e. r2 v! S6 Z            i=0;
& H# ^  s) M6 Z/ A9 O4 v            j++;
( d9 h! Z9 u$ U        }
- G% n* W; U. l) f+ d! C        */1 h# s. N% y, a

* h3 j  _' ~" q; w8 n       asm(" nop");% v, ]/ a  ], l$ G+ r$ g. W5 V) d% w
; W' K; M6 A/ F
       //UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);3 h' V  j+ G5 P6 x) A
    }1 E7 w& L3 N/ D& B

0 [3 H9 h+ @* n1 p9 {. `! e) Q    /*检查UPP传输的数据是否正确 (loopback modes only)*/
4 n. }) l7 p6 {. B& E0 I    //UARTprintf( "i=%d\n",i);. o1 l+ u" B1 p4 P+ _! P, `
    //UARTprintf( "j=%d\n",j);
( n) {* c: F9 a# e9 Z' N    UARTPuts("Data mismatch in buffers.\n",-2);
- S' B" x* Z  t) }$ l' [    if (upp_interrupt_count == 2 && upp_error_count == 0)
7 f/ r, G$ a+ _0 b    {
9 F7 f! L* G9 |: R        for (i = 0; i<upp_frame_size; i++)& H# J0 \; c* u
        {: B0 K2 x4 z5 C% V8 Y* l6 L
            if (upp_buffer_a != upp_buffer_b): G* j9 x6 M' D  l. z" Q
            {
4 {5 I0 ~% o" F, v6 @, }                upp_error_count++;3 @5 G7 p4 Y& k+ c; s
            }6 m! z" _, O# {& K: d) a7 l  z% G
        }/ D  e+ z, c+ K
    }
/ o+ e+ S* H: s- }2 Q' }$ @1 s+ h0 M: M$ a2 {; g0 s( O) E
    /* 报告通信结果*/
' w. @. d- }5 T1 D0 h( z& x    if(upp_error_count != 0), b3 K# c' i. Q: V1 Q0 ]& x3 j
        UARTprintf( "upp_error_count=%d\n",upp_error_count);/ H4 }5 Q8 V# d. G% J% r# M
    else
' z3 Q! `2 d( X, G* c        UARTPuts("uPP transfers complete!\n",-2);
8 a) n4 n4 n% ?& G! e
& H4 M% U. C% q4 U( C) _0 T    UARTPuts("Do you want to print all the data?(y/n)   ",-2);
8 r8 e# p# Z6 E- Q6 \6 t3 {    UARTGets(ch,2);. q. W8 H+ w+ U
    UARTPuts("\n", -2);
# [7 X" T5 o  K' q% D* h
7 ]$ j4 k% a7 P3 A& `. \    if(ch[0] == 'y')' P) ~- V# N3 n7 ?4 E4 G2 ?
    {
' g5 N4 H. v8 j+ k" D        /*打印全部读到的数据*/4 w; U6 J7 _+ _. I' O
        for(i=0; i<upp_frame_size; ), t: f$ y* ~+ G  p0 C2 f
        {/ W$ T$ Q6 W" \. \8 n8 l$ J
            for(j=0; j<5; j++)' m. ?& b( t) }$ V$ N  X6 m
            {
4 Q, Q3 m! g) \% m) P9 d5 T                UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a);
* C% n& |. I3 |& n5 f$ v: I( s                i++;
0 l( V$ F" |2 [4 {                //if(i >= 4096)8 _0 ~$ \+ C9 V$ W
                //    break;$ o1 q( _& B+ @" N- J& k

- m. v+ _8 J1 Z& @8 g  o8 `            }
* C$ y5 Y3 @0 a9 O            UARTPuts("\n",-2);
5 K/ g6 r* I# F* D; U        }) c' L$ F7 b, |& r
    }
9 A8 Q9 m8 V3 {9 x: h, I; O( U
% a+ Y' f5 A. I) `}

$ b) B8 N6 f$ @

1 }9 _+ x. X) P6 f4 Z8 J! `9 O3 A" v' X) M- a3 F: o

作者: tulipyyf    时间: 2014-12-22 16:08
追加说明:任务是空闲任务,因此没有做循环。
8 Q4 K+ G0 I' o' Z7 @
作者: Lewis    时间: 2014-12-24 18:06
多次执行是没问题的,最好不要用空闲任务,优先级太低。7 C; R( i- f) N3 u4 w- ]5 [





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