|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 . D4 l# R( U0 N
/ p1 G. H3 _$ b' j问题描述:, Y$ ^( i' P1 h3 E+ @
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:9 ?. R& q- p1 i3 \) i
7 }# C& d b9 ]# f' v图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。# ~" [2 E$ `' X: u
- _# H4 y4 O; S. [/ c
测试结果如下:
7 h9 W- H" q ]* {138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?1 h9 R, c/ E8 f: q9 y3 L# w: A
- j3 H7 }1 L4 e$ }; N0 J
}, g% m8 y- t. g备注:
" R/ w3 O' r# F5 }1 w1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
0 U9 c9 p7 L0 h g8 k: c5 j2、相关代码如下:8 R9 g4 R r" d! I, P- x) C6 q
//UPP DMA缓冲大小512字节/ B3 g: q. r1 K) Y, k6 @
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍9 O3 w$ G0 Z( i+ [! K7 H, h
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
4 n1 \: j! _+ S9 l: W% y: w#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)% g! X3 i8 x% p* ~4 Z: x
2 Z) N! U. I) z- s2 B j, o0 X! t
" ~6 V; p% f& ?
//upp接收、发送buffer& T& D4 F; T2 m* A. N
#pragma DATA_ALIGN(upp_buffer_a, 8)& m# \9 X7 G+ K$ V$ W+ d
#pragma DATA_ALIGN(upp_buffer_b, 8)
. V) V8 q& w4 H) S% u: c
" L# L! j# M3 Y5 O2 d* tunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
- o$ _3 P1 L& `0 c8 T1 Punsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
8 V3 ?( A7 Q+ W4 V4 B! \2 l0 A- g$ {7 ]/ G" o" D6 g9 r
' Y8 e7 s/ I& M, A" fstatic bool server_upp_data_recv(Server *server)
! R- I; X9 t, Z{/ Y6 Z! e8 a1 _4 h# B3 l a
if(server->upp_channel_a_recv == false) {% @7 p9 i% y( A7 H
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
/ _3 ?: O6 D' O* Y0 @( n! F( E if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
1 a% C5 U5 ~; m' w: N server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");% j( ~; c0 S- k% C. y
, a5 ~/ l' P9 P+ M, w; s
/ m# h: `0 v+ \5 _ memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
; S$ E$ Z& x+ r) N" ~; Q3 r; g: g1 J, i9 w( B7 l, j
server->upp_channel_a_recv = true;//
. x1 [* W( L' d( x/ M: ] server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
3 X6 a1 E- d2 t. I+ e3 l server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
$ R) N" n. w! @/ |, O server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;: E- p6 r1 O5 e6 O1 ^3 N: ^) ~0 Q
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
V: T8 r0 G1 Z# A% a
. Z8 ~9 S( Y+ E1 T' i upp_error_count = 0;8 [$ @+ a5 w% n ~
upp_dmai_int_cut = 0;2 I! x! I- j6 f4 E% k5 _- j
+ V- a# P. @$ D8 X$ G // fill in data
- u& b* x7 K2 J7 Z' t; u uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);" i) C3 n! k% _! P
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
) k/ F1 @! l$ x }
0 s0 u- l D2 Q2 ]% F% L }
! p& @6 K" n2 j else{4 ~* N, ]* K! j& N0 H) W
if (upp_dmai_int_cut > 0){! y& t0 l, S5 Y
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
2 S" C: s) ~( G. C7 h9 C Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
; |. x D2 `8 b. ^. k* h
! u h; w/ `/ J& g& f# _5 z2 x
. R( V7 r; n# E r3 ~. d //copy data to upp_recv_list_busy* L) ^- j$ P4 W9 @
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
1 J/ f( h$ L7 x5 ?& \4 K* L; I3 z, s! m7 I
//4 S# Y+ B* E8 A
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);+ Y" K; H( \/ L6 u3 U7 v
4 o$ }) _$ M" R4 u
//( O- ?' q# I# l% c4 {
server->upp_channel_a_recv = false;//, L9 l$ o' [/ s4 T/ u
" D( _" n h+ R6 T# o( _ server_msg_send(server, APP_CMD_LOG, "upp recv: success");+ K: _1 z* I6 B9 @
}
% S# \5 \* ~7 I0 A! j( m N& D% N }
6 P, [5 L6 l4 v6 F+ D2 E5 | p, M: @) P& e1 u2 b' Q$ H
' N, {$ T+ C2 Z+ n# j! T' @
return true;
: ?7 A9 L8 a3 R9 ^}7 T) P4 N) y: e* [) j2 r
3 L3 i8 ?5 a! d5 u* M1 S
static bool server_upp_data_send(Server *server)
+ X/ n- j1 m/ G6 `) p. B/ L{$ f+ x3 I, b/ `/ `
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
* L5 x6 a9 R+ v6 E6 \$ F8 ]' T DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);: @. L% W9 q" }) v
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);% e6 ]2 g: g$ G9 |- J4 ]" i
char tmp[128] ={0};
- q0 A7 k4 J1 D( ^( ]- J/ j4 z D. l
server_msg_send(server, APP_CMD_LOG, "upp send: start");8 @2 I" C, h5 J, L6 e
print_log(server, data, 64);
: H$ [- W3 L( P5 P/ T$ c4 l: ?( `( M( D, I" T3 T! A
//
8 N6 m# n* \/ R( u, y( t0 e/ K memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);1 J8 P, P" w% k; q0 A( z
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);- j$ a, q+ |/ V0 A* O7 T. B
print_log(server, upp_buffer_b, 64);
8 i4 p9 k, }, P( |0 K' e+ z% E, ~3 a. u4 e
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);( N& z- l9 A' O7 r! ]0 B, u. z
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
1 [0 z+ o6 s/ Z9 [% J server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
3 c4 N9 t0 W5 I) v9 r server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
' Z& R0 K7 Q# a) q
# t `( a/ Z- C8 C memset(tmp, 0, sizeof(tmp));, w- i9 \# n1 Y% Q4 A* \% ~! {
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 3 ?1 \3 m# l) A
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);" T2 }0 J( Q' y1 T: ?) d
server_msg_send(server, APP_CMD_LOG, tmp);0 G5 _2 o) k. ^6 q$ T! l) K1 s
" z2 Y1 l+ S) [1 K, e' x upp_error_count = 0;3 j G! n1 O& O! J* r4 a. a( p
upp_dmaq_int_cut = 0;2 v* I) y' V4 H# q$ i% h! Q0 ~
// fill in data 5 t x. N6 C! S1 z
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
4 o0 J: P. i: ?* |; N7 \: c server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");3 I( y+ {, V) V" ~4 U9 n+ B
* j! [( q3 y9 G0 e // wait send success
% `/ ?# L2 ~6 Z1 K9 {" l: l while (upp_dmaq_int_cut < 1 && upp_error_count == 0); % t* d: }, B! w
# C! h+ x1 w& r& o // make data node in free list
+ I% T' e$ U& [ ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);; Y; N( l2 {6 P/ N& S4 k
server_msg_send(server, APP_CMD_LOG, "upp send: success");
9 C' h; p* K4 a- D+ {9 x- \2 m }
4 ^& y* I! f J6 G+ a! V# ]2 {/ ] return true;
3 J8 v; \2 H6 O( H: h/ B) t}9 G8 Q' M& W+ u4 e- H9 T
* C/ s n8 o1 t u2 B# V/ n0 e/ X# B* q J
6 X# }3 r$ T% t0 Y0 F: I/ N/ }2 {- q/ n. m% G% x
! j* h; K# t, H o# m0 F( u
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|