嵌入式开发者社区

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

作者: tulipyyf    时间: 2014-12-22 14:35
标题: upp问题,在SYSBIOS下的应用问题
下面的任务,只能在第一次执行UPP时成功,后面的均不成功,请创龙工程师看看为什么?0 q" c& c; L" R/ G/ V1 M* i
Void UPP_TASK(Void)$ z2 g0 a( ~  A) ~1 u+ {! ~
{
" j/ q8 j* l. s; z" Y, E; c
; o, d" U2 K2 U8 S0 q    int i,j,k,target_int_count=2;% L4 s* n& a  [, s0 ]
    char ch[2];/ q- I; |- c9 K) [( }) C" c+ }4 y0 m
, ]8 i" Z4 W" W# }
' R" A6 u+ H( w  t( ]
. _, ^. N7 A& e! m' e
    upp_interrupt_count  = 0;
. Z% z  V0 k( c/ h/ e    upp_error_count = 0;- Q4 V. p- |3 u
' H' t2 g( @1 T5 G$ q9 q
    UARTPuts("\tResetting uPP buffers...\r\n",-2);& j3 B3 l1 t& R4 ]
    // Initialize data buffers1 |% B  f  j4 W0 x% m8 r) W
    for (i = 0; i < upp_frame_size; i++)' O: }# E5 L( `6 D
    {
+ L  w( F2 e8 a) t1 B) J" |- v       upp_buffer_b =i;4 D# v, p; \0 N+ K& O7 b( w
       upp_buffer_a = 0xDEAD;" s/ x5 w. @6 e" s% k
    }) y) |0 d# R; U; M* M$ U: s) m
# l7 Y) n( _, x& I
    //for(i=0;i<1024;i++)# _' G+ K' y9 P
    //    temp=0;9 f( L; U$ I+ g

1 A& v+ v" u: _    //UPPReset();* Q# C! ^' s; H0 h
    /*启动UPP DMA传输*/$ F" y* O/ w  p5 M
    UARTPuts("upp_prog_dma_i\n",-2);
5 f7 _5 o9 e: p) R5 E" s    upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;
0 G: C3 O; H2 A5 v) B  z    upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);# h/ {; y( y5 G9 b
    upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);
# ^, \0 u% p; J7 m# F
, V, U- S; N, U. D    UARTPuts("upp_prog_dma_i\n",-2);
8 c% a2 Y7 m$ W" c    upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;
! j% u6 |* i8 N# G) I+ q    upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
' z9 ~( L# A* T8 y% z; F( o    upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);8 y. _) v" I* J: f+ _+ `
  e- I7 y6 D  Z4 I# T; N. s- s
    /*等待UPP传输完毕*/- ]# G  j1 a6 t) i
    //i=0;
2 H0 S- }, h$ y" R    //j=0;/ Q" j3 d4 b5 z$ {/ W6 r
    while (upp_interrupt_count < target_int_count && upp_error_count == 0)
  z8 [) I/ s: `; u5 h. Z/ V    {
% M+ u. ]( ]# _9 h        /*  测试UPP传输的同时操作普通DDR数据0 B: m! z+ `0 D; |
        temp=i;
  ]( f% l. u$ y# t0 K+ P+ X6 \        i++;3 z, w" d- Q0 e' N+ {& U
        if(i==1024)! m2 L1 P8 A, }2 t" A* I
        {4 D3 y/ Y% E: g
            i=0;
* ~" O- M0 c+ h* _. `            j++;% {# \) ]( [  `1 i4 U
        }
, U9 K- w6 D+ `+ j" G% K, k        */$ T9 k6 n  S5 ~" X: r8 ~

8 W' n; f# g5 V0 g: P' ^( t" D       asm(" nop");
/ b# k# x" E7 I2 T! ~/ e& f5 A! f- I4 B8 ?
       //UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);* d" I& k0 j# x. Y  _6 b$ Y
    }
" {2 |% ^  J& P" }* w+ \
: }" q6 u/ m) B3 i7 F  G" |/ F3 h7 c/ m    /*检查UPP传输的数据是否正确 (loopback modes only)*/* R5 o% F. D" z2 x6 A
    //UARTprintf( "i=%d\n",i);
) z$ M. @2 ?9 s+ M6 b$ }3 c    //UARTprintf( "j=%d\n",j);% ^2 ]! M4 J& Y3 Y* Y
    UARTPuts("Data mismatch in buffers.\n",-2);1 h; p3 @) H+ u/ H( s4 U
    if (upp_interrupt_count == 2 && upp_error_count == 0)
% n4 p% l* k& ^/ A) R4 i% ?: G    {
9 ~8 U) G, u$ c' q+ R" U3 U  a5 n9 A        for (i = 0; i<upp_frame_size; i++)
% Z4 u4 Y. y& p/ ~" _        {
2 L6 R4 S0 |7 q+ m1 d' W" ~            if (upp_buffer_a != upp_buffer_b)- |7 B7 w3 v0 L- N: p2 s
            {
% X" ^  w. F  g5 I/ u& d                upp_error_count++;
& o4 [: h* [1 `+ X6 J            }7 S8 Q' Y& }6 b
        }
7 D8 q$ L, q' m( p/ O    }, l+ ^0 u# P! G2 x% J

6 Z+ O; z: x8 Q8 a! Z4 ?    /* 报告通信结果*/5 m8 F3 Y/ A! _0 Z
    if(upp_error_count != 0)
/ ~+ X/ {8 J, E4 d6 |- U1 b        UARTprintf( "upp_error_count=%d\n",upp_error_count);
: e8 j9 s( `5 y4 X& A! e: z6 m( p    else
) \; ?2 `# U. G& K! M        UARTPuts("uPP transfers complete!\n",-2);$ x! b" F' B' C( Q- B* ~
1 ?/ k. X# ~" ~+ C( n8 [
    UARTPuts("Do you want to print all the data?(y/n)   ",-2);7 f% v. [# [1 I% P
    UARTGets(ch,2);, L/ F  y/ _, X: i" B% Q
    UARTPuts("\n", -2);
5 u% `0 P3 L, r  Z" s0 x4 t; C- C# t) F1 P( z% j: x
    if(ch[0] == 'y')2 C8 I9 l* q% h
    {
% |* `- k1 r2 F: G3 r$ F, _/ T        /*打印全部读到的数据*/0 ~3 F$ q# E( o  p8 @2 Y
        for(i=0; i<upp_frame_size; )
/ p3 f* `( Y4 I2 I: ]        {8 v; O7 F8 }6 U$ s
            for(j=0; j<5; j++)9 y4 f1 c5 e- ]; B
            {
1 f9 A( {) ~/ `" e) o/ I6 w                UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a);
4 |0 L1 `& X" O/ p( Y, |2 ]                i++;( Z: N& m3 ^0 }: D3 D' v) n! m
                //if(i >= 4096)
! n' c' y  D: c8 A% ]                //    break;
1 |$ u# g0 z( T# ^
; b4 Q; O8 X- t            }
( m& ^, r  [- k: {            UARTPuts("\n",-2);/ V$ k% a0 r& @: X+ O* I
        }, o3 h, J; ^# {9 S/ R
    }
) I1 k6 @- Z# _4 Z& r! j+ W! i5 g2 I2 J- D/ q
}
- T  l' l) F9 ^: w2 [

; A8 N! x' C7 y( v7 \- v' O/ j! ~. C$ v  s6 t

作者: tulipyyf    时间: 2014-12-22 16:08
追加说明:任务是空闲任务,因此没有做循环。" x* K+ L( K: x% r" y3 v

作者: Lewis    时间: 2014-12-24 18:06
多次执行是没问题的,最好不要用空闲任务,优先级太低。
& F, ~; |% \) q  e: L( m4 Y4 ~/ R




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