|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ' p8 @$ ]- T- B9 h6 u4 u7 D
3 w# N' U. B u; h) n
问题描述:! H& X7 E9 E: h# q+ l( u
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
9 P3 a! A6 Y9 E' v! G. f6 E3 t7 k0 @- V8 }8 x$ W s6 S
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。2 r4 ?( O5 F0 X
. m" R7 T! i* n; [. k5 ~ G9 u9 W# c
测试结果如下:$ P! l, x( {* F+ q! u% E
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
3 w( e2 t) I" C0 `3 ]) G1 D* i( q2 d( q+ l$ P, g5 _
# [5 \* e7 _- w1 I备注:
, S$ D; E$ B* S* @3 o# Y$ q* T, {( ]1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?* [* o+ x4 b. H5 V0 O- a
2、相关代码如下:
- j/ x) O( O R9 t" v7 f; X//UPP DMA缓冲大小512字节; Y* P% _; w5 T1 f# U6 N" @
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍+ N2 [4 n0 \: \
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT2 v0 f3 }1 i6 }% V) a
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
- ]9 W9 X* C. @/ U6 X# j! V: ^$ c! ?. R( B. w9 v5 W
$ d* U) z( x7 g$ w" v//upp接收、发送buffer1 Y% x! f6 Y; Z J, A# N6 R
#pragma DATA_ALIGN(upp_buffer_a, 8)6 v! R! k1 e( v5 M: B5 z
#pragma DATA_ALIGN(upp_buffer_b, 8)
- ~* P- U, d' l/ c- d2 T
' c% m6 @8 l) u& |unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
2 e6 R' k0 k& D! e6 e2 ^# Runsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];! d& N S- J2 d, H. B C
& a' `4 r u' B( O2 z k: {5 _ z
* X2 i2 A( q4 N/ @ R8 Q1 Z. {- Z; rstatic bool server_upp_data_recv(Server *server)
; u4 D6 f& D$ J! e w y4 J{: I3 B1 `* S1 H" S- `! ?( I! D' E
if(server->upp_channel_a_recv == false) {
J8 J2 @* k7 v% j; }9 T" k/ |% Z server_msg_send(server, APP_CMD_LOG, "upp recv: start");/ c C) s5 J# k* ~% @
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {) i5 ^) T% K- M5 k
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");5 w, [# X8 i- j7 u/ j$ \( ]
; n, B; D; @& Q' W+ _0 a R: x, T
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);8 {0 X, ~/ j+ l" Y: [; Q; k6 r
! a( U, l7 X# P server->upp_channel_a_recv = true;// X. f; |, k4 O8 ]( B! s5 N
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);( f" \* K5 ^+ e) _& r) x$ c1 _+ N
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;2 P' b( k, l" _/ c5 {/ V
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
1 ^7 \# d; N" K) ~; X1 H# g ] server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
X9 W+ n! n, [5 T, W. I/ S
9 T- S8 J/ @) X9 v upp_error_count = 0;
8 Y. v {8 X' [3 d5 t upp_dmai_int_cut = 0;$ |' r* p h! `7 T" o4 [9 M: J
* F' ^% L9 M7 |% |& w
// fill in data 0 ^: e1 L6 u# J! }" R3 X @7 Z
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);3 y3 h0 x) t1 X+ d
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");9 c l. d3 w0 \" r2 I0 i
}3 s- @; R/ E# R( I9 f" p
}
* j1 F( F: [ p* o else{
; ^+ A m3 Y, i- V if (upp_dmai_int_cut > 0){
9 O( C! E' B' |! M( K DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);/ H8 [/ J. s3 b: C7 _9 S
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);" i0 ], }( Q) Y! _8 O
! {0 J q. @8 T% v, C
3 y+ M: Y7 |$ h6 d! \ //copy data to upp_recv_list_busy% M; ^6 o! c5 }- Q f* U( k) {, J
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);6 [ ?4 ]. Y8 ^) x2 e3 S( a8 i
. G, @, g# }3 Q Q( b0 f* ^
//
" b5 T8 C) f; ]; N, J" g ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);6 N( J$ l$ `+ m- J4 A4 [ s
% ?4 h# _7 y4 d4 E# d& I# I. B
//
# K! e8 ^! a9 n, [ r P3 @1 G z server->upp_channel_a_recv = false;//9 q* n A7 ]7 y% O* w( ?9 Z
7 X1 t8 e# G0 g; P3 Q8 p0 g/ J$ ?1 p server_msg_send(server, APP_CMD_LOG, "upp recv: success");' N$ K) h% u, p- q" ?2 C
}
, l6 _/ M4 @/ k* u1 i2 J# Z" N1 @ }
3 F8 c, @& ~- n3 R* x+ D( @7 S/ W+ ?1 T5 A5 s3 m/ q; o6 l
1 j% ]' B% ?9 C return true; a1 ~* ?+ j5 e* H" E
}1 H7 a p+ o$ ]4 E, ^
! z% d- E* r: u& o2 h
static bool server_upp_data_send(Server *server)
; }$ Q( x% ]7 x; m+ Y+ }{5 y [# e; X( V# e8 K
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
! T3 |$ H" x% z0 a! E( U DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
& Q: n8 C9 Z) [, p, K3 s4 J% U unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
$ J9 i% }% V, g) u7 z a char tmp[128] ={0};4 O H* E$ Q! V- d
1 N4 T: o8 Y; N7 M server_msg_send(server, APP_CMD_LOG, "upp send: start");- `& n" {5 M# @% T/ J+ K
print_log(server, data, 64);' U1 R8 D7 b0 m
3 Z3 I, D5 ^& p$ \ //
" T& k) }+ W3 r, l/ ]# D memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);& J V- {3 D& j8 X
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
" @: L- p: Y& y5 @1 @2 B7 o print_log(server, upp_buffer_b, 64);
( m8 y, x9 B/ _+ U$ z
/ x" y3 @" Q* |3 B5 `" |4 B server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
! ]7 T( K S t0 @7 O server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; : W4 u3 s9 \2 ]. V% {! N
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;2 k/ L7 T6 ?% a6 v9 E- n7 T" ]* D
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;; f" y( K, P1 u1 W' q
. x. {& n+ M, d4 U0 h2 s! } memset(tmp, 0, sizeof(tmp));
( K4 I+ y8 i4 ]( x" n) A sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", $ Q1 H; K; J( [. C# l) r) v; ~
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
/ |5 s8 k/ k! ~7 c" R2 x5 | server_msg_send(server, APP_CMD_LOG, tmp);% s# Q+ ~' Q5 Q8 U
; n, E& C0 l8 z! U% |8 B
upp_error_count = 0;2 D0 y R+ V& N+ d0 |* ?+ q2 S" ^4 n
upp_dmaq_int_cut = 0;
+ D5 z6 o9 n$ n$ x! Z // fill in data 9 n2 i# L K$ G6 x3 D2 f
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ) d2 e I7 ?8 `( u4 i6 E
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
P9 N+ M# s8 C$ \5 ~9 m
! m, _9 m5 S- B // wait send success
8 T# Q$ @% y, ]- K/ G( \ while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
& w$ Q/ {6 [6 L2 s3 m4 f7 R( y, S; D/ Z3 I' v0 f5 R( _
// make data node in free list ( N" R- x1 D* I$ u0 l, t# t" ]
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);% }' ^, M7 ~, ?$ ~2 }
server_msg_send(server, APP_CMD_LOG, "upp send: success");& ]4 r0 x: w4 ?5 r( D4 Q) U2 a$ F
}* O; c! s* }0 S
return true;
' C) ^5 X, q* @+ T: \}! s6 V; r' M0 s0 O$ Z
, W" f8 ~/ E+ d: T' q6 A$ L0 o) c/ v8 N
( k, c7 h8 u% h5 v& a
- N8 v0 R9 d; i6 U5 @
. S$ t0 M8 I) K) b" w4 Y2 S2 H! T( r" S f8 J( O( z! l* P: ?) u
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|