|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ( [+ o" Y) J7 R ?# T$ z! a
1 Y5 \+ e, C$ J' S! \ x问题描述:- E( \5 Q( x) p+ }8 X* Y
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
% I4 p, k: O4 K6 R5 N T v" X
- c! q7 i3 M; E2 m图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
1 Q- X0 F) @, k% {: N7 ?7 t! s: B# a, `- s; [! `
测试结果如下:, ?/ ?# a9 R4 D7 T
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
, t, d" ^- ^! u6 N% M7 v7 V* h; j: i7 ~, i D
4 ^2 n9 Z! Y8 q1 ^+ |6 U+ u9 N% X备注:. C0 X$ P+ U4 a0 E
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
1 P* z- U! P5 y2 h1 K2、相关代码如下:- d0 R& l& O! X' ^4 J( L0 X$ F
//UPP DMA缓冲大小512字节0 C. N2 C3 c% h- p }7 @8 C
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍/ R O A+ z9 o, Y8 q5 D) _+ u) f
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
% e! l7 s8 M# G0 o& q' {#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
' m0 a& [; U/ c2 r, N2 x% L! U7 k$ [6 {. E* b
0 L0 u+ K7 `, _4 B2 i
//upp接收、发送buffer, d& o, t* D! Z, [ ?
#pragma DATA_ALIGN(upp_buffer_a, 8)( Z% T- x g- n' X
#pragma DATA_ALIGN(upp_buffer_b, 8)
8 V0 J- t# f0 M4 H, P
2 K: Q4 I! g" H9 \ B$ m! i1 tunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
8 Y6 s- N0 |: N: f9 h3 R* junsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
* E0 o. x2 m7 _% A5 S1 @
" F4 m& u6 }2 y1 v
5 ^! ~- ^0 V" ostatic bool server_upp_data_recv(Server *server)
1 X; v- b5 q; a+ ^, |. y{+ q9 p/ w9 K" f+ p
if(server->upp_channel_a_recv == false) {
) r0 S$ C- _+ i" R; @* L server_msg_send(server, APP_CMD_LOG, "upp recv: start");
! [3 |/ a( N, a+ S6 ~% V if(ListMP_empty(server->upp_recv_list_free) == FALSE) {% g8 I- r3 E. c' \4 i. U, m5 p
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");* p5 a$ C) ?8 G5 R
' H" R" B/ F$ n
8 N! L ]# |1 x$ ~- a0 A* {. r memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);4 Z2 i$ A1 ?( I: m" x
) E; A6 F: {" {. A/ V1 A server->upp_channel_a_recv = true;//
3 Y! w5 O( c' @' Y3 ]9 F; r server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
# b4 _* |7 o0 \3 G% `5 d: Y server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
9 s0 K# X4 t6 ~; F7 @, o4 |$ y8 R server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;3 q, Q2 B5 t0 T! F
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
8 p: C) ~2 M7 W8 |
7 r/ O& m$ t& o2 ~8 q9 K upp_error_count = 0;
5 E7 P4 x8 l T upp_dmai_int_cut = 0;
+ R8 `2 [0 E c, k) [( O% I- g! L. k# T! ^
// fill in data 2 }8 s9 N% j. j* x& }7 b# |* U
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
0 n; F- C/ v% q, c server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");/ V7 N$ R7 I, n: o W, i, Q( V
}
& b5 Z1 f2 E6 N' p }$ H: b) a% ?9 H7 L( x ~ n
else{
Y c6 X3 O3 r7 v/ p; D5 y$ ] if (upp_dmai_int_cut > 0){; B4 L$ E% G/ o9 R7 e/ T3 r
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);0 Z5 y V4 G: |& A! X( {5 W. g( d) Y
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);0 o7 W* n4 G" f: o% |( V' B
' y6 Y( k: z3 i2 ]! s! ]+ A* U
, O" K5 x- |6 M$ R0 ]" h+ r //copy data to upp_recv_list_busy, {5 I5 L: D e
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);7 ]' |+ b: M, Z! K+ ]* `$ C
; \3 r1 F& M! A$ x0 J //! X% n) g7 L0 c- {3 U! |
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
! g# ?/ M, p- l. R: R8 X
+ d& N z4 w1 |4 L0 u" a4 P: ^ //; k4 J5 |" o6 A6 {; h
server->upp_channel_a_recv = false;//7 x l/ `! u, O" a& d; V# `" n
* A7 U" ~$ A- c5 s
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
2 Y, n" J. z/ ]% N }0 a& n* Y# \5 k, }0 c! [* a8 @2 j
}# O3 D6 e$ g j) R7 m! A0 s' h
" {$ g; N- ^8 @) O: x
6 Z7 T7 |2 L! S0 I2 N return true;
% H6 P, ~7 O( u% O. w2 g}$ |) \5 I) |9 d1 ~# s% A! ^" r9 U
/ i: F+ \2 [! g0 O" S
static bool server_upp_data_send(Server *server)0 l: ]$ \1 ?! }4 j
{
7 A! v" p7 U0 W: c+ H! @# O, N1 ` if(ListMP_empty(server->upp_send_list_busy) == FALSE){/ c/ Y% ^ u- L" G
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
( C: ~4 W( T% x5 g% B0 a* R8 T unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
5 \- c" x8 o* }* G% t char tmp[128] ={0};
- K$ h$ R4 ]- S; A4 \! U+ W% c; P2 V- q k5 A
server_msg_send(server, APP_CMD_LOG, "upp send: start");' O p9 B3 b; L1 a2 L
print_log(server, data, 64);
) ]( J; u1 i! z+ Y( U3 s
) p- Q; {% _! Z6 g O$ R% Y0 D //4 [( a+ e! n4 E% L9 u3 L
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);3 H9 H$ N* J# ], a
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);! s- T/ H1 G6 e
print_log(server, upp_buffer_b, 64);
9 g' _: e) d0 u6 b% q
. @! s y. c! ]4 {" G server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);: G; x( M6 J1 i: e6 Z( C6 s+ X
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
! d/ s+ ~ x ]8 S" J server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
8 w2 W1 b7 }, D; J* C server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;$ Y+ N2 `7 c% ~" f9 a! L7 j
, r9 S0 B7 H$ W% ^3 h0 \
memset(tmp, 0, sizeof(tmp));
s2 _: _: [8 F } sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
! g d$ }6 {7 `7 b+ @( | sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);/ M1 ` {% s% _
server_msg_send(server, APP_CMD_LOG, tmp);
5 U0 d# m+ ^& x( o
+ V( `9 P6 A! ~8 t- ?: V upp_error_count = 0;) m& z; p$ {+ |, d3 s! Y
upp_dmaq_int_cut = 0;
& h7 x& K5 V, W8 T e9 j7 ^, o2 M // fill in data 0 h1 n7 q3 |( [ [5 |" r r
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
) b0 n9 ?' D, Y$ l& }" m server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");! [" E; {# q0 c% I
6 {4 h2 \ m, ~7 @* X
// wait send success" W! i6 I: q/ q( Q/ s
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); & C4 W3 i6 t& r/ ]
) g$ L8 [; b8 l- Z // make data node in free list 5 t2 D8 s* T4 `. I/ S
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
: q ~+ v/ a( A# z5 U: a server_msg_send(server, APP_CMD_LOG, "upp send: success");) [+ ~: [; X4 ^. G
}
0 t2 Z1 P; P" F1 E7 L! m2 J return true;7 ]$ r& j) k. U7 V# E- G' w
}
. D6 M. b* `- J# e8 ]8 \' B/ e
: \6 S6 J: T* X {! c
, a% y& t+ K6 b# E. Y: i$ \ H8 u: n* S( l
- h8 Q+ x$ H# B1 t" y9 K5 J# ~
; ^3 u& \9 N% n! v |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|