|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
4 B7 w1 U) D u, J: \; u& e; s! N; Q' D0 J
问题描述:
& w! B" F5 \ @" h5 S4 z在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
. c/ G. m C# V, a5 k# c
+ ~1 Z3 h0 G) Y图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
; Z1 y' W7 L: L1 m9 z" Y" ?& _0 ?& {' E
测试结果如下:4 Y! _" J! L1 O% |8 T
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?" H, t) v" ~: c) W) b
4 y+ l. [& E f7 V# r
' t; M6 ]" H! i* C9 |备注:
) F8 r$ Z1 A) X1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?! [5 s6 f( k M7 H4 J- S0 b2 F7 Y. ?
2、相关代码如下:" r, E R3 ~9 R' R+ M" B+ l
//UPP DMA缓冲大小512字节
9 W4 c: d. @6 f#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
2 \- J" j6 h, o/ B% C s2 v#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
& d6 P4 E. e5 l/ ^#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
/ R- M. B& s- u. x! \ H! d2 g
3 s2 r( D: |: x0 t# j4 s# m9 s8 { x1 U1 b( f2 w
//upp接收、发送buffer) E5 m1 O; j) {2 M, C. a9 }# U
#pragma DATA_ALIGN(upp_buffer_a, 8)
9 c. Z4 [8 ]8 V1 R+ V#pragma DATA_ALIGN(upp_buffer_b, 8)' Y0 Z1 s H; {3 D2 c. B
& c. V& o9 a0 l1 r) zunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
" l9 P; f& }1 T$ |& ]unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
, N9 ]# X4 _2 J7 m1 \0 Q1 E3 z3 g6 A/ A8 ^! U- U a2 _/ f
- |1 r. h$ t* U% W! b
static bool server_upp_data_recv(Server *server) 0 K; M+ H( ?8 M
{1 H8 A- Y5 v8 X8 d6 `. z8 C
if(server->upp_channel_a_recv == false) {
) m& l2 `; `( r# l server_msg_send(server, APP_CMD_LOG, "upp recv: start");. N5 B) {, u8 j) U, N0 ]. F) J
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
" B" s; Y: o- x& @$ P. H server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
4 v. }$ ~* X/ z" j% i5 m# q7 X2 d3 s) L& J8 ?$ e9 w! B1 b/ i
4 S% k" B+ }1 ] memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);# A6 c, q7 u7 I2 |, ~! A
l0 o% K/ P0 V5 L* [2 i server->upp_channel_a_recv = true;//2 o9 W$ e( _& G
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);) b4 s* ]5 K* Z$ W$ Z7 @1 C2 V
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
( K# A7 F2 z7 g: C server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;+ z) H: k9 Q. L
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//; U7 a) c9 i2 @- @! H
1 i# ]8 z3 K& }! Y( J5 G" J! H8 k% G
upp_error_count = 0;
7 O' `9 n( E6 D9 S upp_dmai_int_cut = 0;2 s- n% ^/ `7 g7 x! \
1 ?8 Q, C. x5 W. ^ // fill in data
) f& Q! h) o" y0 O1 X4 S$ s uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);& Y. f7 Q8 E& _+ p6 H
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");$ A5 @' r; X( _$ y5 o
}/ u& }1 z% U3 Y% _+ L$ u2 J) H
}6 A4 a1 m- m+ w1 ~/ v/ H
else{
+ r$ N. T! n* V) M) v7 E4 V& n if (upp_dmai_int_cut > 0){) V) B, }) u T! A. g" _
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
* t+ Q* _; ^, b3 l* ` Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);( m6 t4 O1 `) Y5 \% d! a
3 P. B D4 G: e4 v" s$ s, T. h* i' R
/ K9 a" [: _/ M. k //copy data to upp_recv_list_busy
* g) T- Y$ Y2 J0 f& B* H8 k U t0 l: w memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);2 O \% _* {" R2 Y& |9 J
& v' j+ u: I4 h. P; C p9 I
//% C2 ?7 w p' P" F) W, O/ q$ |
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
9 ?1 U4 W6 S( n R
# F9 M, m# ?8 D* w2 W! r( ?) u. G# C //
' u( m, I. X" G/ d server->upp_channel_a_recv = false;//- }* R9 o1 ^* B
& C; ?3 P1 O4 _6 i, p7 i2 [
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
- u3 J$ Q W1 i( ?0 H, E }: ^. Y0 i9 v1 X8 b
}( X5 u" \$ n" t0 r
/ E" v+ R: f, r) Q5 R" h7 ` I( R1 E2 M, _% n; o( M* W
return true;; G9 u. F3 N$ q
}. R7 G9 V8 R: x& |: H
5 I" ~' j3 a! t$ L4 [) u
static bool server_upp_data_send(Server *server)
a/ m$ W+ l: H b{7 j$ B. Y0 B7 |2 \4 x
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
8 H: |2 ^( K9 s" E9 y DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);' K. N/ j' W- \( k. c
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
! i* j/ ^6 _4 W% C char tmp[128] ={0};$ M& ]) b2 F% J5 U* M
7 o$ E3 o: x3 j! J4 |
server_msg_send(server, APP_CMD_LOG, "upp send: start");
2 m1 P4 |" ?- O print_log(server, data, 64);
q( B5 ]* Q g" ~$ u3 {& q+ `2 ]- o& m; M) e. Z6 s
//% A( R4 w7 q5 I6 l7 k
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
0 ` L' `2 } |7 t5 r$ f8 A memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
* t- e- ?0 i" ?7 _0 s) P print_log(server, upp_buffer_b, 64);
+ \) S) p( w( u) J: B$ h" @( B' W: _* b% [. g# B7 H
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);6 G1 R. {( t5 f* n$ k) [7 \6 K
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 4 m* _3 p3 f2 Z. s
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;% B# u6 u/ X8 p) X6 B7 s+ t
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
, D( V) E B$ f- L t
9 ~ O( I) o% W( h memset(tmp, 0, sizeof(tmp));
) r7 x; r$ E3 \1 {' `- I sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
& F& k1 ?8 L* g3 ]! h2 U sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
! H# `- u. E- v1 ]0 X# c$ c server_msg_send(server, APP_CMD_LOG, tmp);0 O& K) \$ Z' x
; Z$ R: l, M2 Z* F/ @! l3 H1 H
upp_error_count = 0;
! ^ _! b" |0 ` upp_dmaq_int_cut = 0; D) C y* }* X, p: ]2 C/ Q
// fill in data
- e k- s6 l8 x1 V uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
0 ?3 c& T& ?% E* x& X- s server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");. t8 J: z# Q( C! x
: S7 b/ m; x# ~8 U: [' A // wait send success4 @2 g+ s8 i+ I; }" M7 }! h
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ! S: r: c- @6 M+ |) `2 N( l! m3 A
1 l: ?( @1 g0 U3 Q; q, \* P
// make data node in free list
, M2 w4 b% e% }& z ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);9 a# U6 [4 Z9 h; t0 F7 g+ ^
server_msg_send(server, APP_CMD_LOG, "upp send: success");) z. F/ S# ], }; `
}, e7 c! K1 E; ?* A! A
return true;
" d0 t& _, F9 w: D" k}
^' \. `. o% F3 `0 B7 q r3 `! R- B& C) [2 Q
( o8 M* X, F6 w- m0 O- y \/ ^% ]7 e5 u( r* h9 v. |
9 \2 S: K( s- `; Z) f- g- k* l# c7 U* b6 f( s- L1 E* M( N
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|