|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
$ {! q7 A& e" i# p
- S. i% n2 l. Z9 O" \( X问题描述:
. a4 m a1 l2 ]在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:5 g b! |6 W2 x2 B& C" a& |* b
; z( v8 ~8 l6 q, n+ j
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
" `* ^2 o8 v; G" V6 }$ V2 d! F( m" z2 H7 v
测试结果如下:
7 Q2 l! w- T) I1 v# g7 E" L* `138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
) P- C0 S& \0 h3 Q! l8 |5 I2 b. y6 d) h9 E. k1 q
4 B x4 h) V6 e$ C备注:
% t! U( x# z. D0 O3 E+ Q, P1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
7 r6 ^0 n3 w. }5 K2、相关代码如下:
7 G# v! u5 Y3 ^; b1 x& O//UPP DMA缓冲大小512字节
# Z$ z% j% B" s/ E' b$ l' e4 y#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
! D; Y8 v( Y$ M* ^* g) ^% T( N#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
7 _0 \( X/ W, s3 c: y4 O#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)0 Z; ?+ a% b4 h# d
& i( W. s; V' V0 R# T& w/ j0 d
3 i# p" f: o6 f6 q4 l }4 ^2 z//upp接收、发送buffer7 z* o4 H" e ~5 N) u+ y2 D# L! ] k" A
#pragma DATA_ALIGN(upp_buffer_a, 8)
" \( M* ?6 C& [: `3 l9 t" B# h#pragma DATA_ALIGN(upp_buffer_b, 8)
2 M# }2 h" e* G2 B7 j) I( e5 w* m# t2 {* M j) m# v6 X- {
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];4 z: [4 \8 K. n2 B
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];' j. B' j, }. m" v2 R+ k& K
1 i9 X3 w* V/ D# V8 c. z u
6 F/ M I$ i3 M4 s8 Vstatic bool server_upp_data_recv(Server *server) & G' ^& E. M0 i( _0 D# f1 j
{1 {+ U+ C6 }7 R' k
if(server->upp_channel_a_recv == false) {
. b0 v) j) P7 E/ ?" Y; _ server_msg_send(server, APP_CMD_LOG, "upp recv: start");
; U; f+ d3 D b( ^& O8 }. \ if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
, A( X1 Z( |( U server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
6 P% w5 E- V6 ^( Y9 E) x. \ Z1 C8 _8 H; Q* I
9 N6 S4 t, a3 r9 Y
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);( a) L9 v6 U) g: A$ R& v: q
1 i* }8 z% Y) p0 F) g
server->upp_channel_a_recv = true;//
. Q* g# B( f. C* D) z* T/ @9 c server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);- \( K! V' a3 [9 A
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;) r! [4 e3 _1 @, F( f* {* E
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;( Z" T" ~9 q6 `& c
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
+ ?/ E) r5 n2 U" Q O( f9 a; [% r" Y6 O( s Q+ H
upp_error_count = 0;- Y4 {2 \3 j+ `2 X c
upp_dmai_int_cut = 0;
. M7 N8 ?) b! t
1 q, r c/ i q( }9 `. d/ @2 Q // fill in data ; m9 t1 e& A8 [
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
/ G( P& V( w& i2 Z; m server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
2 J3 W v* w; s: j }3 ?9 W7 u4 a3 N
}
7 A% e' H+ D0 f( T else{
+ g% i3 K( [2 K if (upp_dmai_int_cut > 0){( D+ A' e2 D4 ?
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
. v, ~: z6 o7 g2 M0 e Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
9 r$ b4 S @# S1 C9 w! V' Y$ R% g
/ E; R$ w+ w2 C; q2 H. [! M
: D; a" o+ V5 Z4 d //copy data to upp_recv_list_busy- ]5 b G+ j* r) I2 h& d; t
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
* B6 U0 d0 Y* X( E( w# b2 Q" o( c' V# n$ M) Z8 L- Y
//
3 F# F, t3 A, ?+ T! B ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);7 H7 b2 `* `4 b0 l8 P- B N3 d
. x0 b: p3 S2 ]1 g* D' b$ j; B
//
/ M6 W4 Z# n a7 Y5 Z server->upp_channel_a_recv = false;//
6 E8 [ l' J: p9 L- J) L* j5 ^) g
4 [1 J8 w( W( n2 A! H$ g: _ server_msg_send(server, APP_CMD_LOG, "upp recv: success");3 y6 k! o$ n+ o8 W4 n
}& T+ |1 S2 |3 o; V4 h
}
- [& c8 D% j' k) [/ }$ Y5 s, v. d* t/ h% N
; E' n4 v$ p; j& B
return true;; N8 w; }' g+ ~
}
# j& k* m" P5 J, ~* B& t, s- Q/ J1 b3 z' _0 }/ i6 F: {9 I
static bool server_upp_data_send(Server *server), P' e8 G7 V4 X' b4 o3 S
{
" S1 u8 j& L; Z# S7 A; @6 n) W3 V if(ListMP_empty(server->upp_send_list_busy) == FALSE){/ J5 v! h9 w0 B8 V
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);( J3 x/ n% L+ }$ a# c' [
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);. P& i D' F' c3 H" o/ ~1 l
char tmp[128] ={0};
r% F$ [) b& Q* ]4 f& H, n
' u+ v& J0 V0 z& v8 d% n% }) l; F server_msg_send(server, APP_CMD_LOG, "upp send: start");2 l0 X' n; Q3 p: o
print_log(server, data, 64);
! B0 q1 h1 r( ^8 E6 n
( l- U, X' O( H: J% I/ E' J //1 j- N! g0 ?9 h7 L3 w% l7 Q6 b
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
' Q) t# t) T& F" v0 ]1 {4 c) c& O0 P memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);9 V1 p2 u% w+ p, \. X! p) }
print_log(server, upp_buffer_b, 64);( t3 J/ G! R0 M
4 t" O( l |; Q" ]5 ]6 b
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
$ d; p1 r6 g: h: } server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
. v0 D% q; ^8 U* H8 L! X server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
, }' X( u* Y9 `9 S8 f" W server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
- a) W! y! D" o g, F8 g2 O- d J7 }5 ~8 l3 p0 @+ i
memset(tmp, 0, sizeof(tmp));
$ H# R) D) F! H: o& K sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
5 R* k, u" `7 u& ^4 ]; W sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
- L/ @, f5 p$ c( x server_msg_send(server, APP_CMD_LOG, tmp);9 V9 g1 S3 B/ F* e; M
. o1 I+ b: ^/ B! Z& a" O* C
upp_error_count = 0;
1 ?, y# h* p: U& z+ h! C) S upp_dmaq_int_cut = 0;, | \/ Q7 S1 P% n5 |' L
// fill in data e- u* V( l1 L6 Y1 p
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
! {) o! s. H+ ^! F server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
d" }" p' q1 P* M. H8 {( n% t) e6 F7 g. C+ n$ W0 O
// wait send success( c: @2 y, k! G2 M- u7 ?
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 0 E, f+ k4 s( {; `3 F4 M6 g. R+ C2 z2 K
+ G1 d/ X4 k( x* c9 V: l // make data node in free list
- p/ i9 a# L" U& ^$ Z! {" H ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
. K: E u0 j: ?: l/ Z$ p+ N0 U server_msg_send(server, APP_CMD_LOG, "upp send: success");
5 [: v) p# Q! \0 Y; { }
' g# ~. Q3 l* z! E& ] return true;9 O1 r' v# Y- f# `) ^
}
4 E+ e& d" R! Y$ s: s
5 l' D8 m) A1 t% Y; T% g, F! B2 {! v' n& |1 a: T
0 L8 Y F+ u! t7 ~4 R8 [; _( n( I6 W0 [
4 D7 o( x' f% f: i7 d2 A
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|