|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 $ U: W9 m& p7 J' ?
; j8 `1 q5 b& R% e问题描述:
" Z, d- W" [6 }5 u+ b在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
) w3 o- M% s. m- P/ E. C: ? a4 Q" x' Y* _6 }0 s
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。$ a% U& D1 M: P' v, T) E! I
z( ~$ e* z4 E2 ?; ] \: K% U- v$ y$ x测试结果如下:
3 E$ a7 p3 C3 m6 W+ W138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
$ g( D" L+ i" P! N" L6 Y) G! T: n* Q) N2 H3 Z+ V
3 t+ a# f+ @3 V/ K) H" w
备注:0 m; S6 J& x$ N& }. W: x
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?0 Q. m- j- Y+ P
2、相关代码如下:
1 v8 A( N4 ~. T5 j, k; d# b. s1 `//UPP DMA缓冲大小512字节0 g, a% c2 V' B2 z
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
W, J0 T- L& j) `#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
4 S0 u) Y5 t, H+ o1 b8 \) n" h#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
# m1 E' m, R' ]7 f0 @; J9 `* _1 P5 `) X
$ u1 M; w5 v& U+ E//upp接收、发送buffer+ C/ G8 H8 [0 @
#pragma DATA_ALIGN(upp_buffer_a, 8)& Z) [( ?- N( C1 B6 Q& o
#pragma DATA_ALIGN(upp_buffer_b, 8)
: O* J! A: p% j, ~$ N6 t4 i, N8 K7 |+ b5 U/ i9 A- A8 y8 m3 X
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];6 |# V, [: t c
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];2 t1 ?# H! |+ |* t# ^5 Q
9 m# a) v* d* S+ @ }! s/ R5 M( f/ t6 d4 E1 N1 V" q
static bool server_upp_data_recv(Server *server) ( k$ F+ ]8 S) l* p9 Y
{
: }1 \2 ^; G7 k1 @' w1 J0 }; g if(server->upp_channel_a_recv == false) {8 C9 o& `. O& {/ A
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
5 n! Y; o+ Y& z3 i H4 W if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
$ }1 }) x% F2 r server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
8 s, C9 C& d2 T5 B" m+ n5 E. u" {4 q# i6 V0 P8 v
+ Y- y$ |8 L8 O q
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);4 ]+ {0 a. N: @
3 B1 C6 X$ ?, _ server->upp_channel_a_recv = true;//1 p) @: q _ t2 ?0 M0 Y
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
4 r+ o- g7 c; [# w1 T+ e server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
( B D- X3 D; B' Q) i( p6 s server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;1 E! O/ y8 Z/ W: b/ h. ]" K
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//" r' y6 t* n/ Z: ^8 }+ P7 w, O
7 e, r$ d( q6 j$ \& Y8 \
upp_error_count = 0;. y. v8 v, G; c, N3 q
upp_dmai_int_cut = 0;* [. p! z# H8 L" `8 Q* L
0 m* m9 f# D y: V; G
// fill in data
3 Y6 m+ d% w# O( k& J: @& o uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
; t- S+ ~5 v# Q0 O" D7 i# a O# z server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
# d$ }. f( i$ g' ]4 Q }
& }: B' O( s' o6 b9 \+ d2 A1 e }# Q' F1 p) ?9 R$ w( L9 P
else{. X# j5 R, s" F6 L0 ^
if (upp_dmai_int_cut > 0){
+ P: X- t' G, V S$ N: |6 T) {1 v% z DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
! g5 n6 F: J. s2 q' S Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
9 q) |4 m$ x( |3 t$ M6 P* x3 j/ w( b" z" B. ?( P l
8 U6 n; x! D6 B$ n
//copy data to upp_recv_list_busy9 f' o+ d% I; w1 M+ D0 D
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);' g( k' f4 w- o
+ N: T3 S9 b7 @2 `8 c
//" N& e4 v) Q i% _ A- v
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);( ~1 a V: |1 ^. Z9 G& ~
! K7 H3 \! u2 B& d4 t //8 p; c& }# Y( G% I7 l1 l2 ~
server->upp_channel_a_recv = false;//
. _- E* U6 ]& p/ F. R2 y# J. Q( M4 M$ ?* u m3 Z- Z
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
+ N9 z4 K* o+ H! Q' a }
* [9 B0 {- L! u: E- W! W- E" {" s }
) D' p" a8 W! h2 m- l1 m9 A& R2 A# F5 n# ?) P% H* o! A
* D& N% B7 I. @5 ?
return true;. H* \2 H! l+ W" h4 i
}4 y. }" N. W: n7 b1 g2 k3 W
8 \8 k5 h7 @* H& Y( ~3 gstatic bool server_upp_data_send(Server *server)! A: W" E4 d1 [1 r/ k' ?9 w
{
1 h; p7 y3 \* [$ V* j& x( |3 q- g7 b if(ListMP_empty(server->upp_send_list_busy) == FALSE){! m1 m4 s5 l6 l
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
6 z/ v( [* d& Y# ~4 ^% x% s" k% U unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
6 H4 }% i; c6 ~" e' S char tmp[128] ={0};9 F4 G3 N% H/ }( y: C9 q% R
& Z5 o$ s1 x6 z% L! ?+ D, N& L* H server_msg_send(server, APP_CMD_LOG, "upp send: start");" A9 I* q& }( h V: w8 }9 r" p I- S1 r
print_log(server, data, 64);$ h3 T2 o+ M i
. @0 a0 o" ~* z2 c+ c& i
//1 D* l# Y i' E# z& H- J6 ?" Q
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
4 ]9 B7 m/ g( y3 g/ t+ s) l memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);/ D. @8 F/ h& e3 f6 [; t# Z/ D
print_log(server, upp_buffer_b, 64);
( Z) C" b& _- h* @7 u. h& f' t' V' Z
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
2 \, s; t8 f" ]# `& `/ W s8 q server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ! O' B6 p& W7 P$ @
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
) h' |% W7 x1 h! M: z# Z+ @2 h server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
+ [, M3 m+ z- V8 U' O1 }
! w1 z3 b' f& \/ J/ D y2 f memset(tmp, 0, sizeof(tmp));
4 |: j- @: ^. a- U. W5 x9 D sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
0 C' g5 t6 K/ v& E; | sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
. P6 ]1 a& K$ l) n w server_msg_send(server, APP_CMD_LOG, tmp);) B: T5 k) v$ g8 a
. e2 x7 f( X3 f. ?7 v upp_error_count = 0;. e6 r1 S9 r' r4 m; G
upp_dmaq_int_cut = 0;
5 k" t; u8 p( z" C8 ]/ H // fill in data
& L4 I- Y; X3 Y; X: ^* k# e$ W uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); % S* ^, O) h+ E! g% n& m( T `' p
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");8 A) o1 d. C% g- u, E
8 d% M2 C4 m# {0 @9 i0 F // wait send success
4 j0 P# c' v" M$ N- Z while (upp_dmaq_int_cut < 1 && upp_error_count == 0); q1 S' a& Z9 h" f: L3 x
' W# s1 {3 J( j5 C( a( ^$ ~ // make data node in free list 2 ^1 y* O e* M+ t/ [
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
. F) L( [" {" ^5 `& r6 P server_msg_send(server, APP_CMD_LOG, "upp send: success");% L5 a" d6 Z2 j2 ] A9 l
}* H, }# t7 ]; `( V3 r B3 z g$ ]
return true;
9 E% ]8 j) W$ w5 O: |# f}" E+ i6 S2 F S, Z5 W4 y' p: E
7 w/ H; A3 U! U b
2 Z/ p8 B- d5 _1 {" k8 U7 F3 Z4 A. A0 V- c; L1 M
' @" Q; u6 k5 p/ J: n; W4 s
% }. ^( c' W( V% p4 W9 S' l0 ]" d6 F/ U
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|