|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
- e1 W' x6 f' v* r) ^% z6 ]: i7 z0 x8 u% x0 z
问题描述:
3 `* E1 o; ]; D0 b在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
O, e- D& T& t5 g ~* z) u3 T- Z( C8 q1 Y" [: {
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
# {4 H8 |7 e; k0 j% K0 c* D# v+ J! a
测试结果如下:
2 @2 i; h! ]9 X8 b2 A138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
( }3 O; c8 l" Z4 l% o3 R. Z0 D) k- f: N$ l9 J1 \+ X6 i6 t
! W& C# }5 V: G备注:
( E5 s: `% U0 f3 Z/ Y y. ?0 a1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起? P6 V+ H4 e, s* ~2 F8 D1 `4 x
2、相关代码如下:* t; |( S7 C/ @
//UPP DMA缓冲大小512字节; v) m7 s5 d5 \2 w
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍, _0 A) O: @% u/ F1 b
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT( x$ c1 f. m x/ z& }
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
! F3 r: N) X/ ^, ~7 N# W5 B. y' Z% Q }0 R+ k+ I
$ Y9 G. V9 @8 v7 Q( A//upp接收、发送buffer
/ u& Z; h. C1 g" q% `#pragma DATA_ALIGN(upp_buffer_a, 8)
. l: b4 P9 E8 ?# X1 x' J7 u6 o#pragma DATA_ALIGN(upp_buffer_b, 8)
& i* p, s% \% K; a* U
# P2 G$ F1 B( M* I) |unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];. ]$ u2 u# {7 r4 w5 f! n! r
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
5 u. u6 V _2 B2 e1 Q
% K6 M# Y2 f' l- U
! z; u+ v# ^! u3 t$ ?/ F+ ^- Ustatic bool server_upp_data_recv(Server *server)
( x: Y F5 n p: `+ Z3 S0 v{8 d' ~( N) `2 w' S8 R. P: t" I6 G
if(server->upp_channel_a_recv == false) {& n9 D; f* A- \* Y9 i
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
/ c0 y' u& ?3 h9 m7 R1 e if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
6 g9 c" b0 r: b J: b; Y' f server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
1 K/ V+ C% f6 o( _8 O9 s
4 c+ y! k+ Q5 C) | g# g$ z, m# m8 \! `
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
' z" C3 i9 N6 k8 H! x' V! L3 y2 Q+ [, h' }7 z5 }% ]# f2 }
server->upp_channel_a_recv = true;//
9 K3 U9 Y4 F+ [, S9 T server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);/ y# G& s8 j" l: I- A
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;+ Z2 M. O& z V5 x% s- ~
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
& V6 n! U/ O0 ?9 Y server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//; e1 \) B- V% O. O+ }0 U9 S
; ], \' D6 Y0 ]3 ^
upp_error_count = 0;
4 f$ @7 l1 W$ `8 J upp_dmai_int_cut = 0;
* Z3 E/ F8 L# a Z! T
* u0 \' Q+ W) K) _# b0 P" a6 F! u // fill in data $ a d" F( L* F, f" Z5 [; w3 d
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA); K q8 L" o, a% d- ?0 T
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
3 @, e' K9 ~/ r; O- I5 ? }1 r" ?2 s6 N7 k% H
}
. e9 Z$ d6 ~ k, ` {: c else{
d4 y3 _2 v+ x. _! I9 C if (upp_dmai_int_cut > 0){. D6 k1 ~* u! o7 T; v
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
) v/ B8 e: Z+ ^2 U6 h$ H Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
# s( k/ U; G! ~$ u" |
+ t+ J" Z) {2 ]
8 V0 y: R f8 g0 Y- I/ V } //copy data to upp_recv_list_busy
9 P5 D, d) V3 v& t0 L3 M- T memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);2 K+ s' N! m* l& u& h3 @( v
2 x4 V) H3 `8 `
//
1 L( D& o8 D3 F. A/ ?, h2 Q ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
" U H; Y7 l9 Z0 j' n+ x( C& u5 c) D# D# a l& h
//0 C% F2 e* s- Y- v
server->upp_channel_a_recv = false;//
: J1 V$ A3 n6 J( T7 ^1 ?7 T8 [
& {* N! W! c, ]; ~0 Y* s* s" r: m server_msg_send(server, APP_CMD_LOG, "upp recv: success");
) i) U0 B' b) i( X1 i* A, W } s! |' i2 m: D" I
}1 {+ w7 w2 t# S, M
t' l1 [8 s3 M2 {
$ Y) j1 h7 a4 d, k4 k* e+ P return true;" t# X' E2 j. L" k. k l. y4 c- ^
}
7 C! M; g7 M8 S$ y# e5 }' M! T, d, `
" F. c$ Y$ h2 y- d# s& Ustatic bool server_upp_data_send(Server *server)
% V9 }- v2 x4 X1 Z{; A _; \( \' \* ^" N
if(ListMP_empty(server->upp_send_list_busy) == FALSE){4 l) V9 V' e. y3 A2 }* j
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
; x0 K S" g' s) u' t2 @ unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);. [8 M% }) D7 \0 D
char tmp[128] ={0};" w% T( K) ]0 B
: J3 e8 `4 N: l" t- y0 p3 L( t server_msg_send(server, APP_CMD_LOG, "upp send: start");5 m2 a; F" A: r3 g/ B0 t' _% J
print_log(server, data, 64);0 W3 J% s; M( u ^' a1 }
: x) D7 i* g+ n //7 c& o* Q& j U5 }7 H
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);& O# K( U4 n$ A6 k! w' Q- O, V- z
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);8 H6 Z2 f( O+ E n
print_log(server, upp_buffer_b, 64);
( R) ?3 f2 ~2 u0 N7 |* @- G* i5 ^ P) g8 p! v3 v8 A; ~
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);" |& Y9 k- ?0 @3 O$ D+ o8 Y
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 4 d% P, d( s$ Z- a% N% g
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;, U g$ {. k, l' g$ i
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
+ Z% W' f' J7 m/ \9 w5 W/ z9 D1 \/ Q
y1 r, V) D/ C0 f4 [3 F memset(tmp, 0, sizeof(tmp));& u- Z; ]" r( x7 N
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", / g5 }. Q' F- s% Z, x( m9 x8 d
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);3 C3 @, c/ a+ i& O/ h# Q. Z
server_msg_send(server, APP_CMD_LOG, tmp);; s! `2 Q1 E- c$ h" A7 E
8 X4 r% X* F& S2 \* t# Z7 y upp_error_count = 0;
& J( h5 x0 ?! V0 M4 L% a1 O upp_dmaq_int_cut = 0;: j" q* w; i7 q7 u! u7 D5 b
// fill in data / z1 f: }; W9 j- \5 K( r+ K& Q
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); # F. X# H& E3 s
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
2 H: w+ ~! o+ E' D3 }) Q7 h& b8 v" q) [" O+ ]: g4 B( T
// wait send success- e7 N2 n3 k& _ ~" S8 v. {; t
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); : S% _1 E( f9 L1 G' J/ x* X; f1 a
: F/ W% t/ [: Z/ ] // make data node in free list
8 q' O- f" |* Z$ u# M, f- z/ P ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);- L4 \) h2 T$ a% ?+ p
server_msg_send(server, APP_CMD_LOG, "upp send: success");
) {( U2 n9 v- T& E! s& Y" B0 m }
) X l6 v% f. t' M0 B$ d return true;; c5 S& a. a7 m ^0 ]- h
}
% e8 h9 H4 t" a: N% D& v) C+ `7 j! b [9 p
9 i6 A$ N, Y. z% @9 |
4 K5 g6 k! r; ~& o
3 H2 [) O' j& n7 M4 }
' E: o3 C o J; ~ |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|