|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 , K* u( h' a% E1 X7 L h
0 {: A, h# p |
问题描述:
, e* h5 T5 l8 S: \- m) Q在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
7 K- t# P6 d7 S; L- }9 }5 Q- _- f4 b3 ?2 E, G; b, R2 Q* \
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。$ Q, D4 H. j4 M
* X" k1 {! c3 l* W2 ~测试结果如下:
" |$ q7 B4 t) {, M138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
4 b8 u9 |6 @& q3 i, `; {$ K- t7 L& U7 }# d" c) P$ J8 Z* R
( M' |2 }/ B9 ]+ \0 e备注:
" g2 ]7 A, @1 ]1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?0 [, a [* \( A1 G* W
2、相关代码如下:
, c9 j7 V8 k% U* v) A% Y//UPP DMA缓冲大小512字节8 L$ L. K7 i) p1 {9 |" k- Z
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍' i# j0 ^1 Q. U* ~
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT, q. V! L( n/ U+ z5 d2 S
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
% h9 p0 ] z) l+ L0 \+ Q' s
3 R: i( v" [* T; A: _; _+ y9 o2 `) h# `1 f
//upp接收、发送buffer
% O: r% s5 |0 w( ^8 l6 K- |#pragma DATA_ALIGN(upp_buffer_a, 8)! y H, {: a( _# `$ J! ]" U
#pragma DATA_ALIGN(upp_buffer_b, 8)% u/ z$ v, \8 t% h
/ \% w- b% z7 q B Z `
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
3 ^. ^9 S: q3 S! t* P( }4 Funsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];9 J* c1 ?! P$ u) j+ a+ l
" s* u$ E5 O2 p
U1 r3 u9 g) p/ k: h% b
static bool server_upp_data_recv(Server *server) / w5 ?9 X/ a ^# o+ d0 V
{
& N8 b3 [) P; p! k3 z if(server->upp_channel_a_recv == false) {; O T; E, g5 X% E$ |
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
s: _; y. }+ ~' `! p if(ListMP_empty(server->upp_recv_list_free) == FALSE) {2 _5 }7 F! T/ x+ v, p5 h4 v+ t
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");. O2 U, I k, ^- ?+ A9 J
+ Q# |; E8 e2 i+ L7 Z8 ^" @' l
2 {, z- F5 v$ h; e8 E$ s: N
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);" z' |) k* @1 v3 e5 U) ?
! D) K; `: Q# T" M
server->upp_channel_a_recv = true;/// j1 d, {$ r, o/ b
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);! p" S* F* \* m: U# X& a
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;+ ^* L0 x4 M( Q; V
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;' Z6 z" q: L2 N3 X) V* b
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
5 t0 p+ s- R; ^$ B3 }. h* \* n& h5 r7 C: w! F. q- C3 g6 F! t
upp_error_count = 0;) U2 @" t t1 W7 u' a% y; X
upp_dmai_int_cut = 0;
- d5 P- a. |$ H
4 A- Q* W0 ?: E( z // fill in data / e% y @; `% O0 i/ {2 C
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
+ K4 V5 n8 P5 Z2 q8 Z* ? server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");0 J1 V2 L/ ~: U2 T
}3 O5 i) ^3 Z2 l. h
}, c4 Q) O& K' F* P$ V0 h7 C% }
else{; u! E" x t& Q- l5 e; t; O
if (upp_dmai_int_cut > 0){; l1 u# E! x% x
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
% B0 k& V3 M; o9 B# b/ e4 D: d m Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);7 I" I+ Z0 l# M2 q- s2 ?$ j
5 {1 O2 Q+ K- y. w- ?
( h; V5 M1 K( }8 n //copy data to upp_recv_list_busy
1 S8 d0 ]" c; C" x1 d! s memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
% A+ H6 m8 d' ?$ N
# p8 p+ [' P6 u2 {- y //" A& v6 ^7 ?) G9 o9 D9 x. S' b8 n
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
& B2 B1 H' c: J Z8 y6 w
. A* b* N8 w, X- V3 i! P& y- ] //
/ \! x5 k# L% j; J, N5 w server->upp_channel_a_recv = false;// N; D) h, ^( E9 ]6 @
5 x4 V2 Z. S8 O3 ~$ L7 o server_msg_send(server, APP_CMD_LOG, "upp recv: success");
7 O) H5 Z# s8 d6 [ }" o: u1 Z- B V9 F- l
}1 n& h9 n. V" j6 @! \
9 g1 b9 `; |0 X. D. o: U# N. j9 W) W. a
return true;
( f/ h7 {- O& X1 Y' I}
3 @& d/ F: I! o A
: g) U+ h4 C% x* D" ]) P/ E+ `static bool server_upp_data_send(Server *server)
I" R& m) P% @; x8 f{
4 k3 R) h# j" K if(ListMP_empty(server->upp_send_list_busy) == FALSE){
) ?1 P7 ]) g6 d- S& G DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
* m1 _& ^: w h8 j unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);7 S7 _! I) Q/ h' W: D6 |
char tmp[128] ={0};: V/ ?9 S( V7 i2 L% k7 ?
3 O! [' k1 V4 Q; V server_msg_send(server, APP_CMD_LOG, "upp send: start");
4 @3 ^ T! f$ f- W" f& z! i8 A print_log(server, data, 64);7 E1 D# L! K* b, F+ D
; U; l4 z) S; S. z0 z) `4 C //& y/ X/ ~: ~5 @3 q+ J$ J
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
9 H: X% P. S/ ?- |& s0 U memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);8 F t0 m3 f9 G: \2 T
print_log(server, upp_buffer_b, 64);
' J9 T8 M2 x# t }8 ]+ I* @
) \- a) D8 w" o& N" i server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
) z& R# y P" a2 }3 V1 H- h server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
8 H0 m$ ^5 T7 v. _9 i. N+ ]; H0 ~ server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;' O( l( ]! g2 |, w$ W8 U; h
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
8 ^; k5 A& }) W! m
$ r) ]' j u; A. Q! ]9 g* [ memset(tmp, 0, sizeof(tmp));' { L+ P) X7 ]0 \1 A8 v
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
- O0 L4 ^* P6 A. E( ^ ` sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);, m& H: w/ ^% f. I: X
server_msg_send(server, APP_CMD_LOG, tmp);
2 Z% M+ \. \* D0 j4 Z# m8 L+ s3 A/ g
+ w6 s# f3 {$ ` Q! ~( k8 z upp_error_count = 0;2 i2 v: N( O3 x
upp_dmaq_int_cut = 0;
' c: m& b' V0 \ // fill in data
7 ~( P# _( l2 z1 e& { uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 3 z$ z3 g2 E# A4 M' C4 \5 h2 C
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");% i- n0 n% H5 }) J# ^* {
& I. e. _0 M- e$ G, E0 j // wait send success* y- r! l' z0 d8 }
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
' `2 g. ^2 u: f; f3 P; U# [: E. X2 L: o6 w7 \0 k! |; a
// make data node in free list
* l5 R3 Z3 U- H$ n0 |/ e4 P0 z ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node); a9 z6 e5 R0 E+ |
server_msg_send(server, APP_CMD_LOG, "upp send: success");5 r4 V% X6 \' ?3 s* N! C" s
}
! \; T7 d- y! v, Z6 { return true;2 }& z- S! ~1 v, H" ?3 [7 e
}
, x) k( O/ z+ }; x% j. r
' F/ n0 a" O- Y
" q2 ^/ I, P, b
+ e% C0 s& d% \, f2 M; }5 [% o& |, x3 e% Z* K9 `
' m# t0 O4 p8 \2 e( L- Q7 K: [) r |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|