|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 & @% u3 w3 V0 B; t+ U: V
" ^; N1 D6 C0 h9 I问题描述:
( S, r* [) F z) W8 M8 ?# [! p在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:+ Y6 \0 L" g9 O+ i- e8 c3 X
+ h2 ~. d6 j7 c) R, \. f8 W
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。; ]$ x$ P+ T/ A+ l0 }. L9 }7 X
" O7 ^- Q; ^: @测试结果如下:' {6 J1 N! E, X! r0 j6 {2 I
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?) v$ P- ] ]& h# r7 ?# v: L% @
9 R; w" _' {( _" r' p: B5 N# P* d7 `; H7 B6 F& p
备注:
) r2 y6 f7 N- m; A. S1 ^! e1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?5 N4 S% D- J3 M% h9 A2 E$ y& U
2、相关代码如下:! U6 O# C: q5 q* m
//UPP DMA缓冲大小512字节
9 H. l7 q. K# ?#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍. S: B* q2 ^. C' L
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT1 v) E7 L+ S u7 ^
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)# c0 F% _, {9 c& Z; K$ v4 m# ^
; N1 n' c4 y) c* A
* B' p1 g/ A5 u9 L) N$ H4 {+ _/ Y8 Z$ x* p//upp接收、发送buffer
7 v8 G6 l! F) ]! e* s O. T#pragma DATA_ALIGN(upp_buffer_a, 8)3 p( |# k1 a4 D, B0 R
#pragma DATA_ALIGN(upp_buffer_b, 8)
" n2 A F n H* ^8 m
r B V/ @. @unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];( A7 J0 X) [3 Z
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];% A+ P4 F' D+ p0 W/ h2 `1 g
3 l: O$ ^" C9 {( e
+ T6 [& @$ M( L. p# W) d4 e! O
static bool server_upp_data_recv(Server *server) 0 G; [# P2 r( ]. ^ @
{
4 S, Y0 U; y2 b% s. X. Z$ H if(server->upp_channel_a_recv == false) {
2 {# v: k( Z. V# X2 w# L9 t1 C server_msg_send(server, APP_CMD_LOG, "upp recv: start");
" O5 y" j* f' g if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
" B6 h- S0 Z. d7 l) ]; l server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
$ {- F* f- T6 Q D* \' z& ^9 {( e6 [4 s. P0 `
4 i1 F7 Z0 U1 ]- [* G( p$ C, A
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);$ d; R' f2 g2 Y7 u0 u' o! |
2 d+ g6 m9 d" t
server->upp_channel_a_recv = true;//
( S( I; A! S: ]- I2 E$ _ server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
2 [ p: Y2 i. O. E" c server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;/ m' f, r1 b5 q- k( C
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;! x3 A3 z1 h5 P; w3 W
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
' f1 c- ?" ]6 w9 @; Y2 C! P4 s2 d
% _2 [* g5 X! E: C$ q upp_error_count = 0;
2 F3 Y# P5 [% E( a( m' A$ Y upp_dmai_int_cut = 0; Y+ ^- \2 G0 F+ l- f+ M5 ^
% V6 j8 y# o) b4 ^) Z3 J1 |
// fill in data
T, V7 A+ {. z. Y8 E) T! Y# J uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);( V/ h6 \. T. V9 i
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
) c" A, {9 r0 s) p* y6 Y }1 `5 V$ z; e( e3 b( v, \. ~' V) ?; K
}8 c8 Y5 P& K. z- ^+ P
else{
! T. v+ a* p0 e! R% L% q if (upp_dmai_int_cut > 0){) R1 {7 B3 J% b8 N7 }* H
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
2 p$ t0 Q5 S N) B% U Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
# d" F3 P! }1 L; p, ^% b$ H% g, L; Z2 c# I
' r% r" j1 [0 N1 [% [
//copy data to upp_recv_list_busy1 N8 j0 J! i+ }
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);" x! f) x; y n
" h! l& P! ~7 I, t/ j4 R q/ S7 h
//' d6 ~5 |" D! {; B
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);' D! @& L6 b2 l) N# ?
8 g" w" i4 n' w8 n2 r) K
//: d, m7 L$ e' w `- v
server->upp_channel_a_recv = false;//! P U4 U4 |+ h, S) t( ^
1 }' y% J! O' a7 K; _6 [9 o. i+ m server_msg_send(server, APP_CMD_LOG, "upp recv: success");
+ V- Z/ i: {9 _. b, E$ b2 ^ }
" M4 `! i, |4 Z P& z }
3 m' A8 {8 w$ W5 Q$ `3 l
! W4 _6 p% M( W& T1 ]; {; N9 V% L
! G! |3 U, j5 l9 t2 h return true;* L5 v; k5 h2 B
}* h2 E. ^! X* _- T
2 [3 j; {% {& ?1 r
static bool server_upp_data_send(Server *server)
- j v n9 f! i* V1 h' N* Q9 U{) Q- o7 [" J2 x* F/ s3 B+ k
if(ListMP_empty(server->upp_send_list_busy) == FALSE){+ V* K- t$ ~9 C6 N) @# b
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);. W$ d( D/ y% s2 ?
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);+ ^, ~/ W; J" q. v+ {
char tmp[128] ={0};
" X% _- L1 C8 ?9 q# N# q D9 d* H" F6 N6 X2 }
server_msg_send(server, APP_CMD_LOG, "upp send: start");
+ b% ]; i" E% w print_log(server, data, 64);
# Y4 H6 E( F, a0 w& B& w( b) p c6 E
//) }% x2 D8 G$ {$ f6 h% s9 c
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);6 y/ q9 L, F) f2 \
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);1 R; o$ g8 C4 K6 N3 o1 n1 m4 `% Q
print_log(server, upp_buffer_b, 64);4 l$ M6 A7 x( c, K* B/ R
, _, I9 u) ~: m$ H# X# | server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);+ W* q2 M9 n4 s; f% j6 y( r2 e
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
- p3 T2 u' j1 Z: A) O server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;# r0 u" ?# s. {
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;! B0 l# Y f( z0 V
w, a& i- y4 L7 c5 W: }8 [3 N
memset(tmp, 0, sizeof(tmp));
4 c v# k* ^: s9 ^* D0 l' a sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
, l% Z$ @3 K" l- d0 ` sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
7 }; \: u4 r' _' V8 P server_msg_send(server, APP_CMD_LOG, tmp); ~* x# v* K4 C9 {0 I
# E! I! N) l R+ ^9 C7 v, g9 R upp_error_count = 0;. P3 Q6 i0 ?$ h" P
upp_dmaq_int_cut = 0;0 W: p- G0 N$ x! O, e
// fill in data
' C, a1 v% \9 d9 w% @; e uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
, [/ z+ Y. e) z- K" D" ~8 Y3 H% }. M t server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");! `6 o r7 e; F0 E0 z
* I- R/ M9 J9 h u9 R# Q // wait send success# j7 J7 c8 q/ d7 x
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 6 v8 g& B; C7 i# i! R( t
- n+ m9 _$ M3 |0 ~ // make data node in free list ( |6 D6 O. W# d( h; w ?
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
7 T& r m* }6 B server_msg_send(server, APP_CMD_LOG, "upp send: success");' J% Y' F' G; @) t# s" i$ e( b# n
}
, W5 l' D) ^. A% K& c return true;
. X7 r b; v' Y% ]7 C" n}
3 d4 t5 ] a* K) e- G
8 E; \: ~; z) {& V( h, T" e/ n: ]4 A# V5 ~
5 e) c0 w T' t: y) |. `; V: ` J
6 J; Q) u* l4 l+ d& P; K+ p" N" ]/ c5 V( K( e; S7 K
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|