|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
% z/ ]5 t+ A7 G1 @3 J9 {9 x( \
" R+ W Y9 K$ v; x4 V+ x6 C问题描述:% G* B, Y n z- k+ Z, d. e, F7 [; O
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:; [$ W: i* s ?% ?' ^
8 h9 J: b9 [5 K+ r& X: ~$ l. U
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。6 C7 b: J, Y0 ]2 ~" x1 W
1 p% c' N- T+ Y& P- X测试结果如下:! g( T- t/ J4 k/ a
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?- i- w/ p8 }+ U5 g3 v' i
& j/ V7 r. H" N6 q5 v! g# Z& V, b$ t7 t) @9 w1 k
备注:
8 \4 T7 B4 _$ {+ K& B1 ^- e! O1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?( m8 T5 {- |& O1 J
2、相关代码如下:
0 u, v) X P' d//UPP DMA缓冲大小512字节+ r$ } s6 a! A. C
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
( g8 Q2 f7 t3 \. ]& H2 z#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT8 u+ m- d* N; K3 D W* ~
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)" n/ g1 r% t. ~: m0 }+ G9 N/ }
$ K. ~9 s* @# j
( q( |# F0 {* |( k' _
//upp接收、发送buffer, T3 `, f1 X/ D& F! @0 t
#pragma DATA_ALIGN(upp_buffer_a, 8)# X W3 x9 X$ s. k c
#pragma DATA_ALIGN(upp_buffer_b, 8)( y+ R6 W& r$ F+ ^" N( `, D
9 y' a( y* y" F3 f
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
4 |; Q9 V) W& m! d# y; [. C$ Zunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];1 P, @, R$ d; ]1 ~% F! u
* T2 T( q# R9 c: i& ]
# R) e/ ~' y4 ustatic bool server_upp_data_recv(Server *server) 1 w, T, ^5 { n# ^3 O) K
{: O: [; x5 q( t0 ^1 ^# G" U
if(server->upp_channel_a_recv == false) {
5 B( X, h! B' ]0 C4 u% U9 s% ] server_msg_send(server, APP_CMD_LOG, "upp recv: start");2 v. N& c8 F& f9 R& W
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
! I& L% b. G9 f/ e1 I server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
6 a) K6 r! X- X4 K& ]( ?) E) B' R2 E; e+ Q) D% Y% ?, I& |2 E" p
; K' o- y# _& m8 [2 K memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE); Z4 X4 X4 |/ c' s7 V) u3 l- E
0 M$ m9 c% @9 D5 O9 h7 J server->upp_channel_a_recv = true;//
0 P7 g4 d9 R( f1 z server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
5 R/ T& N+ T/ ] server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;3 d# |; {/ l; g1 I4 g$ x K
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
# \$ P+ r4 X( m6 O server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//+ U0 q7 k( J9 W
5 T% }/ I) A, |; K" x upp_error_count = 0; E: p7 t6 L8 C7 ]7 D1 z
upp_dmai_int_cut = 0;
: Q3 ^- B0 s% ^8 T0 Y' I- T& n' t
// fill in data
J c. v9 K) M; W5 S uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);7 a& i! U1 d1 D8 ~0 { S* Y" o
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");2 E7 P, T4 B% a
}3 ], ?& O1 K# b& @& v# R
}4 C9 a g8 z) m) v9 F; a' x- b; H
else{, Y& A" o, l: ]3 T" q
if (upp_dmai_int_cut > 0){
, g+ K/ C! X7 c1 _7 v+ ^ DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);+ \4 A" Z/ z+ }! C. Z
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer); P7 k9 _; X4 I, M
9 J6 }4 l' w, j. p/ M0 d( n2 A
4 E% U: s0 g3 ]: q: g
//copy data to upp_recv_list_busy
" ], U: U, T1 _ memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);& @6 G( O$ f! P/ F) q7 F% }
5 D) R3 ^3 U4 a3 o //
8 J- D5 _( j `$ X( ^ ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);: T H+ p3 r& r8 W- v0 C& G
4 O" @; Y8 t' ?! O' e% n+ D //3 C2 M v$ t' [. x
server->upp_channel_a_recv = false;//2 f; j/ H9 h6 j; M9 D- R
, i! F1 D) }7 \$ H: l0 o2 A( u( @ g/ { server_msg_send(server, APP_CMD_LOG, "upp recv: success");
: c( B8 [5 i! p" C' i, Q, w6 Z, | }+ F' i3 \% _! n$ N
}
$ \# c/ n% J' N L0 \* y4 u/ O
3 W3 C" y* R, P0 s# n% s. w5 n9 k! E7 s8 l6 t! E" _
return true;$ ?+ F# c) W9 O. J# k' d1 y
}* P7 Y. Y+ ~% i8 m h' R
* b( o1 B2 i/ a# B- y/ i4 a
static bool server_upp_data_send(Server *server)
: {+ o9 B% T3 S- w% Q( T2 p* P{
! E$ d: g3 O0 K6 x if(ListMP_empty(server->upp_send_list_busy) == FALSE){
! Q) H& H t: V/ P DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);3 P2 e9 l% k: N6 `7 c
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);* X) O5 d3 q) y2 H
char tmp[128] ={0};( U% g% Y# m) `& r7 I
5 f& t% J; O2 h3 U/ X- t( t
server_msg_send(server, APP_CMD_LOG, "upp send: start");
3 k1 R% T- e1 Z$ I& C print_log(server, data, 64);
: J/ ~( z0 s$ V; Q& f$ g9 B* C% o7 g' k2 @
//. n) y" r& j# a- b$ i% G
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);, f# S2 v% m' b& M5 M% }
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);, e/ |, ?% f# C ?+ p2 H9 k! F
print_log(server, upp_buffer_b, 64);
/ @4 ?' Y: d4 `$ i- N0 w
( }6 m3 |3 Y' Z j7 a1 r server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
T+ A J$ S0 X. { server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 1 c; E, Y0 ]9 c$ k5 l
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;* |) c% D4 I" k; u! p) f C
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;0 g0 R: Y" b6 I
2 C" I$ b9 l" b6 [: @ memset(tmp, 0, sizeof(tmp));) d8 n$ P" h. i; D: P9 L" q e
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
" r! b. v% {& ?: i sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);' N$ w9 X* B- n. S6 @- z- ]
server_msg_send(server, APP_CMD_LOG, tmp);4 C1 u$ W% e8 S8 }/ Y* w
4 g/ E e* s& M. m+ \3 h
upp_error_count = 0;5 c6 ?8 V3 p& n+ F0 w
upp_dmaq_int_cut = 0;$ Z: x, c. A# E6 ^' J+ j, }& [
// fill in data
: n o/ H% O: X" ^" F5 Z: ~ uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); % n7 Z1 i# w- w# U$ ?
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
6 @5 V' K* b& I; O" W
- Z9 G' S6 N$ V$ h/ n" m) V) e // wait send success5 J2 h6 e5 ~" A* O
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); : T" D1 H6 F' k. h x% S& ?9 Q
, g* b, x% K8 r. S
// make data node in free list - U+ H4 i. y: T
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);; F! }" R* x% t) a0 y+ S
server_msg_send(server, APP_CMD_LOG, "upp send: success");
; | T7 I- o! ~# b) s }; R. M d8 N5 T% {
return true;
; F5 U5 C8 w9 _: [9 ^}
1 T1 V1 d* k; u9 Q) j7 Y; p* ~! y3 e( E- }, t
- [2 _. w1 ^ l% Y! j6 @
9 _! S T; ^& K3 X7 p% B. g6 c
' z8 \1 S: ?! {$ f( c" P, ~) u8 \' [5 d: _
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|