|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
9 z# Q9 C1 m+ R- p: O! Q2 c# ]) g' i
问题描述:
2 f3 t+ r5 y# w: u( H在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
- j5 ^6 B; c- b* P
9 B1 |& G+ ~8 ?5 k% s图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。# r( `% S/ Z+ w4 U! K1 r, a2 _1 R/ G
* E( A' e* |; Y$ L- u
测试结果如下:, b% E1 e3 ~' z0 Y2 S& u
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
3 f* F& ?& ^7 K6 u4 G7 s0 d0 X
" }+ b' @+ v' F3 K/ O# o# d; b( W' y& I
% |! t; g" @6 h0 h9 u; u备注:
7 J; u! m6 \ u1 @1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?" Y/ h& N) Z4 ?% i; o
2、相关代码如下:2 p: ~0 o# G' c4 s! k; H! \
//UPP DMA缓冲大小512字节
3 s% \# d: P5 V5 C+ n#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
+ D- w7 {, r, a) K#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT2 R3 Y( f' X7 N j" _/ e4 W$ G
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)! E& P1 Q3 T; G* q7 U. _4 ~% b
: u% i0 q: E. |- B) {
& d' J+ a$ ^) ^- O//upp接收、发送buffer
+ W9 _7 R" o9 M) S1 y; P p/ [: }#pragma DATA_ALIGN(upp_buffer_a, 8)
: F! B5 } S* N# ^#pragma DATA_ALIGN(upp_buffer_b, 8)
4 q; k, a7 {. p( ?4 |- x1 y5 Z# J
1 ]7 F1 G( s. S) H! C: O nunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
0 Q# f) ~0 ]& |+ d2 x; c9 M7 qunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];9 c2 v6 W( i8 n
^0 `& D8 c9 M% A7 W! e S# E% c# R( `
6 N+ Q; Z K2 j& B1 w, l) E( dstatic bool server_upp_data_recv(Server *server)
& x8 y' z% k$ G, {{1 V+ I" ?4 v; L6 N, |) b4 ^9 A% r' g% \ |
if(server->upp_channel_a_recv == false) {+ W- W L! F1 e2 M/ \1 P* g
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
0 G' D4 x/ p( ]9 P- G if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
' @' n5 C2 u( O! f+ U server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
# I; n$ H' b' q( ?' t* K; J( P! t- s6 z, n
5 Z# e4 _5 G/ @/ W) I* N7 X
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
" o* ~: l j5 i* J6 r
7 v4 d7 v' r, T3 {' q, E server->upp_channel_a_recv = true;//0 {( y/ \% b& V7 h9 d ~
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);; s: m3 q4 `. S/ K2 u% u6 |
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT; D p+ f2 n7 w7 r1 C; q7 f
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;4 C) X( Y. o5 M/ @" S6 z0 l. g
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
# Y$ N6 p* l" l- ^. r3 n
* r0 W- D/ p8 `/ O* P/ |# v upp_error_count = 0;& f- `8 s% G, b p; v
upp_dmai_int_cut = 0;
+ k2 {7 F. b& N5 o- D; @
! j& x6 Q, u6 j% ^9 ? // fill in data
' B# r6 A& T, K* c( \ uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
4 N$ c. H- u# [* U8 T' _+ O server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");: \$ n9 o% R/ O$ H% o' H
}$ _9 K1 V. W+ Z7 z! S" r4 j
}+ X+ h- B# S$ Y2 \9 J6 l
else{ w3 p' h) {+ B6 ^* n
if (upp_dmai_int_cut > 0){2 v0 m4 j2 S. {' J
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);4 L% a1 a5 u" y3 W u* I2 _
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
2 w" j: G/ b' x
5 h. M" }$ l, M: |( X5 K3 n/ I* C0 ^
//copy data to upp_recv_list_busy
2 y/ C- m6 I& X7 m7 \9 V4 @ memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
e( @4 S9 N4 @5 v0 @1 w1 ]) H" [ P4 l
//% @4 B7 [3 g, w! z; V% u
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
: U8 W; g" d v2 l( n5 ]5 ]8 I9 W) i8 |8 g5 D# V
//
6 }8 Y+ O2 F+ G' M server->upp_channel_a_recv = false;//8 g( t) k5 T/ a1 f( j
" y' X1 h0 \; i4 _0 D server_msg_send(server, APP_CMD_LOG, "upp recv: success");
( [5 L6 t3 Q0 n" Z: \+ s7 [ }) |$ F+ ~! r; l$ @
}% c: ?1 r# B7 N& j2 t6 P! l3 F: x; n
6 E, y* I/ ?8 A+ _( H S! j) q
8 H" X0 O b* @+ D- @( G, q return true;+ S4 w# [" ` i) a9 }: x
}
! C! b& d$ @ p' J& b+ v9 w2 [* G& z" G1 e
static bool server_upp_data_send(Server *server)' H5 [6 l9 e# _, N" x: I
{
6 f+ V- n$ l% v) z if(ListMP_empty(server->upp_send_list_busy) == FALSE){
2 ]; n* @% F9 L, I$ i DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
2 P) ~1 z. Q- v" u1 r$ v unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);" R$ h4 I# [3 a. C, W$ {
char tmp[128] ={0};
) u9 R; u l3 y O2 K! t$ M; a, X/ w7 d8 }& U
server_msg_send(server, APP_CMD_LOG, "upp send: start");
# h: A v( w! O print_log(server, data, 64);
2 {; K W8 a5 k7 r% s( S; w% S! E$ p- y2 u# z2 r8 D+ i
//
/ ?1 t# z8 s. Y0 G1 ], b4 g memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
; e( K; K" A$ t7 J memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
0 T. j' _- d- d print_log(server, upp_buffer_b, 64);) b- s4 e+ J3 ^: ?; l7 N3 F; X
9 p$ N; m: r" c! a, ]
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);+ F K. j' t# s* p
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
% M! G! @0 L; p# E8 d server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;+ q) q/ x- H7 _
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;, B# \4 Z4 q% m# y; c, o" `& ]
5 ]+ V) m, O( r$ n; Q1 F
memset(tmp, 0, sizeof(tmp));/ g e8 \+ }4 X
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
3 P9 @3 @, h) N8 p4 m( I0 U' j sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
5 X3 E1 }- d4 h r server_msg_send(server, APP_CMD_LOG, tmp);
4 X' a' n K4 t0 C* v' V
4 S8 V1 }8 w. C4 K3 Y }$ u5 g* S upp_error_count = 0;
9 F( H* V' n! H. a7 h upp_dmaq_int_cut = 0;( E* B; Y! A. K; O6 Q# ~6 ?
// fill in data ) t4 |+ i/ B; W: W+ `
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
6 q7 Q. y! t( ?) ?9 b$ w server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");8 E8 G( e" N' \! y( `, z$ P
8 _! L1 f9 l S1 ~& k; z
// wait send success
1 U+ p" [+ d0 y$ A; V1 d while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
1 \1 i F$ v% c" j# _( a% |! I2 u1 ~5 k+ P
// make data node in free list ; S% ]. K: y8 ]# w l* o- ?# {) _) D
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
$ H6 C$ N+ K+ N% `' @; f8 L8 ~7 ] server_msg_send(server, APP_CMD_LOG, "upp send: success");
) Q% E9 Y5 e5 O6 V Z, X# h4 ~ }
: O# s: k% ?; v* U% P3 f) L' k- p return true;
7 H" |/ [1 C9 ]}
0 v( _- e! \& J# y0 i8 _& D( v# P$ ]
( ]5 r( }2 K {/ r4 P" Z$ A
- L( i6 n/ h+ `
7 L7 Y! G0 @+ G; f
, ]2 F0 P6 ?( ?
4 ], b3 u% u: D7 V% {8 x! O5 z |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|