|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
1 K: f( C' J' Y3 Z0 [8 l0 t* Z
( W) R! l9 V, u' M: u) W* G- M问题描述:$ E, q- T2 R% Y& s) G4 J& y
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:8 y& T( P, H4 b( o4 h0 c$ N
1 ^, q* y, I* |图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。2 g1 _3 N7 x/ r+ x s9 K t% W
% E3 ~ R$ E" }; F测试结果如下:; P% g$ j9 k& W. l6 p/ J
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
& x, x0 X$ \) E. D- W! Z* H: e' {. \; k6 r+ v/ Y) W, {
# c! l! S/ ^' v( k! v0 Q4 _备注:, c' ~& z: }$ R9 \, T' W) v7 G
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?2 N' Q& ~) y, E
2、相关代码如下:& ? l" @3 c2 r% K5 }: e7 \( L
//UPP DMA缓冲大小512字节
) _, m( r1 C7 I% \#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍, }) ^7 `; u) d+ B, g8 V X6 a
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT0 b: G$ {/ |$ a! Q
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
/ N3 C- e& E2 i* q8 T3 N3 Z& O/ B6 \: H" X
# p3 J* @. @4 P/ R* g! ]1 `9 U
//upp接收、发送buffer8 K5 G: f/ N) T6 Y
#pragma DATA_ALIGN(upp_buffer_a, 8)
" x- U$ O0 [+ |#pragma DATA_ALIGN(upp_buffer_b, 8)5 ~, k" S& p# _
0 w' Q/ W) c) \unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE]; d9 j3 S5 F2 i0 t- @
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];5 O' I ^: F9 R4 H0 [ a5 c
- Z/ n1 x+ A3 D+ t! C; n3 }
9 q, |4 r/ E. l6 {, T {; l W0 W
static bool server_upp_data_recv(Server *server) % |; O, T6 z6 s! q2 a/ H# w
{
8 D6 o7 K; I2 h if(server->upp_channel_a_recv == false) {& K% t5 b* j. D, h% C
server_msg_send(server, APP_CMD_LOG, "upp recv: start");1 m. J7 B7 {, S, D7 l6 [& e
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
+ L) F8 A: N1 ~ Y3 Z0 S/ y2 v% _ server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
) H: i9 V A; y& d" k% B8 k7 ]
' D) `; e$ V$ m4 [5 T) ^ q8 \: c8 m) W+ [. o9 K H
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
8 `/ E( V! J4 B% d" B/ \ T- l1 X% ^% f( X' B
server->upp_channel_a_recv = true;//
) S/ ]: @& r$ `) g; C server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);$ F8 x) G: a- F! G O
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
' ~" J- F( a- U7 Z server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
& Y+ V0 P; {1 i3 S8 q( U0 R# z server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
, e7 Y0 `* F3 E A9 w' ^9 g9 u% u4 B9 M q' j6 V& p- w
upp_error_count = 0;3 ] H9 f+ O+ ^" Z: Y) O T
upp_dmai_int_cut = 0;" g9 z# S7 Y; T2 a8 m1 d
( ^1 e. L1 l/ T% ?
// fill in data
! V9 n) O) Q) C5 K$ I. D( n uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
6 g% T! s( U6 f2 F4 d, R server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");4 L9 N% `) p' p/ O: s
}
( w4 {4 n. Y1 l8 ^: t }
4 b: A. P0 H: o6 {9 ~ else{
0 ^* ~, o& [/ A5 w2 ] if (upp_dmai_int_cut > 0){7 y6 m) F! I- m7 `7 v
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
5 L! j5 }' k, H2 A2 y% b& R Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);7 \. A1 y T2 o) F" d1 |6 |, }9 E9 D
' O, s* W$ y* ~
: ^) g/ S# ]- m2 a# G //copy data to upp_recv_list_busy
! P$ e5 Z4 R: J" |6 o" \. ?8 T/ i memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
, H8 E- m9 a! `1 {5 y, r! E% x$ m7 K; t) b
//) Z/ F# Z R! a. `5 Q
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);8 X$ ~/ _5 z; x/ Z l8 B2 }4 A( w
' g7 @. O* I$ }- Y3 t% C- e //' }. \, p/ j* C1 C: q" h
server->upp_channel_a_recv = false;//
) q* G7 {. ^3 ~
+ `+ g9 g1 D5 M% \ server_msg_send(server, APP_CMD_LOG, "upp recv: success");
/ s6 j: a, j; v" N. h }8 \8 m6 q( _2 v# G( a# J- n1 p" U
}6 G0 p7 Y1 y+ ~: c
6 ]9 h6 t" E6 |4 _
1 _& b' u, K8 D. E" y- T) Z
return true;7 |* T" L$ ]: e% D% ~
}
/ F: f2 H: W4 Q# S9 p1 |7 M4 ?1 T1 P- }) F0 m: H4 M
static bool server_upp_data_send(Server *server)# t# {8 a& d/ J: |
{
0 |3 S0 M. ^' X+ m; \9 Z% i7 L if(ListMP_empty(server->upp_send_list_busy) == FALSE){1 U$ D9 m0 \1 r# t) e5 f
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
$ ^8 B" e1 m* L+ w. L" g9 j9 V0 k unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);4 ~, `, r& H) w% A$ _ @7 I4 C
char tmp[128] ={0};' o* j* V; o& K/ K$ t# p
+ B, Y8 G# k: J6 q server_msg_send(server, APP_CMD_LOG, "upp send: start");/ Z* g9 J+ j B$ m& F
print_log(server, data, 64);4 W& r0 s( w4 Q, o- q& ?( F
3 I5 s( P. T% C, Y. n
/// v' Y0 U4 u% [, B, U
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
& R9 S& F8 i3 Z4 n6 z: l% b% N/ L memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);0 e; ]9 R4 |0 d% ?' Y
print_log(server, upp_buffer_b, 64);
7 H/ _9 m6 L& |/ v; K
( V6 V/ M) H! i/ c( A: v& f server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);3 N5 y2 O2 y6 b3 D
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; # {5 x( ?5 K( b: ?4 Q. g
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;. U9 B! p" Y' g, w
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
% Q9 d6 o- ~ f, W# n4 B4 Y! K4 w
memset(tmp, 0, sizeof(tmp));: g/ b _. G, M# z) I
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", * X1 c, w# y& d" T0 U
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
" R) g& x. K$ [; P: m8 ? server_msg_send(server, APP_CMD_LOG, tmp);& o, ^( y9 t, V! `. O q6 x
+ s* `$ @" K, j* z: ? upp_error_count = 0;- v. k4 v$ U4 U
upp_dmaq_int_cut = 0;
! F1 p$ V% l7 r! x' ` // fill in data
1 D' @( p3 V% y uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 6 s& C# c+ n$ o; h
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");2 k7 K9 S; m- b- y
/ K2 y. b$ W+ q: c // wait send success
, |' n( Y5 l6 [- u% y; e! B while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 7 q. u9 T6 g0 {8 {1 `+ ?
( S/ K1 W! U, x! L+ |- n% w
// make data node in free list
, s# z2 o' r B ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);" c C4 e8 s6 \* J: l e
server_msg_send(server, APP_CMD_LOG, "upp send: success");* M, t8 u% P0 x4 V6 ~3 J# a
}
2 j# H" H8 S, ~3 { return true; I: M+ b, i) O* n) r c, Z
}
; m9 K. @( Z" Y+ w9 z* X3 {' I3 ]6 T& h! C, U
9 T9 _. N/ @2 c
! `% G; C& C3 r6 x& I: S1 @, ~8 c4 A" P8 _, P2 R) `) {
* S, k G) S. r: s2 r3 Y, p% j |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|