嵌入式开发者社区

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

作者: tulipyyf    时间: 2014-12-22 14:35
标题: upp问题,在SYSBIOS下的应用问题
下面的任务,只能在第一次执行UPP时成功,后面的均不成功,请创龙工程师看看为什么?4 h& d; Y9 A! V+ R: }
Void UPP_TASK(Void)
/ ^4 Q+ ^1 s( V3 u' L5 ^{
6 n* {& X! x( @% H4 O
/ o; @. ?7 ]1 }0 b8 Y* h2 l    int i,j,k,target_int_count=2;
- G! k5 m& i# d  e4 e8 p8 p    char ch[2];
' g6 M4 P4 c% a* H( B$ @5 i, y/ g4 ?0 y' Q* K# X! l

$ b- P+ f# |/ Y; P& o3 K" o
" z  l9 J, t3 [% ?( }6 k    upp_interrupt_count  = 0;
6 c0 J2 [: q: R5 m% p1 i1 i% P4 Z    upp_error_count = 0;
: u' A  J+ B$ E! u4 z$ x! J; d+ @6 ~3 x4 }+ r
    UARTPuts("\tResetting uPP buffers...\r\n",-2);! ~) S! r( ]* T; n0 n4 f  V8 a
    // Initialize data buffers0 C! t4 X/ s4 L" F
    for (i = 0; i < upp_frame_size; i++)! {( J; e, N  L2 U: f9 L
    {
; v' {9 j% [) j       upp_buffer_b =i;
+ x3 ^' c/ S+ z  ^+ z7 o) n       upp_buffer_a = 0xDEAD;
! L; }# o% w- D# }8 y1 u2 g) e6 m    }5 G( V  B  y8 v: i; U
- ^0 O4 g  \9 X0 V
    //for(i=0;i<1024;i++). w2 F' ?9 O' S0 `* b
    //    temp=0;
% j; b' V8 L2 a6 H9 i# r0 G
# A# _0 l! {9 o7 [$ k6 m    //UPPReset();# g9 h9 I* B; ^& y! J
    /*启动UPP DMA传输*/1 H2 G6 k/ U1 \7 ]. }
    UARTPuts("upp_prog_dma_i\n",-2);
9 M0 C) F0 R. m! N# i    upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;7 @0 z3 O$ |3 G) a7 ?
    upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
; }: Q2 l  o5 @/ B% \& I6 U9 X    upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);
" M( @5 b2 T& S7 C4 N9 U
% B1 D5 [& O' {    UARTPuts("upp_prog_dma_i\n",-2);
4 a7 O" I1 L# N+ D. `$ n    upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;; x; c6 l5 A3 w( M0 a: S) {) |! P
    upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);
0 Y- r# Z6 K& Y. T7 D    upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);( l* U5 i2 Z9 A1 k

! z7 W: w7 c- y    /*等待UPP传输完毕*/
! j- n& V; v, ~: z( N; x  s0 `) Y- O    //i=0;$ S9 }, h0 a4 A  w
    //j=0;4 x- E. ?7 f2 ^5 `+ C, U
    while (upp_interrupt_count < target_int_count && upp_error_count == 0)  c# c. _1 S' }% A9 [* _; i4 B) v
    {
: p/ M& q" K. A0 ~        /*  测试UPP传输的同时操作普通DDR数据
1 y# W" x6 I$ n        temp=i;
7 w6 b  A) O) R4 _: E4 \. B, J        i++;5 w1 S' r- u% v. H. c; h6 U+ [
        if(i==1024)" Q9 A* n0 L7 h! d3 r
        {
" \2 L9 }* y9 F2 T6 {            i=0;4 |( A0 y# a# ]# M, R
            j++;
6 |; I; Y+ r' n! }        }8 U8 }6 a/ e0 o* J% W- l
        */
) ]$ L9 [5 y& W# X# `% b5 n* `( O
       asm(" nop");$ k$ X" {! s9 z; X- E  [
; s5 `! A0 V; f8 F/ {' K5 g
       //UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);
* y+ q5 d# L& @/ y# ~0 g3 e3 v" I    }
" B' o* G0 w4 A+ M( Q: o
& D/ y( M1 r+ ~7 J& Z4 X    /*检查UPP传输的数据是否正确 (loopback modes only)*/8 _# x5 B  a  i; H4 D( `
    //UARTprintf( "i=%d\n",i);
  v1 `3 g& y4 D. I: q* S    //UARTprintf( "j=%d\n",j);9 u# O/ J  {0 n
    UARTPuts("Data mismatch in buffers.\n",-2);! n# w: Z1 i& [
    if (upp_interrupt_count == 2 && upp_error_count == 0)
( n* _- v- P1 Q" X1 E    {' U! a3 ]& {( t
        for (i = 0; i<upp_frame_size; i++)
; x- w; B7 t8 `        {8 q+ U! U7 F" L" n( A, M+ B6 X3 V
            if (upp_buffer_a != upp_buffer_b)
5 z. @6 O2 L2 k            {
( r( f$ a3 L7 T, @3 C5 ^. C                upp_error_count++;
( A# r) R5 P: y, c" o; u" Y            }
. J, W; K# z0 ~8 z& J3 {        }
" I: j3 ]7 w/ q* J4 N' s0 H7 I+ D    }  E# j. A) j/ Z* t/ x

, V, x3 A, B! e    /* 报告通信结果*/. E4 M' y1 w+ f, S' C& O
    if(upp_error_count != 0)2 W6 i. R- t+ e- S$ b  {
        UARTprintf( "upp_error_count=%d\n",upp_error_count);0 n9 D% k$ ^. R: H$ ~
    else0 Y4 Z' b& w! I1 ]
        UARTPuts("uPP transfers complete!\n",-2);
6 O" j  Z! i+ t! v
, r" c6 P7 P6 C    UARTPuts("Do you want to print all the data?(y/n)   ",-2);9 N  B" p5 [4 ?# [
    UARTGets(ch,2);5 z" K; l: q6 s) l
    UARTPuts("\n", -2);
! S) P( I, T2 }
* s% `' B0 V$ o4 x( z    if(ch[0] == 'y'), O  x5 ~2 q8 r' A9 l/ i+ w
    {  X9 g" m+ X" l& W9 u. I3 Y# _
        /*打印全部读到的数据*/
7 B3 S4 V! M3 W; @9 b8 _2 Q- y4 u        for(i=0; i<upp_frame_size; )
7 l: t$ Z3 l+ I        {, `+ O" g: ^: U
            for(j=0; j<5; j++)
$ O  g) J% S' n            {
7 r9 K5 Q# I2 e0 r. x1 i                UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a);
* s8 H9 v# R! z                i++;
% J) U7 i/ Y  J: x) L0 ^                //if(i >= 4096)# [* g. S( [- h: Q+ ~% x" |; S6 s1 |; r
                //    break;
( K$ ?! X' a$ Z/ c- I8 P$ O1 U/ z7 O! N0 j0 `5 w
            }6 ?, m: E: t& R
            UARTPuts("\n",-2);2 j/ P5 a+ l' _9 u0 h
        }" \8 \/ f2 V! B7 [. Z: w+ m; x
    }; V/ M1 z, [) @: w0 }' B
$ m8 v- k3 v6 o6 z
}
0 |9 M, u2 u9 `0 w% Q# q# w
. ?5 o+ r( G# |  z6 a$ h1 C

7 H: e8 A4 _! l" J$ U
作者: tulipyyf    时间: 2014-12-22 16:08
追加说明:任务是空闲任务,因此没有做循环。
' l: X: s& F% T/ W
作者: Lewis    时间: 2014-12-24 18:06
多次执行是没问题的,最好不要用空闲任务,优先级太低。
; k4 F! d$ s" p- P




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