嵌入式开发者社区

标题: 138 Upp问题咨询 [打印本页]

作者: liangws    时间: 2017-4-11 14:43
标题: 138 Upp问题咨询
本帖最后由 liangws 于 2017-4-11 17:00 编辑   }/ G( n) A7 }2 ?3 M. m
4 G5 s' n& L6 x( w7 e7 K# T
问题描述:
+ I1 z6 o5 g  C$ B# e! v在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
+ o; v, z1 F8 r/ ~+ k! @9 ~[attach]2174[/attach]
4 n' c: w! I1 g6 V图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。2 [& Z% S3 a1 p7 ~, S0 t

* H! k: D  R2 H测试结果如下:! c9 ^* F- K( ]1 ?) C# F) [
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?' H  G* B1 T, n
2 P1 o* l+ I# j: w

; U7 z9 ~& `! D! G/ {备注:
0 }1 K  A+ E& h4 {1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?3 ]6 q; ~6 J$ \& X0 F* {
2、相关代码如下:
' o7 @, y1 x" H# {# d5 t0 a, t3 T3 N//UPP DMA缓冲大小512字节6 A# j% `' l/ }5 h4 j+ ]) x
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
8 L9 w+ `8 M; y- Y#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
) u# X# y8 p! `+ I  u% h" y#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)* e$ W3 k& d% S' E' J

* _& N+ b6 r9 x' i$ W/ w& y- I( E  D$ f$ e$ T: {
//upp接收、发送buffer
. V3 d2 e/ \8 |6 D* _6 p& Z#pragma DATA_ALIGN(upp_buffer_a, 8)) n2 Z1 F1 z6 I' H$ Y
#pragma DATA_ALIGN(upp_buffer_b, 8)  p. V2 r- H+ S, @

5 k2 c5 k  j# R: p6 W. W' |unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
) \# p7 k9 a  }4 Vunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];4 B+ `6 S! y3 K' {, `
/ V4 V/ I* ~# T0 I3 }0 A
  M( ?" C6 M! \6 ^8 O: o" Z6 m
static bool server_upp_data_recv(Server *server)
! U4 N: s/ D& [! ^{: i" _- K0 {' F0 |1 z+ ~* Y3 A2 x
    if(server->upp_channel_a_recv == false) {
+ U' _$ l. i9 h4 D; U! C        server_msg_send(server, APP_CMD_LOG, "upp recv: start");( [$ ?+ W: |( f- A4 z6 }" d  K
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {3 a$ N) b# g; w3 \1 r
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");" }- s9 T. p) E/ Y4 T5 A4 ?9 k

3 b% ?" j" L' |& s/ ?3 d. s/ K( U! }3 b7 v, m$ y
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);, E1 n* F3 w2 n5 B9 ]0 \" E. J
, @0 m# [6 I( |
            server->upp_channel_a_recv = true;//1 L  D, w) V9 x! [1 ]3 [! D% e
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
/ E% K) i$ C# c+ w" b; o5 O            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;# ^6 s5 x; J  o7 Q# |
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;' \) {% q5 B) [) U
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//! a2 ?) @) K5 `9 H  ]- E- E

- b# m, a7 z% W1 t9 I  ^( K            upp_error_count = 0;' [' d8 }6 |  u
            upp_dmai_int_cut = 0;3 Z% p; y* L# s: d# v  _& C/ {
& `3 _3 Q* ^1 b; l2 O' Z9 s- C
            // fill in data 7 f3 Q& k+ Q: s, D: W. e- [- Y
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);5 \2 u5 k$ g* [6 z3 S9 [
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");7 D* }9 L, E' S1 j9 c
        }
6 O2 n2 p7 i. G/ O    }" u' u- w- K1 ^
    else{
% w2 w% e! y' _% I$ C( T9 F        if (upp_dmai_int_cut > 0){) Q$ A; @: @2 H. o1 U7 C) b
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
3 R" O" d" z% g- b1 q3 t" j            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);! y9 P) j' X0 d; N! K# O. t2 V0 s

' p' D* K. j9 }9 J. \1 c( H5 g% ?5 |1 X2 R
            //copy data to upp_recv_list_busy4 J1 x8 X3 `. \) \1 L! Y
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
5 `2 c5 ^/ N5 n
3 T( q3 w  K  h6 o. e- M! _            //
# [' o5 T1 Z4 z& z; [+ N: E  d            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);" i0 a: M! ?5 t0 p9 _
# Y2 d8 p6 c3 Z, Y8 I
            //
$ w; J- E' Q% p1 q* _0 |            server->upp_channel_a_recv = false;//' h* |" N/ ]& Z( Q
1 Z& ^8 e: \; p  M& ]( r% ^- p
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");" D( a  u( D- }: c' ]
        }  Z) l) _8 a# J7 N
    }+ [1 `3 e9 v: n& k) }, r# `9 [9 E3 Q
2 k1 V# \$ _5 a# U) }6 W6 w

2 m9 ~2 H. Q, B' M    return true;; W) w5 {/ |+ s$ n/ b
}7 Z2 J! z6 z% N

- X1 x$ t+ T( [7 Fstatic bool server_upp_data_send(Server *server)  W1 ]. {5 L& c( o: G( [
{; a! ^- r% z% p7 y9 F
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){# w! j7 F+ @; K! \
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
$ R; z" z& O8 o0 ~        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);3 d: r8 }: x3 t. L
        char tmp[128] ={0};
+ x& ]' L8 R. w9 e: q" k
3 M& F* |) r( Z5 F3 Z# d6 n4 o+ o        server_msg_send(server, APP_CMD_LOG, "upp send: start");3 w( z: m2 h5 z
        print_log(server, data, 64);
. g* G: \2 A/ ]! }3 i) u; N- x9 c# t( ?, x
        //
4 T7 z+ u# T+ J! t        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);7 d" C4 H/ N: @4 y6 i
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
/ g2 }3 N5 f/ @0 V3 L% F( l        print_log(server, upp_buffer_b, 64);% C* t5 U8 Z" ?( Y

+ U- M  I% O7 u2 l: S) L        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
2 e" K8 J2 [$ ^        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; & t7 F$ l, }$ v- C, C: [; i0 k/ o
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
0 \9 J* A* [/ y" {0 S" n        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
1 d% w: A0 g% P1 C
; o5 b1 A" X0 w3 }        memset(tmp, 0, sizeof(tmp));: {) h" e- Y* c- C/ t2 e- R
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", % E5 V6 U! K7 o! T; F9 ^$ s
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);4 D( r; b. n" U# x3 W& [
        server_msg_send(server, APP_CMD_LOG, tmp);
7 p# `; `9 \3 m# o. M2 L0 t/ V9 z. U7 g+ b9 L& f0 D; Q
        upp_error_count = 0;6 ^( k* B7 S5 n
        upp_dmaq_int_cut = 0;
7 p; @6 a; V# T/ k& J: a5 ^        // fill in data 0 _) }- C# _" [' C
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ! E% K2 S0 A9 ^& I- o/ n  r8 \
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");. S6 U( ]2 C9 q

: K  L5 b0 \; A        // wait send success. n& t& [/ B5 f$ [1 F
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 3 X1 y9 G4 a  A* C
' F  Q7 t  b9 d7 W+ L
        // make data node in free list
+ H% {. C6 U' Y" p6 q7 R+ |. U        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
) j( v5 X: l6 Y5 o* `        server_msg_send(server, APP_CMD_LOG, "upp send: success");
/ n9 W+ U1 G) p8 c    }3 s# f6 q3 B% ~) S9 e
    return true;
  D. S- f& z# ]% U# l}- H6 A1 t5 n2 t/ Z# z
0 _" c+ L+ f2 H0 k

4 \, A& d& y2 G1 N; H' M, u; X( `
; {0 `, S* q, k0 Y
4 O1 g9 }; d! u. U1 K# o9 f- D

2 `. z! ]: E- F" {. O1 Y; F
作者: human    时间: 2017-4-11 22:03
需要边界对齐3 K  L' Q8 n! C0 L2 a% A5 b
[attach]2175[/attach]' j, ]5 |% D+ ?: o/ T





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