|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
' r8 f( h r6 s% ]8 K: V7 `$ o" _3 G! x+ V
问题描述:
% {" \- d5 t( y, x3 v在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
( Q* G% v- L0 P( l
: e2 T/ I& `/ l图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。9 s( ~% _/ p7 v2 a
0 d1 j9 U, q+ b$ W0 o8 w测试结果如下:
# Y; }5 F8 r+ I0 _! K; P% c; v138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
% C1 y/ ?9 o# y8 E4 u8 N# K- B7 S( j$ _, e4 v6 a# L& H
7 `4 J: t! s! C1 H$ C& t备注:; Q1 U; v3 A/ {, r
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?3 X# }' T8 h) E7 g+ V
2、相关代码如下:0 f% w; ~* p+ d2 a7 Z" S% l
//UPP DMA缓冲大小512字节" H& l$ w: h+ X' S# G6 }
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
! E' x* }6 r1 `#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT+ X) B/ x( y. l
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)& v a, X& l5 N' k4 f O
) K: w4 c6 k( W4 ], A
, p' Y( o! t+ K' h//upp接收、发送buffer8 W9 }4 g( c$ N3 b6 g/ T
#pragma DATA_ALIGN(upp_buffer_a, 8)
0 [( G6 f6 O) _5 x+ ]4 s0 Z6 R% E+ g#pragma DATA_ALIGN(upp_buffer_b, 8)* v1 ?! l0 F" d4 A5 I) o- q
3 F- f( ?8 h* Kunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
, R W/ `. U, s2 vunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
% v5 x% l" J5 P: ?1 A+ B; S- r
8 {" I% Z8 a/ o+ J: `" s
0 ^4 R/ @9 l- n' m% O& Q1 } x+ e* C" tstatic bool server_upp_data_recv(Server *server)
0 ^0 i: M3 l* u$ {{' ?4 ] [6 j- S4 O% h; t' a- V
if(server->upp_channel_a_recv == false) {
* J7 E) M( C) s3 S$ R7 S server_msg_send(server, APP_CMD_LOG, "upp recv: start");4 }" E# m- [* o/ {
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {! L: o8 `, M N5 t3 f: B7 z
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
' W- e r9 E5 T- q
0 W- }4 V; h, G& j( i- P, G1 E' S, D$ k5 A) w0 j3 \
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);+ ` i4 I3 w! t# U- m# L" S
2 ^0 t7 g. F3 {8 G
server->upp_channel_a_recv = true;//! s6 a) J1 [/ J' n* ?% Y/ n
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
0 h7 i" x% q: E2 [* n/ e server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
/ {6 o: ]4 m" Y" C server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;4 m8 ?" q' E- K* l' q8 u& C
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
; } M+ t6 y: a b C0 v9 R; s2 C! X! X$ D! u5 |0 i
upp_error_count = 0;# j; B0 N( m+ B# Y
upp_dmai_int_cut = 0;
: p6 J/ l9 n! \, Z9 }$ N' }# r- {
3 m/ Q1 d+ a( t9 v8 I // fill in data
! W/ q9 `$ `7 \) x uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
. f1 e( A" E+ l. l) |- { server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
2 V) P& B7 p1 a }
/ E1 Y/ O1 g! J) L2 J9 t }. r: d# x! \$ k3 ]- q% t
else{
* q1 x, r) c- ~) M$ m8 y if (upp_dmai_int_cut > 0){. G @' c8 m! l3 s; z0 _7 `7 ?4 N
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
$ H. i8 z$ N4 h% ^2 l( ]; f Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
! h4 V( M/ K- ~' t# [7 ^2 v" E8 U/ ?! ~6 R
5 x' B- D- s3 {5 G$ s //copy data to upp_recv_list_busy0 X3 J9 d6 `' S9 h5 h5 a2 M
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
Y+ b' f0 U7 r! [) [8 w, ^* e7 K; `1 |5 c0 h2 f
//2 R' E7 ~7 V* d+ d* i
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
9 M, I. T; ~: R/ N) P" u; o6 m0 S8 E8 w
//
$ `1 a2 i% _$ X! o$ o$ Y" } server->upp_channel_a_recv = false;//
4 ^8 V4 W8 |% w8 M
5 @& o: ?/ `. b$ k server_msg_send(server, APP_CMD_LOG, "upp recv: success");; h7 Q! z3 `+ {8 [
}/ J, x9 ?# K* i
}8 H* c u1 Q4 {8 E1 f
' c8 }/ V( r! t, z; o' Y
/ @3 k: X2 v: o( z: Q8 C9 ? return true;* Y. P& r6 F, g1 J# R# \& a
}
' R4 V& M4 O7 x2 b: R. v: Z' n; n) `% _4 w5 e6 u/ W
static bool server_upp_data_send(Server *server)
/ w1 ~0 u" ~% U# G3 k7 c{% B; H1 N9 U- ]9 l7 g2 J
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
2 Y3 d+ R0 X7 C, F9 X DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);2 g1 Q! q& E" o8 a/ Z
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);5 {9 A% a$ z/ b6 ?! N4 C
char tmp[128] ={0};3 ^+ P0 {* N! O' Z7 y# v' j. e
d. S2 ^5 ?: ]6 q
server_msg_send(server, APP_CMD_LOG, "upp send: start");
& ^ D) z3 N' H1 b3 b( O$ k print_log(server, data, 64);0 I0 g5 k0 n8 K9 F' B! ~0 ?
2 `( g, w. u3 j% P9 m //) K: K1 s- F: I4 ~( ?/ t
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);) K. S! y1 u" r! S% M: ~/ H2 V% n) n
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
! _7 y4 b# G8 Q; p/ i" }' t* o print_log(server, upp_buffer_b, 64);# J" N0 s, _2 k- `
: ~, o/ Z/ C) F$ ?9 W server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);; c. J6 Q$ ^, L, P
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
% o& T2 ]1 I. R+ a5 b3 S server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
6 T- ?! p3 Y8 }0 c server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
& S+ t9 _# q9 ^+ @/ Q, G8 f; a% f" K4 @' J2 a; ?1 U
memset(tmp, 0, sizeof(tmp));; ?1 L6 ?6 h4 x( w4 Q
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", N# G1 U. z$ C& ?
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);, q" J7 s# {9 c- H; C, ~" {! o
server_msg_send(server, APP_CMD_LOG, tmp);" c$ c8 g c) j& D" d. i+ j
8 M# }! n( j+ }
upp_error_count = 0;3 I$ r( t& c# y, E
upp_dmaq_int_cut = 0;. j, H3 a3 A% |7 c& f
// fill in data 8 ?% D4 c8 Q; Z& Y0 L& h
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); . [7 F$ V! l- g8 \& l5 B* p
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");" v! }0 H3 V# H# C
7 b9 G6 X( L! ^& A9 d4 V // wait send success. l/ G3 t) Q- o4 [) ~( ~. |6 V9 I
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); * U' T0 ~- P; Q3 P% C, k$ l
. N) i( B9 S" U/ b7 _ // make data node in free list
! G' @4 i/ f% z ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);4 s1 O* k2 u; ?. U, g9 a4 V1 t
server_msg_send(server, APP_CMD_LOG, "upp send: success");
4 F+ O. D8 \! G" M }
. j4 J! T% i" G+ d7 C return true;
, ]! C/ M% |& h/ D. O% H3 q}
4 `( Q. @, A( B, B3 d! q8 \. N5 _* e: h0 b2 Z2 [7 c* V) ^
5 f2 `* J9 C0 X: S( W
3 ?2 Y2 W2 ^1 k: H/ r% T/ k
C y6 }6 c9 D) v
7 Y9 u( h+ Q0 C! h- ]: [1 p8 V8 s |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|