|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ) Z0 {, J+ t, d* a3 ^
4 ~- n9 h/ D6 t' M2 f$ U/ C3 [* C
问题描述:) V# \/ s- C' @4 J w% _/ q# B
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下: K/ A" E4 ?1 h, H- \) F
: R0 K! z2 [; e" `2 m1 t" L
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。, N" f$ e4 _1 n9 n' F% y
' W: [) W. G% Z, S9 X' y: s测试结果如下:# y' j. x- q8 q
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
6 d9 _, A6 A0 P8 r1 ~- |$ p+ Z9 @
7 m+ x6 u$ t( I
3 U! k ?$ f1 J. ^% k* P备注:
3 m0 x! E$ r! A& A1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
; F7 X* w! M# ?' o9 c& z/ |0 N2 ?2、相关代码如下:
/ p+ C% h4 b d5 V7 ~1 i; R//UPP DMA缓冲大小512字节% j8 n+ Z& w. C
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
6 \2 R+ ?% c/ G! h0 Q: v#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
( D D+ J1 e: o5 k8 f#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
4 I2 i! `) i8 K, y4 D) s3 Y t6 [ s5 ^
; k# ~: `, U5 Y P: G//upp接收、发送buffer8 E8 h& _& E8 m' p# ?1 { C
#pragma DATA_ALIGN(upp_buffer_a, 8)
3 b( O3 y) a7 F#pragma DATA_ALIGN(upp_buffer_b, 8)
, x6 s$ {1 r: q1 ?2 ]1 Y3 \
9 p' \5 |1 }4 A) v4 l0 H2 Hunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];* K7 \" @% X7 C: H7 {" d4 B2 o- R# L
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
" L ^+ Y& X2 l! e6 Y
0 X8 J# a7 ?) P% n
+ c/ K- e! S R8 F+ [ [) ~static bool server_upp_data_recv(Server *server) & R2 i& o( j8 Y; _, d$ B* M% h4 _
{/ r( G, B s: a0 @3 D& B
if(server->upp_channel_a_recv == false) {
" G; K- M4 v7 P& g* y: W f server_msg_send(server, APP_CMD_LOG, "upp recv: start");
; y+ j" e5 n2 R; _# { if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
8 d/ P$ a% R/ |* d9 u. Q server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");9 z3 B0 {# E. F* V$ U2 b
! _! h# U6 q$ X: Q W
" C: }# m: q8 v- {: i8 ? T memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);8 @' `4 ^, e. D- N% z$ n5 t% h
( p5 L" b) v2 s0 w; Y h8 P) q server->upp_channel_a_recv = true;//
; a& | {% |9 P$ b server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
+ ]- p/ {2 a7 i2 R2 A8 ^% g server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
7 o! _' z3 `9 Y+ n2 L1 c3 x server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
3 |# @) y+ o$ D3 c/ ? server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//' n' {" v8 u& a- U
. {) ^ ~1 S) ^5 n2 o
upp_error_count = 0;
1 f9 h: ]: q% }- d( A/ v/ v) C upp_dmai_int_cut = 0;0 {" _/ i$ S7 ~7 ~! _6 {/ h
. P' t7 F4 X: x0 h7 g+ ?1 _, }8 R // fill in data
/ K/ w1 I8 O8 P; R1 l uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
% Z2 O: |+ p5 x( v1 q9 K/ A( ]8 p7 x server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");8 {2 x, z6 x0 f" w% q
}% ^: y: c& o2 n0 X
}) Q- Y) I0 K A: R& d: C
else{0 F4 m2 M0 `9 D3 x; P" P* i, s- C
if (upp_dmai_int_cut > 0){
" {- J3 g% S l6 X# r DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);& _) R! V; y6 H( p3 g# j9 I
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);6 Z8 J1 L' ]; w( U# q
( _7 I1 S5 ?8 w+ o( t) W# r+ N
/ A) k. k: v' s4 ]' _ //copy data to upp_recv_list_busy
' e, X* v3 X. v% \4 T3 Z% E6 e memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);8 I, o/ |6 [& Z& P$ z- V* i# x# @
( d) T, h0 @0 z/ ?
//
! w, G+ A. W& G& V/ r- e ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);2 Z5 A6 v( ]1 x7 O1 t& Q0 T( r
; s. ~* I& v" p7 i1 p7 J7 C //
8 |- f' V& K7 h6 e I3 F( `" t( r server->upp_channel_a_recv = false;//
) P" @0 L) D: n0 @6 I/ @% Y0 A
0 S$ k4 z4 `3 }4 u3 j2 w$ z server_msg_send(server, APP_CMD_LOG, "upp recv: success");
- j* k4 g! t' e* Q& I1 _ }( H9 `- k" ]; B0 E& |
}( u/ s: F" m% H1 O. O2 [- }
* ?# L6 }% X6 t; i0 I. r0 T
1 U( @7 {, Z3 C4 F7 D8 Z! y return true;$ u, A1 B# l& p" `7 F* I# ^4 d
}3 g7 x& r. R7 x3 ~; b% N
3 g+ {2 i( ?5 K: l6 L5 A% Pstatic bool server_upp_data_send(Server *server)0 p( T0 b r* K& L
{
8 w P0 k+ I* X; X+ l2 R if(ListMP_empty(server->upp_send_list_busy) == FALSE){
8 }1 q' D8 c/ ^8 N. ^" O DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
6 l" V/ d! y; \& ?5 T; n5 C unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
; I a7 I5 n' J' J( E( w char tmp[128] ={0};, h! E7 H8 B8 x( S0 |
% v9 R0 F* S3 t3 Y- Z# n# K server_msg_send(server, APP_CMD_LOG, "upp send: start");9 D$ S" i* W1 S
print_log(server, data, 64);
2 Q d% `5 F8 y4 w( W$ J
! M- t4 }4 t' m+ y3 O( Q- t. k //
9 U. @% A( n- g7 D3 \! a' f3 l memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);' e3 f% `: ^: S% N' k7 D0 q
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);1 T* M0 K0 N3 L1 n- i0 `
print_log(server, upp_buffer_b, 64);
* X6 ^/ s U( M- ?# e
3 B; O! K6 O% } server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
& Z0 X: {2 d) H$ U1 I: j! h% E, D server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
0 J+ O2 g* C3 W! e server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
x: B3 B( S- A server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
: W5 c }" B- m0 D& j- P
$ Y8 z9 O. u" _$ @8 J memset(tmp, 0, sizeof(tmp));
4 Q+ _$ H+ g0 B) A- S P" B sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ; T0 R6 @6 V5 T" i
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);) e# t0 | a2 i+ D; E; M1 t
server_msg_send(server, APP_CMD_LOG, tmp);
) z1 q+ I7 g9 Q- K K# m
# T7 Z; q8 H/ v v upp_error_count = 0;
* u% h% S4 ?$ A, ^3 i4 H6 i upp_dmaq_int_cut = 0;5 R6 P! s$ S# B K ~+ B
// fill in data % q4 z, H6 v' f1 w# d
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
N) x/ f: B7 k: W% A8 P server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
2 J( `5 y/ n# f4 m$ W8 E u* y/ _1 R, | {. n1 @: m; n# h2 }. k
// wait send success
* j4 N' R! u9 v while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
4 s) o- {' |* R' ` u' x( M: v( m$ t4 C* M
// make data node in free list % {1 o0 b0 o6 H* _( B" M
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);3 N m" n- }8 R& i
server_msg_send(server, APP_CMD_LOG, "upp send: success");* v9 n! Q2 S7 u
}: d6 I! s% |8 [
return true;
N; Q A9 Q: b: a: `' w}
# ]/ @# w% \2 Z9 C. p8 e" f, Q# j5 b' C' W6 B4 p% d# K
+ O( e1 ]' I$ `9 b
: s8 B5 x+ @% {4 s$ b0 \. h( N+ S& P5 q1 A" ~4 o3 v
s3 r6 d& R2 N( y
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|