|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
& d9 R/ t! r8 t% E6 a
1 j/ T0 u- B% ^9 T* H- h问题描述:
- l. H$ s; B* A1 G3 Y7 ]5 g在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
+ m% {( d( o9 w+ W1 v5 F8 P& B: T
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
3 R& M+ x3 \0 x3 G: I7 n5 K# u/ X! Z( k1 k$ u6 _! t& t& m4 {
测试结果如下:7 t5 M5 m' Y+ e. U4 O m F
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
5 ?8 S$ Z! W/ x7 ]0 R% p; Z: v% F( X$ d+ \
# Y' Y9 Q! ^9 X j+ c9 _2 Q' \备注:
& J; v5 d2 ^. w6 y+ F! t8 g* x1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
2 K' U3 [6 w5 k% s' o' o K9 V2、相关代码如下:: `# V, Q+ D3 ~! b8 r
//UPP DMA缓冲大小512字节
8 s+ |4 V5 v: E- {9 j; j#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍: n( V0 q% y% q
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT; Z$ s8 l4 z0 F3 c; l/ b
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
3 _: W) \# p C0 A7 n* u; s1 I$ t! ]6 ~( @
0 ^/ z& J: |. L) ~
//upp接收、发送buffer
# N/ ?7 N# Z, W* C: w }8 L* J#pragma DATA_ALIGN(upp_buffer_a, 8), o) w7 X" P* o6 d$ e6 X
#pragma DATA_ALIGN(upp_buffer_b, 8)% X4 L/ p- S: s( G0 v
/ x2 c r# |9 f4 p9 O1 p
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];# }$ V k7 ?" `6 i1 E p* U( L
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];4 f. i$ d3 u# A$ {/ E- |
. u+ K9 Q- X5 a, V
9 m4 w$ m! U8 e
static bool server_upp_data_recv(Server *server)
7 q7 {# p% z2 {7 z" P/ y{
2 K9 J2 E M( C* u9 H1 s* `3 r if(server->upp_channel_a_recv == false) {
; b0 V$ n+ I3 F- N; M- F server_msg_send(server, APP_CMD_LOG, "upp recv: start");( o( _/ y+ N) v4 A2 I0 l- @& Q
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
9 I& R: n) O% x: l( l; u' ^ server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
+ A4 Q% E% @+ K3 {! c% `5 q6 |6 I/ _8 r n2 t3 K2 h
( q p/ `9 @: d* a
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);5 s# w8 |9 N# g6 \# N* {
& P9 t' Q9 @% e' \: f( m6 \ server->upp_channel_a_recv = true;//
) u: O3 A6 J& v; }; s! ~ server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);* B* l, s {+ R, B; a
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;; E/ S! U+ n# i, V& G
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
% X; `" R3 I! s; E" W6 ? server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//- @. G( Q4 D6 W0 ^6 U% @
* u" ]4 q7 O# V( T$ D R
upp_error_count = 0;; f4 s" p0 Y" S% ?( q
upp_dmai_int_cut = 0;3 o M# f0 ~6 r( [. D+ g8 k% J
6 z- n0 J6 [/ }" F: d
// fill in data
@+ j, @: O# }, U3 H uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
9 m/ S2 l7 f5 X# B# T9 W& z' L6 u server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
6 t! E$ y, z! o. t1 X0 J; c \ }0 S9 e0 ^% K+ b7 Y& d( q- n3 s
}
2 w$ c% H8 ]. f( i- L2 Q/ m! S, g8 U8 i else{
: I/ J/ b. ?% a2 u2 ? if (upp_dmai_int_cut > 0){( i/ w# v8 L5 F$ L1 G3 G/ x
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
l- R" r9 Q0 \/ d' `4 n% Y; j Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);/ F4 I# ~( E' t6 ^5 o+ o z
# l7 B9 k5 D# ^3 u2 y8 L' [- x; [0 H( S
//copy data to upp_recv_list_busy7 y0 U7 c, o3 H0 ^
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);; q/ f* U* z& D5 Q: Q
+ J% }4 `. L d& A //
: w0 [7 k' F a# ~( H. h1 @ ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);- R9 {% t9 ?: M/ E* B" L" [
# o, B# r' F# q1 F/ S //8 ?& y2 A9 c9 {+ u
server->upp_channel_a_recv = false;//
" W% W2 K0 G# M6 k$ L+ T/ o. ^8 N1 O4 l/ e9 U! E4 B e
server_msg_send(server, APP_CMD_LOG, "upp recv: success"); B+ R5 w3 g3 z9 P, g3 @0 `- p: o5 |
}
3 _- P3 K H( v0 g' |5 } }0 d, i- P6 H6 C6 n9 U/ c
% k' X- o. G/ ]6 W8 N, ~' b: n; E/ Z5 Z7 `
return true;1 _; {) B4 t" a- |+ o" r. A& O6 P) s
}
! `# w3 U5 Q$ i, P$ |2 {1 R( R- s* N/ Y) ]" _5 X W; m; O8 V
static bool server_upp_data_send(Server *server)# Z1 N# w. q- r3 c! V) V; j
{% }4 D! g0 V" O) ]0 V' B9 W2 x
if(ListMP_empty(server->upp_send_list_busy) == FALSE){: n+ h, w. e( k
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);5 O2 Z2 y' a4 c9 f) P% }
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
7 L% ?' i, z/ n char tmp[128] ={0};) T: H1 O. \: e8 d# A2 d
* E! l. {$ ^- i# ~! ~
server_msg_send(server, APP_CMD_LOG, "upp send: start");1 ~" v6 [+ Q# Q3 m8 w
print_log(server, data, 64);8 t2 [" d+ [9 v1 m$ |8 T3 t- {8 p
+ }: |8 T9 k$ Q9 S3 ] //
C4 k6 [4 P) H% n) W: t/ E memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
7 R1 t+ b; M' @1 h memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);# a$ ~: v, k$ @ u# M, H$ O
print_log(server, upp_buffer_b, 64);
+ U% L: k* ]* d6 b6 U. ~! r8 h. D' z$ L6 u, \; C
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);( l z& u- j& L6 B
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ' E. d" m( S; q. ?: v
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT; c/ ^5 x3 y6 f! e" R4 @. D
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;) c8 t8 G- R1 a( F6 ~2 K% D. B
4 I6 M; `9 s/ F5 x% f% k! a6 `
memset(tmp, 0, sizeof(tmp));
. U4 h7 Z2 F3 ^0 t9 a; g4 T% t sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ( V `5 S3 A& k$ {8 l9 L, [
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
2 a* F q' o0 H; o& A$ ^ server_msg_send(server, APP_CMD_LOG, tmp);
y9 ^; P; w0 A: l: O4 u! a6 u: Q; F1 q- K) }( g
upp_error_count = 0;
/ [* a5 c1 f" f( U! W upp_dmaq_int_cut = 0;8 K7 T) _+ U* u5 u& u, o
// fill in data 4 k4 d5 C* x2 K; ?6 @) s
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
% G4 E+ R0 L w8 m server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");5 u1 }: A c; t+ l# T9 @* x; X
- Y) b8 _2 N2 O% H# O g9 R- |4 D // wait send success
4 N* V w9 Z& c while (upp_dmaq_int_cut < 1 && upp_error_count == 0); D8 s z) V- \; q! |/ q5 `
$ Q! w6 D$ l1 C2 b; W7 q) e3 D1 e4 R // make data node in free list & d7 P, a/ @% x; n" {
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
) b) k2 G' [3 `9 |" _ server_msg_send(server, APP_CMD_LOG, "upp send: success");
: P* W7 j. h, y' P& d0 c }, y' w7 P& J' r9 v/ ?) P
return true;6 W2 a3 P0 _; z& ]1 l
}
, l+ \- h/ d$ ?& h
6 O1 s/ O' g& d
$ K( v! C$ D$ h! I7 O3 A0 X w, h4 b
]7 ?8 i$ b) R( t( L1 `6 Q' Z% u1 Y( N+ h/ d2 b
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|