|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 & y, e" @7 M# r9 j T9 g8 t
$ e. x* o2 a8 Z9 S8 X问题描述:
6 B, d5 Z' U, t/ w8 f$ v0 ?在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
) k; {. W8 L% Z" H& `! {% j- w, N, F9 L( z% X# o" O+ f& z# d
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
* W& M. v' h- y t* A0 G8 w5 N) k
2 S% U m8 A6 b" l测试结果如下:5 ^ I: y1 }' ^
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
2 Z& s- N8 x' r- h" Q. m8 P
) y5 ]9 L: E$ U, a- v9 B1 j9 _( Z
备注:3 }; y3 ^2 `4 p r9 }
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
6 z% F/ e2 v2 k b3 Z2、相关代码如下:
% N( S& p6 j/ N5 c* H//UPP DMA缓冲大小512字节
% |5 v& K" ~! m' U#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
9 `8 c# T1 Z2 l#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
" ~# y) i4 \9 Q5 N2 j! T#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
, [8 \! b9 d5 g2 u- l
1 \6 d, }/ K! Y
: d# K B$ `& T//upp接收、发送buffer* ~. s+ h6 r7 h: R8 S" v$ g
#pragma DATA_ALIGN(upp_buffer_a, 8)/ {- [! x5 {, |3 h
#pragma DATA_ALIGN(upp_buffer_b, 8) `. P8 @$ K8 @9 o
8 L4 l4 G9 s: runsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];6 `' z- }. g+ j7 e; f
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
$ |& W1 J* J x2 x- J* i" R+ R$ H$ s9 R' \ a
; x% v, p/ B% I" y4 v$ fstatic bool server_upp_data_recv(Server *server)
# z1 J' n3 \1 k- @ R# `{" ]) m( c1 K1 R4 p
if(server->upp_channel_a_recv == false) {" [) ?4 \, q+ U# M& N) I6 C7 G
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
0 k T, W) _% b9 D- Q( R if(ListMP_empty(server->upp_recv_list_free) == FALSE) { q+ r2 a9 Z5 M; J6 X5 D
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
# B1 h3 v2 O: d3 R+ J& R( ? d- ]$ k! O4 o6 y# x4 L: p# O
( ~9 h4 t0 k' B7 d8 o
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE); ~: D4 c2 U2 n. ~
( g8 H9 D# ` W; _' w0 e
server->upp_channel_a_recv = true;//( n, R. _, D4 L3 ~5 g
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);; O4 q* q/ @$ i: B# ~
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;+ K) ~% A9 s( \: ~8 s
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;9 O4 |: I7 s9 i/ @$ U
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
0 V* |. D2 J) N) I& d4 J1 @$ X9 ]. G) z$ N
upp_error_count = 0;
7 ~: F1 e1 f& Y3 s$ } upp_dmai_int_cut = 0;
4 {% ~% h; M5 t9 c' V* T
4 r; r8 R( J4 Z% ~ // fill in data
7 j# e: e! V+ b" [6 ` uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);2 n, w0 J9 t1 R: t, [ f4 j) m
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");, U: {4 L* O& t4 q, U
}8 ~0 L2 E. D) |# A3 M9 d9 j
}9 T" J o5 n# t0 H& }
else{0 J3 F4 V) E! h- p# V
if (upp_dmai_int_cut > 0){! e2 S6 O7 v' e d. O# `
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
6 v; d& u% F2 P) S3 u3 X Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
+ o+ ^( j B6 |5 @* U( H; @5 ~; Q' s" h
`, h4 j# d- ?2 _/ s4 C- w
//copy data to upp_recv_list_busy
( g* ^: O5 E: f, }8 l memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
`0 ^3 W8 |* T/ S: E# }( K
! h, M6 l8 [. ]% r4 @1 [ //
" m/ _% G5 h3 Y! t! T! x1 L ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);9 w' e0 |9 n& L# ^1 e1 K
! a% t/ w+ T+ h& I2 p) g
//
4 {' V$ K, m+ c3 i server->upp_channel_a_recv = false;//
; o h. f8 N0 m& r. t
; p3 z9 R: \& @+ E server_msg_send(server, APP_CMD_LOG, "upp recv: success");& l& M5 a9 Z$ t
}; k9 I% [0 Z9 U* _! N
}+ Y$ E! I; Z% I W* P) N
, N: x4 d# X; [0 P" N
9 }$ a8 g3 m! Y2 H return true;
0 K/ d0 q7 B! i# V3 k& o; H}
% a2 K8 Y/ t* @/ x, ~! L4 q& |; ` x# R
static bool server_upp_data_send(Server *server)
# `& U* F& f6 }6 [{
. \; q" V h# c if(ListMP_empty(server->upp_send_list_busy) == FALSE){
! b1 b8 P: \+ I+ J" ~7 f7 {) b DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
3 U7 }7 w+ t+ C5 v unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
0 k! X- p6 H9 Z: P' m* E7 n char tmp[128] ={0};, I7 l7 r5 ?6 s3 |
& ~ t# o7 m8 ]1 r, o server_msg_send(server, APP_CMD_LOG, "upp send: start");
) {8 t4 @% b, z1 A print_log(server, data, 64);% J' m1 `2 r+ ^- S% R
/ q% j8 t; d: M8 q
//" N* ^) p4 y% e- t% h0 s( }
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
9 ` l& g) n9 @' v/ w memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);. w* g9 h! q% W
print_log(server, upp_buffer_b, 64);1 _# s- J4 N/ a# j
( F. ~7 F# ?. N A server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
# U5 ]. k0 Y& _. j* o. Q" Q server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; - i% |+ l# W* v3 G& E+ k
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;$ h2 m N/ j7 D1 x2 ?
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
5 n5 Y+ k J5 x4 Z- D- _
5 R% i& c. l* ?* c4 g2 p memset(tmp, 0, sizeof(tmp));
7 t8 `; M; G3 E9 h5 I& w* y sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
6 B( [ H- I2 t% l! ]' d sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);% L6 J& F1 ~; @
server_msg_send(server, APP_CMD_LOG, tmp);
1 g) `, _/ }( R6 }* J6 v @. h3 Z: w9 v
upp_error_count = 0;
' U+ }3 ?4 v- c$ O upp_dmaq_int_cut = 0;
5 G2 r- {- @" J8 A$ H. b: U4 |: | // fill in data 9 E6 r8 `5 F' s+ n& y- |
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 8 E8 x3 x# \# M
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");. W( \1 S% n7 G B( N
' ^1 N9 W' g/ j) ]! ]. O
// wait send success
8 t/ U# W/ g: e4 X9 k! [7 R4 o1 p while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
b& I8 E+ H" m% X# G* N$ V: }
5 o9 y# G4 r) B+ G: v# s6 N: V5 ^ // make data node in free list
& e7 y5 S! s7 |( `- P ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);5 H# Y* o$ S; {% T
server_msg_send(server, APP_CMD_LOG, "upp send: success");
- v3 h. d' c i+ g3 Y" X }: ?. C0 W0 m$ f7 y$ ^
return true;1 u4 i% ]8 H3 \
}9 N7 q `, r! n& B+ f4 O
; f' |$ j9 ]0 J* i4 v6 Y1 t# C6 A$ K: W# |4 o$ R
) D% a) `- t; m/ C/ f3 J
3 p4 `' B/ `; b+ h9 P7 G
1 l7 I- G) O1 X; @, ^3 R( ? |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|