|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 0 R4 g$ s8 k) o% f$ C
! e1 |+ L6 F) u. z) y! m9 Y1 }* X问题描述:
! g7 f$ S* B: x在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:0 D! o* E G/ V+ |8 y5 {
^; I6 x X8 g4 c图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。6 Y" B Z( c* n4 G9 L
" _% _3 _. m9 y0 A- c测试结果如下:' d" b4 ?9 U4 J+ f+ W5 t$ P
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?) E3 x% }4 r3 M( ~, k2 z% I
- ?7 Q( W/ N, p' f, b
" b+ L5 d: u6 Z/ k; B+ s3 O, |
备注:, w: m; U0 G( q0 l
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
" k1 H# X9 f4 f5 E( E) L2、相关代码如下:
3 x! G- ?) t# a( \* {//UPP DMA缓冲大小512字节
2 P. d4 {2 E, O) e9 R$ E$ ^8 I3 E#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍, i9 z+ {9 V2 V% \& v
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
6 r* M6 V6 e+ t& Z! s#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
( A# d4 m6 ]7 l# g5 c
& p P5 w# Q/ Y* U. p7 S( R; e* H, B* \9 D. o( Q9 ^; z
//upp接收、发送buffer; t; N$ T5 ^5 h, p
#pragma DATA_ALIGN(upp_buffer_a, 8)0 I y5 Q5 y* a
#pragma DATA_ALIGN(upp_buffer_b, 8)
* }3 X9 T- ]7 A& H; p4 a0 Z, f9 l- S$ L: ^& w! w
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];% \7 J; P. N/ `# H9 w. V
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];* `9 W/ J. I" A. A% t9 v% U$ G/ y
0 F2 V+ c3 {/ U. X& U; P. N; n
+ j. |1 ~% |2 N6 P @
static bool server_upp_data_recv(Server *server) $ a8 v% q. t2 |9 p& d
{4 B5 r9 z, y: @$ \$ J/ V7 z
if(server->upp_channel_a_recv == false) {- Y$ n# j2 n# G* q$ p
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
6 J& Q7 y+ @5 t, S4 e if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
4 v j% d. K( ]1 E- A' }6 j: @ server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");# {2 A2 a$ S1 T4 X
T* l6 _# e1 Y# q
, Q7 H$ a9 ~9 L
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
& l) c% h0 Y9 U; P \ C, q7 T* g# s! y0 g( I# T) @+ O
server->upp_channel_a_recv = true;//
( p% h" b) B4 a0 Y3 O server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);/ q5 M) g9 f8 g3 |3 M' J
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;# t) y$ d: X" ?! L3 y
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
( P# Y0 D+ N1 P8 f server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
! y* {1 H- f0 Q% G2 f# y% l$ ^) P! b! n3 g
upp_error_count = 0;
' T( ~3 }7 x: U" x upp_dmai_int_cut = 0;
5 e0 O, i- e) `% {6 d2 r6 T+ v
9 Z, R5 Q7 z- b/ L6 J: F3 @ // fill in data 2 B7 ?# z6 ~1 _! U
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);- ^- h* S" R3 S) X- n/ ]" |' x! L
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");0 h" k5 R. K7 x. K
}
3 X0 k. s# F, V/ e# J }( {7 ~' A: x$ a- \1 S1 H
else{$ _' B0 A# N8 m: b( q
if (upp_dmai_int_cut > 0){
; p8 A% {/ j( ^- @$ ?* F6 n ~$ E DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
) \( m% U2 N3 k s; T* O$ j Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
6 l2 f" g" W; V2 s( C
" g: l8 f3 K+ B% `" M' k4 I
, ]7 ?7 I7 ]8 ~ //copy data to upp_recv_list_busy
0 s* \- T# N8 I$ u memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
8 S& R! H0 T# W' u" J7 K$ G$ z! X% ^' v' [
//
, K1 I7 R$ U+ n ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);) ?+ B( {8 k S! Y J+ g+ N' n# N" L
" Q8 e, o5 J* w" w( n$ }
// W+ R6 f7 g3 e- W
server->upp_channel_a_recv = false;//$ l" ^0 b5 t j6 H2 @
1 P/ k' {: e7 z* P
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
+ \- V9 O1 a# k( j. R) s3 X }4 _3 d9 k* `+ c- k
}
& j6 b1 {% r, @( X0 V7 a7 c- e( w4 V6 C
* r: ]1 {: V( ?6 z z return true;
! w' e: ~- ?2 y# ~9 G$ B& R, U}- J4 {; r. \3 y G" S
, k9 I# o* L7 _# ~
static bool server_upp_data_send(Server *server)2 m3 \( Z2 D6 R& E9 F
{: i R2 f% j3 p
if(ListMP_empty(server->upp_send_list_busy) == FALSE){+ H% L- Z* t# `. s1 o# {# C
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
1 ?2 Z, b$ d* b unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
/ c8 W% O! q" S char tmp[128] ={0};
1 \' F$ P c9 p# ~6 Z: R$ h2 ?- l
4 i+ m# P: V$ j" E server_msg_send(server, APP_CMD_LOG, "upp send: start");
. T6 O; n; h# }% p& K E2 e/ G6 g print_log(server, data, 64);# O3 X" w0 ^+ W
$ |; ^: |& e/ B( e5 q1 i0 x //
! b% {, t4 M2 m( W& R7 A5 W8 W3 \ memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);" H! B# l, e* s# e+ ~3 B) T/ q
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
2 O( M1 L; q1 @ print_log(server, upp_buffer_b, 64);' h& J, y' q2 ~0 L" e
, D% `2 _% L2 {& s' N
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
' {3 z4 u9 f8 p B y8 ` server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
- g; _" I2 w) J7 T0 c7 M1 ^+ l0 a' v server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
B, R. U: Y% W. z9 ]/ W5 L server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
1 ^( b4 ?3 c1 q+ `# C# r
# U/ J- q, U0 R/ f9 Z+ ` memset(tmp, 0, sizeof(tmp));
# V6 X* Y7 {) s9 |' f sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", + y h$ O9 a0 K3 \2 r* w/ r
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
( l5 j$ B0 ]& [6 ] s server_msg_send(server, APP_CMD_LOG, tmp);
% P a7 l7 U7 Q6 @. p8 v0 {+ H
9 S& K+ b* ]2 q0 h: @6 d+ b upp_error_count = 0;& H" H* t2 _; _" T$ o& f+ I% g
upp_dmaq_int_cut = 0;
; @% r) D5 _- W B0 s, U // fill in data
! B( q$ K: N/ y# K uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
8 D+ w0 E5 m. {! ^4 Y- @/ U server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
: w$ j, V; W: |. r7 W
, a8 t: G5 ?- _6 N# u: r+ K5 N // wait send success3 i% e4 |4 i- g
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
/ _ T' W5 u4 f" r7 g3 s1 g" @& F( Y7 A$ P: _! w0 X
// make data node in free list
/ }3 T4 |/ m6 I0 N5 g1 t' v8 l ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);% X8 E+ y+ R: E+ o
server_msg_send(server, APP_CMD_LOG, "upp send: success");$ ]5 O' u4 z2 Q. K z
}$ Y# {% X% P, z. M! c
return true;
0 Q: Y7 J# ~( y6 I" _}
- q' H) ]8 i0 O0 D @: f0 i9 [, a1 a4 F; u6 x9 r
5 b/ U0 l) q9 e! ~+ i
/ @% _* W) c' _6 J( c, v
# {& m! z, G( {9 P4 N3 Y
! M0 f# A; C2 W- T |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|