|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
7 j6 b2 e+ K t, x5 @7 X4 _0 n0 h: ]. m# B# H
问题描述:, I# B5 e4 |& @8 Q
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
6 k; F/ z6 G1 [' p: U2 Q' q" `
5 R+ n J/ M% D) X8 u8 P* j0 c- @图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。0 }7 E. Z7 L9 r5 Z4 E7 r
0 p" s0 K2 H0 C& \- Y8 m7 ?. ?测试结果如下:: |" M* V: n" H# _; P* G: Q
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?; ~- I" L+ i6 v1 o3 p" K k3 k
1 M5 _2 _% k7 V& }; x
1 ^ k4 O3 x- K! ]备注:
3 v1 e7 z& s+ |1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
; [, T- G4 c* J' U2、相关代码如下:# ?* q Y; e8 X+ ^; i# ~1 u
//UPP DMA缓冲大小512字节5 f! P6 w' w) L% a9 B
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
3 R) p/ g- [, t#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT; Q' w5 Y& o2 H* r; M" h _" `3 i
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)7 |& h, g8 M6 c" s! D- Z' u
$ p; W: H) @; G; J; c
5 C1 l- e# A0 \( n//upp接收、发送buffer! r1 M7 y* U B I; Q
#pragma DATA_ALIGN(upp_buffer_a, 8)8 r0 w9 b7 S I# N
#pragma DATA_ALIGN(upp_buffer_b, 8)
0 ]8 ~% p" p1 I2 ~. i( r H: O! W# ^, ^/ v, \5 d' c5 S
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];8 s ^8 {! ]" g7 Y
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
) l) o# Q/ s/ w0 d2 B3 h1 e4 ]; ^9 m) s {& R
5 ^% p; B3 v* i7 nstatic bool server_upp_data_recv(Server *server)
2 J5 a2 Y3 X5 x- ~9 ^( k% t/ X{7 w+ P3 C' G! x$ J+ X! q- y% O
if(server->upp_channel_a_recv == false) {
6 {7 @/ L7 ?6 O server_msg_send(server, APP_CMD_LOG, "upp recv: start");
2 Q \5 f$ w+ n6 v+ h& f if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
5 o0 D# }+ `8 i+ w& i1 b& s server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
7 W4 A8 ^' i9 E1 Y8 X# \. t6 n/ ~/ `
& I2 s% j" r$ E9 r0 f: D/ Q& d5 K memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);. T, C; v- K* d( R5 `7 F
9 j, @, l6 E0 i1 y/ S+ r0 \$ d server->upp_channel_a_recv = true;//8 t, e* \2 D/ z4 m/ t; L& y$ y
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
# c' H$ N, s4 P4 o server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
4 h, k' A) l( e; U w# d* ?# P* g server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;. b, f3 l7 S( Z
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
3 V3 X6 N3 z% }# P3 F @9 t
+ p( ?2 C( {& d3 H+ C upp_error_count = 0;
1 m1 H" `2 V' E. Q upp_dmai_int_cut = 0;
3 V3 H% K2 {, a. Z2 H8 b3 j! K& }, c; d) M& M( z. u
// fill in data
, ?! F5 n* x k1 t9 |$ L uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);7 V. @( a S6 Z4 f! E
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
4 D+ g/ `4 Q& }7 Q. G) P }
o( y0 L) v7 n1 r; J }
; O7 C* r: z$ l! \ else{
) c6 r; V' r4 E* i5 A! x if (upp_dmai_int_cut > 0){
; L9 {4 V) l% c. l5 w DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);8 }6 z. Q+ M) W7 }& o M
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);( ]8 f: ]/ W* J3 A, {/ Y( {
% D6 `2 S2 |% |' i! ~9 r3 R+ E. [% X) T" }3 d* A$ Y) M
//copy data to upp_recv_list_busy
1 G. c$ z' E+ J9 [( D7 K$ s memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE); F! p9 K2 O6 o9 p. B
$ n* q ~1 U' m X6 q- D //
5 v, i1 S7 l: B2 l {9 u ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
, o5 R+ ^' n& j0 [6 M+ g/ V! S0 f+ y* ?9 [
//+ p+ c8 L/ ?8 d% z8 b2 B- M% ]7 K
server->upp_channel_a_recv = false;//% n9 i0 i. |' b8 i( y8 \
7 S8 s1 v) X8 L# `4 O& H+ v server_msg_send(server, APP_CMD_LOG, "upp recv: success");
$ w. h e8 t! U7 i. T* e! Y3 k/ E) M }& n1 z l# v# W; D3 x' ~
}/ z# C; }/ \5 b2 z
/ f6 Y4 N) L) p; D: Y6 b$ [0 ]& R
) c: n, |7 B& N9 i4 M. T return true;4 S; \2 ]. n K) Y
}
4 G6 J$ W$ W" Y3 n
0 {, w2 S1 [0 F3 ^static bool server_upp_data_send(Server *server)
3 J0 o6 f" y/ d5 M; R{
2 k3 V$ x- n* w if(ListMP_empty(server->upp_send_list_busy) == FALSE){3 |$ z: J# F3 b* l2 `+ D
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);2 D. G$ @: B3 m- _9 [& g4 A
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
8 b2 n+ d& [8 Z char tmp[128] ={0};2 f- U4 A) W3 z
9 O( H7 E* G' C/ Z/ d( @5 b; M
server_msg_send(server, APP_CMD_LOG, "upp send: start");
7 e: q& k, q3 }, U6 d5 w print_log(server, data, 64);, v7 ~) \7 j4 o4 U! {
. v6 H) q/ d' D" b3 i0 x: y* i
//
6 a4 i. H7 F2 |0 G4 u8 S5 n memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
. X0 p$ S, J! @8 Z/ o memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
' K, U: N7 _; L K c. n print_log(server, upp_buffer_b, 64);6 M% a; Q" a* y* N
! b# _/ t* J, q# n server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
4 _- l9 }7 T7 L+ \2 g6 T server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
0 Y- {. @! e# `5 K+ t! { server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
4 _9 t; D! f+ S. l5 P' k+ ?2 u server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;, b3 M; a. J& n
$ I7 y, A, Z" A% M( E
memset(tmp, 0, sizeof(tmp));+ z0 R/ C. o& @) p" e9 \
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", " V- ^, w2 ~- M/ w: A
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);1 t! l- [& c6 n
server_msg_send(server, APP_CMD_LOG, tmp);
w) h- l; |+ o: }6 v* h6 z1 O4 H4 Q1 T0 t( P6 B- A$ x/ U2 u
upp_error_count = 0;# O1 H" S1 ?7 s( O* H- W
upp_dmaq_int_cut = 0;
' i/ m$ ~- E4 x3 E, E. x! U: A E0 x // fill in data * b w8 y8 S+ [/ |
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
3 x9 U' I; M8 [+ w. M1 r server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");8 V* ~4 g, }* p5 Q: Y. D9 J) F& @
0 s1 s) ]) H, o7 R // wait send success
; v+ J1 P: Y1 Q' [/ r while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
% s- ^( M- }5 H0 B0 y" b% u9 _2 |/ _+ K; U, J0 @ f
// make data node in free list
. N' Z% |' P$ L ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);! j. {" _. j' e4 [3 s. [ X4 |
server_msg_send(server, APP_CMD_LOG, "upp send: success");6 e3 r0 E9 v' r
}% J/ C8 ?9 \' j3 f$ I/ g* k
return true;
) h! E, _8 S. K s}* h8 _ i2 U3 D
& q# D4 ?+ I4 a( X
: `3 x" V% @3 D+ O0 v4 a" M" L. M1 m" m' u+ G
% H5 M) ~0 u, D4 J2 j+ A" b- D7 T' [0 [. d# o, o& U
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|