|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
3 E, z5 j g1 X: P. [& O/ }0 W3 V" @( F1 l
问题描述:5 ?: M, ]. ]0 a. G+ z% z# \. e
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:/ Q' V4 A" X, n) G( |0 z$ X3 u
0 d: d1 M4 g1 F: `0 ?2 L2 W
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。. k3 D9 ^7 J5 Y/ `
+ h( \- n" J; | {* V2 M测试结果如下:
3 V9 s* p+ }8 K5 P U4 X' w138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?. B$ P& L8 m- X2 w1 l7 g
8 G( D. U7 L6 d; H! r, C. Q* G, o* u
备注:5 f" ^- w$ j. M0 c5 X4 [
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
' U; ^9 {5 a" R4 p+ g2 b2、相关代码如下:
' H: W4 I" W* N, L4 M+ t6 D% N//UPP DMA缓冲大小512字节* }+ q' i. H0 l9 | N+ t2 o+ f$ J8 R1 m
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍0 r( o0 o c A5 p6 R4 ]
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT" c- d( r5 l A% O4 {, P& \/ A) h
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)7 r1 L2 n4 M m; f
1 x; E7 X* \2 @% V4 N: X& s; c- T- `# e
//upp接收、发送buffer
% ?7 X0 W5 z* P3 ~#pragma DATA_ALIGN(upp_buffer_a, 8)% `, D, O- j, o& b+ w8 p/ A1 a. J
#pragma DATA_ALIGN(upp_buffer_b, 8)
! T3 u$ j4 B( M+ t: [3 ^6 {" I
5 }# K1 a5 R6 x# G$ eunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
! j' P |& h- q. Y: \# ounsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
: }$ b# h6 `& G7 Y- ?% D/ R) n( a& _: a, T8 f
- P. d- X1 v& O J D
static bool server_upp_data_recv(Server *server)
5 o# G) i5 q0 O! l$ H* f{
3 ]( G/ p) p- W' q0 ] if(server->upp_channel_a_recv == false) {6 Z3 T8 C% v# H( G# ~
server_msg_send(server, APP_CMD_LOG, "upp recv: start");) g: N l. k2 P
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {" H& n0 p9 I. E& k; ]7 C
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");4 Y( g0 a8 b# ?; C% Q% F
3 p6 l/ K. x3 b. o s, G# y$ M2 ?2 j( _4 B" p$ \/ K* S) x j% D
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
6 ?; o$ D) y: M4 j; J, k4 ]% Y. y( L Q" r# t
server->upp_channel_a_recv = true;// y* q6 |2 L8 b9 w
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
( `2 B, W1 W1 b; `: Z' n% ^ server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;4 R6 \ V. N3 _- P$ ]! w9 B4 Q* T
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;% m+ O1 n& a; H+ J/ t6 j6 x
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//% v/ M/ m3 P. E" b; j% j
7 l% w: Y, k2 ~, p+ x" w# e
upp_error_count = 0;, P# d* c) W! Z5 O0 E- W5 x/ M1 y
upp_dmai_int_cut = 0;
W& d. t( Q4 n5 p: \6 R- n1 x# t0 {" `/ ~
// fill in data 4 G! |# p7 `6 k+ ^
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
, e# u* G+ k+ R' G, f server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
$ ^: i# m# n# ]5 k) ^ }# C! f2 S h: u* ], Y
}
( k7 @, E! O$ E+ u8 m0 L* E8 i else{& }; {5 y: j* g! r0 J& |5 ~/ `
if (upp_dmai_int_cut > 0){: u6 C; x5 H$ e7 y6 e
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
# {% z0 `1 j4 G! z3 a( g Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
; U! R9 n( \+ M0 a; g
! o3 R. i1 q5 L' x) P* h, z8 n8 i' O9 K- Q U
//copy data to upp_recv_list_busy
% k: v1 V/ p/ N3 r+ V4 v# w3 X# W memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);9 f3 m. C" v7 n
, ~$ F- Z! t4 |/ I. ?, k- R //# P5 y# U0 S! d" Q9 Y+ V
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
8 p/ n' ^$ N4 q+ k: V/ l9 z0 E' M% c# X
//4 ?4 o* L! T( o; M" h
server->upp_channel_a_recv = false;//
{3 R0 G! H, H7 v
* M( J& s& B! j8 ]! U3 J1 z+ Q server_msg_send(server, APP_CMD_LOG, "upp recv: success");
1 d0 u- X$ W. g1 E$ } }7 W" }4 j3 a, f s0 |
}
% T' O, _& w6 d
. L: R2 m+ q$ V) _
% I! F9 S7 q$ g# M' n return true;- r7 I; L7 P& H3 P' F# h& {# E1 O
}2 `- W" J0 J% Y8 W( o1 B3 U! Y
# `9 D. H8 C0 Y
static bool server_upp_data_send(Server *server)
- D, Y6 a- ?( q. S{* t2 P4 c+ z. M$ e
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
/ g1 Z+ G x$ i+ r! U+ e, d( \ DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
" H6 H5 j# w& Q0 S( {5 s unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);9 I2 n; ]% ^; D) f
char tmp[128] ={0};2 |2 a" Z: r1 V' d
. i: L+ x& _9 }' f
server_msg_send(server, APP_CMD_LOG, "upp send: start");
, e1 J: W0 b9 E5 S print_log(server, data, 64);
& w4 Q: p8 Y0 J1 \, w$ o5 k: \% a0 I: N0 l
//- @+ f5 [8 b0 l+ K& O8 g
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
3 b9 ^7 V: |- W3 v2 A memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);3 c5 X% I5 ?3 w8 o
print_log(server, upp_buffer_b, 64);+ F+ `2 Z0 X3 @8 t
1 ?6 o( o1 S2 I+ x
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
' L- y# _! m4 B- |( p server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
# T/ x b0 y2 ]7 ]0 I2 b h* }) j3 L; | server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
& s i9 N% Q3 Z4 w server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;9 T* X7 t5 ?- } m) | G3 x; u
0 l$ l2 n \( m5 {9 s memset(tmp, 0, sizeof(tmp));
( }6 {+ R1 a: i& N# W1 w2 L sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
8 a4 ~1 z% y- j H+ d% t* N' | sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);3 d- m" q4 u: j8 o- w2 l) D6 t$ l1 y" @
server_msg_send(server, APP_CMD_LOG, tmp);
8 \8 L: u8 m6 d4 F$ e3 U% I
. V' w& d* Y: A# \6 d% b upp_error_count = 0;
& q" A: U- b4 [+ T2 K @7 Y! C upp_dmaq_int_cut = 0;& c6 _) P5 U- | q% Q
// fill in data
. j: W5 M! s) h+ c( a/ n" v uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); , H& o- p( I% K( P+ g$ {
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");" O% J* E& o% s
$ t1 l1 r* c5 z7 L5 K( U; c. T // wait send success
6 w) B& H$ l% O+ b* ^ while (upp_dmaq_int_cut < 1 && upp_error_count == 0); - ]5 j% J V T# Z. q7 l1 Q
+ ?, D* P, F- B- K // make data node in free list ' v1 ^: ]" h- O+ O7 C4 d, ]2 p
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
, q9 M, \* I% N2 J5 I" Q' X server_msg_send(server, APP_CMD_LOG, "upp send: success");9 g+ `+ Q# @3 _0 D+ }6 m" M
}1 G% ?- h9 A: M- o8 a
return true;
+ R p& c' z- E& I. U* L; s}+ [" k0 F8 C/ E, [8 F' u
: |7 u8 j; ~$ V# [
# ~0 j4 q# Q& x/ P H9 S6 k y2 }2 t- d. V6 [" n$ Q
5 j, S, w% J7 W1 l/ j% [5 M
$ i+ J( |+ p; W8 {* n; [( R |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|