|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
/ p0 t) N; g+ A6 J- k' y
+ I7 P8 F7 S; T2 {$ X问题描述:
0 {2 p0 Y$ A3 R# P在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
9 m0 x' O& y& s9 k9 Y+ z* E! d/ x7 a" P3 l
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
* C6 Q y4 q8 I9 c: v. |$ @4 N! E2 n! ^! Z+ R
测试结果如下:
+ [0 I- n% X6 r8 i& q* ]. q138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?' t; J* i% [) i+ P4 s0 [3 R
! V" f$ N1 e1 o) X
/ c! u, L; O8 ]- J2 [& v备注:
! h0 \* S" n; \- n" k1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
+ s) i% b" H- A: _, S& h2、相关代码如下:0 V: a5 G2 B- f& C3 ^
//UPP DMA缓冲大小512字节
9 u; X4 F' O' A8 R0 Q+ C; V; ?- |2 k#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍/ D8 z1 S' R+ [. |, N. d; w
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT* N6 }4 g4 U( f
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
( G6 u& P* K5 p
8 c: n; a! K0 r2 q" A" c% e# F" U/ l/ i9 }: Z
//upp接收、发送buffer; M/ ] s# |+ y$ E5 m8 k. O
#pragma DATA_ALIGN(upp_buffer_a, 8)/ D3 M9 r/ t, u. s$ n) B2 L0 n
#pragma DATA_ALIGN(upp_buffer_b, 8)) v& }6 ?2 b" D. m8 h6 m8 ^3 k
0 U: z- u+ p) d' M
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
- x. b$ v" p0 \0 }6 i# aunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
3 I3 h! y1 z. @$ M/ v6 |
9 W6 O5 O, f, \8 U3 S' ~2 x7 q7 r, l$ U& C& y3 R: i* _% J. w
static bool server_upp_data_recv(Server *server) * P$ P) C/ \2 @. u
{& ~ R; R5 f# Q, `, |
if(server->upp_channel_a_recv == false) {
7 u* k* {" r, [; y* y; ~ server_msg_send(server, APP_CMD_LOG, "upp recv: start"); b* g6 o B2 C
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {" j& |; X) t0 P# ^0 x$ z j
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");, V/ q5 {: \& F
0 o& J) g7 F" a
q$ g; `! b5 w memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
" c$ N' Y" e) p ?0 C& G& l' a1 Z
server->upp_channel_a_recv = true;//8 [& B) Q9 b R. H; [0 @4 Q
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
6 O. k2 B/ B' n6 J( ^ server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;0 G6 R( C; X/ F! S
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
* c4 G' O# a4 ~& _7 ~ server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
2 F. M7 m9 d. ]2 D) q; w* \3 r' t, V( q5 C h* w
upp_error_count = 0;
! ?* B0 V* b1 v) Z/ i upp_dmai_int_cut = 0;: s) h$ g( O/ j
- k8 w* u2 D: K4 q" X/ j3 u // fill in data
) t1 e4 y" K% q5 ` uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);* a7 U7 V$ Q6 @" Y
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
2 ^# \3 A& z9 O- E. y' `3 o9 S }
1 W5 Y) l8 `8 E# D3 V6 J0 b1 K }
, Z* F; ?. H( t8 p else{6 j) }! Z" q% C/ O
if (upp_dmai_int_cut > 0){: }2 m P5 w/ e+ ~! u# i+ f& V* f" w
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
9 r/ Y4 M1 A' n6 R. W- {6 `+ f Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);' t5 D4 [$ b4 j
$ K/ }+ z: s* ?0 i2 [$ Q
1 ^3 K" k0 I K3 e7 W8 E1 {/ P //copy data to upp_recv_list_busy
! N3 ]1 R" d% v, L memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
' M& p- |$ B. l* w
( _1 U- ?* }; }* N+ R //
2 X9 Y/ |5 J7 P8 ]# A4 b- L ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);4 A4 |" p+ Z- [
8 Q- q# A: C& m) T
//
: a+ A4 w0 u! X: `# P. m% l& ^ server->upp_channel_a_recv = false;//, f+ {7 U1 y, T {
]2 l+ Y' m: M& c- A3 N3 | server_msg_send(server, APP_CMD_LOG, "upp recv: success");: C1 Y2 b5 k2 u( v: ~. _ O
}1 o4 j+ M' c7 P! ` \: o0 x
}
$ ]9 _; D( b A! U- q4 l
( O( x" C: I2 t8 G) q2 }% T6 e# Y+ T! h
return true;
0 O% ?- i2 K7 y5 ]}" t* C M2 b$ v- b' k
5 @5 i2 e8 w) V: X) `4 c6 P9 W
static bool server_upp_data_send(Server *server)" m4 o: Z" z7 y7 A' Z. `
{) k7 i* p9 o* K; E4 _
if(ListMP_empty(server->upp_send_list_busy) == FALSE){0 z. F2 g0 X- i
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
! f% O1 c5 Q$ }" ] unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
$ C" [/ @1 L/ }1 N# Z1 a char tmp[128] ={0};- D% q0 w; X3 M2 B( H
4 S1 p' Y: l9 A/ T& ?
server_msg_send(server, APP_CMD_LOG, "upp send: start");
% l1 q! ?, u4 j% v1 |9 L print_log(server, data, 64);: v* H* h: J+ N9 z1 l c! C
+ y" e, B: A7 h, _ n( v //5 {# ?" j' E: `, A1 F! g* B
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);- @: ^/ m! U8 g- j& \
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
0 k3 d* x% P) {% S! @; q$ B print_log(server, upp_buffer_b, 64);3 W6 A" ~/ Q9 N3 O8 B
4 S1 q& Q3 h, w( N0 T1 Z$ @ y server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
2 v5 T6 c) L- |! f) o$ F. I server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 0 C# e8 [' X7 D3 l9 E
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
2 Q( W! x' R5 @; a server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;) D4 H0 m# s9 d
3 ]2 Z, J0 V! z* A3 Q
memset(tmp, 0, sizeof(tmp));
' d2 b: U* y& `5 m$ f sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
6 v4 q+ Z$ s* Y0 t$ @ N3 o0 q! _. |' i sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
7 p/ _4 F: c( o7 H. [+ |+ u+ m6 M server_msg_send(server, APP_CMD_LOG, tmp);
# \3 W1 ?- O6 F; W( p! r( u+ u& y0 g8 G* h* N: Z9 C& y k8 E
upp_error_count = 0;& c1 l/ W |, t# T' a
upp_dmaq_int_cut = 0;( t+ {3 h' ]+ T. @$ D9 R/ b% I
// fill in data
! [3 ]* D! T; M- f5 L) G uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); * U$ h; e$ [3 O; i* u @6 T" v
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");+ Z% F+ f B9 ], T
+ k! o! t4 o& |: y0 K3 F' l+ `* p
// wait send success
S6 R3 K$ W. O: G# t; f1 J8 c% p while (upp_dmaq_int_cut < 1 && upp_error_count == 0); , n' Q/ j9 p- H' J% C0 N
O. x* r0 M. t9 L // make data node in free list / d j& P4 ^/ g
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
4 ~" T9 r a4 }7 V" `% x! |+ Q, e server_msg_send(server, APP_CMD_LOG, "upp send: success");% m8 L8 O+ o$ }7 v$ X& z; @
}
8 D# D9 m+ p, @" i {" E- P return true;
' z! A! ?. A4 W% W0 a}: {" \* ]) @# \# k
5 N7 [ B& w/ e# @3 W" M
2 O6 Z8 [- Q0 r! m& l% }
( {$ [" Q8 ~/ u2 r8 X7 q8 L1 J, z' F# m' e/ R
: Z- S, ^+ x4 f1 `* Y% d7 K
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|