|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
! I" j, p: K' M$ E4 z. \
8 }& \6 G0 s! e; M. p7 F+ v问题描述:, ]0 @/ E; |/ t
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:& D+ o$ Y3 a9 x& Q* I+ E
0 r# ], `* n( e# z
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
8 B/ h2 y; ~6 j. |: j0 C, r" J! t5 w9 N0 @
测试结果如下:) X0 @4 U, S9 y+ f( v3 K
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?: P' p6 @( ?+ h+ M& t
9 K' y. C1 z- a0 O
/ I( t( X8 d# W$ t备注:0 Q Z8 k. A* ^6 M* q. r
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
0 \8 m, a# }3 o* o2、相关代码如下:$ D! Q5 [( J0 H* v5 Q
//UPP DMA缓冲大小512字节% M# ]2 x1 \ t. ?$ `( S2 b% l- P
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍/ c4 Z. x6 j* o/ _3 V/ {& k- v
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
# @1 Z+ S+ d, g) q6 F( {#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)4 p8 s: w3 K# R0 J0 j
% c( T4 N* l& q6 p" z$ T
: C, P0 B( d8 U//upp接收、发送buffer6 l" A- M l/ P/ ]2 ^' }
#pragma DATA_ALIGN(upp_buffer_a, 8)
8 l3 P' I- x+ t% Q9 Y Z. s#pragma DATA_ALIGN(upp_buffer_b, 8)5 k, [, J7 G) u5 b- w, B
" _- {3 _9 M" q$ h: y5 ]: a
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
7 {- D$ r, B3 u4 Aunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
) k$ ]7 \. `' x* V% J3 {( }: b- f8 m
& O( Z K+ W4 g% ^8 j- Z: \
) p2 |$ w' w- }7 B5 mstatic bool server_upp_data_recv(Server *server) / h% B- F9 X0 `" f( F0 s
{
+ f: V- ?, S6 t) ~1 E if(server->upp_channel_a_recv == false) {
9 d5 B. s7 L) P$ @ server_msg_send(server, APP_CMD_LOG, "upp recv: start");
% A$ ?1 | T& L/ ]4 b& L$ G if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
0 J0 E Q) G4 J5 D server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
( Y8 \8 [1 l3 k' |0 f4 M, b5 o* [% j. m6 O& v* n% y
) W" y6 b/ i7 I2 n( B memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);, y, f8 e% P+ Z
& c4 p* G9 ]" i server->upp_channel_a_recv = true;//
. T J/ ]+ o1 o# l; N2 i# I* V6 T server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
7 _- ?) `# h7 T5 i; I6 h% v server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
0 d- s$ z- n# Q! W8 Z& T6 O: W# ? server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
+ d8 T* S- |' b/ N- z' N* {4 L server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//8 r! y0 e6 J! R8 ~7 I
+ J3 N, U" e. D. b upp_error_count = 0;! q- B/ W6 ~% p- i3 e# i
upp_dmai_int_cut = 0;. U% ~0 C$ Z, O" R0 ~
- f* Q6 I o ~3 Y* @
// fill in data
: S. d, C# Q2 S$ E1 A$ b) }; T8 g uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
2 @8 ~9 d0 d* S. h8 h& T server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");9 O8 T; m! A! U- L- Y
}3 s( K0 s! c* D+ M0 H
}
# G8 K3 T; |) `6 c else{& j" u, [' _; v6 m2 L
if (upp_dmai_int_cut > 0){
2 r' G, U3 G! f, V DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
) J4 i5 F' v& P* m7 z7 q9 ` Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
) T! ?2 k1 G( I9 c; b& Z& F( i8 R" P
. n* R" G9 l. ?/ k' }1 X //copy data to upp_recv_list_busy% z J1 q8 X1 c7 {- \. w2 E
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
4 s1 Z6 i- V, e
1 l8 H9 c; t( B9 K; e! n //' V; U; N6 j% q& Q) _3 w
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
7 P. k7 F4 _0 h9 K
& w2 l7 u5 ]7 {5 o% w. a //+ _3 d1 ?4 k+ n
server->upp_channel_a_recv = false;//' ~7 q7 f% L% C2 z6 H
$ ?2 y" X& ~: F p% U: ?! e2 m' a4 E server_msg_send(server, APP_CMD_LOG, "upp recv: success");9 N, A+ }( k: y3 j! {; R8 W
}
( _+ I- k1 j0 L* [; A& l4 i, { }
# k5 E0 N7 `1 Z- }1 j" L0 ?3 E6 Q3 S7 Q0 w6 x+ n6 R' x% e
( g/ c; X! F+ P& F) `# D return true;0 j& a8 u |1 c( p# j2 c
}& |# e; l" l! c1 Z) i0 F
. a+ b. g- C5 q# X9 M" e$ F& I
static bool server_upp_data_send(Server *server)4 V' |$ Y! I8 D& I: Q+ k. u7 U
{
' W7 B8 ^- n( c1 R9 S+ s if(ListMP_empty(server->upp_send_list_busy) == FALSE){) J) y: }4 j, B7 }. u6 t; H- H
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
( E+ }1 y4 Q& P; a$ U6 }$ g7 ~ unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
% ~ ^: x: N4 Q. p8 t0 C. _ char tmp[128] ={0};: Q/ s' @1 `$ v5 J6 b
- `8 `" O6 r* }$ t% R server_msg_send(server, APP_CMD_LOG, "upp send: start");# y8 U0 [3 D9 T. c- O$ X
print_log(server, data, 64);
% l9 b4 z2 O" e
+ S, @: N' S: R //
7 i! h) @# K% B4 r, `( `9 e7 P memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
; s3 _2 Q% t$ _# i/ s8 j' U memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);1 J/ z1 ]: D5 Q; q `
print_log(server, upp_buffer_b, 64);
- X1 ^0 F2 [6 R& p$ j$ P+ i4 X/ I+ B
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);1 @: z' z" ?. g' g& x/ X$ y
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ! Y# e) n- q6 E9 D' N
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;+ W9 T& v9 }; u! }1 e& U
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
5 ~3 R7 Q4 E) X# L& r1 p
- l. L# ?. m( M: x9 P4 S8 P memset(tmp, 0, sizeof(tmp));
( j3 B; F) k/ E% M6 F4 ^) d, { L sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", : y) b# U1 ?/ x9 [: ~5 G4 {
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
$ W" f/ C+ V5 @; W* A( f4 s+ b server_msg_send(server, APP_CMD_LOG, tmp);
: Z! M# O. l/ d% T, N: l) C% `8 ~- B) G/ R
upp_error_count = 0;0 M; ^! w! i0 t6 A* {* {; ?1 D
upp_dmaq_int_cut = 0;8 I+ G- _6 f! c3 f9 {
// fill in data
4 L1 Q' l% \- i1 r+ R uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
7 m) X. F" g1 }$ B% d server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");& r$ Y8 _" h. W, r n% @
) e5 f* `0 \% d& S // wait send success
' ^; X& c% e' z# a while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 2 T, ?2 y* I# E0 g+ M
5 a9 x6 ^' B- p- w. E0 l! Z // make data node in free list
& N/ x1 K. S! R ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
& A1 @7 c7 D3 d- s" ^% I" J/ L7 q server_msg_send(server, APP_CMD_LOG, "upp send: success");$ x& X, _3 f) N% { L
}9 M4 g0 `( g+ \" j' m( p
return true;
1 F' c2 \. [8 d5 ^9 ]8 J/ o}5 ^6 g! Z8 P: Y2 e' [ E6 @
% b9 L8 ~$ {8 M5 ]1 b; c: K
}8 H1 b! K) K" s; @+ R% {% W2 f
+ r( z* K# i4 Z- N" z0 p1 f
. f5 M# s- o: C, k' f6 |$ [7 Y
* l3 ]0 D. j9 S |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|