|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 # s L% Y1 c) v. `* P: n' X" u9 Y
& w0 y+ Y0 h2 o8 b0 J问题描述:
* \% T. D' t- F* q$ Q在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:3 u" G2 M7 i; Y% c9 \
7 {% o# A0 _& `, G- a, c
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
. e' e" K: j/ ?; T8 r- h5 Z- _. @* z% b& X
测试结果如下: ], A2 j) a+ T' w$ Z) y
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?6 N: Y% X* t" j6 {" ^ o4 m
" J! c( p! I; `) H/ w+ ]
# Y; M! b5 O& d4 [0 x备注:
( X4 e3 S3 W- A/ `- m1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?4 B; \' v8 \! z" n$ K7 k
2、相关代码如下:
- Z6 C0 O% e6 [9 A. u9 K//UPP DMA缓冲大小512字节
1 S4 s& y+ _" u. M9 f& n2 H6 j! u#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
0 t$ M$ N: B: F5 N/ I#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT1 x4 {' c$ f0 P5 d0 k$ ?9 g
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)) p$ H/ x$ L- n6 q m5 C
2 ~$ r i& G2 ]' H& [9 Y8 L
, K* f. \2 a- ~. Z9 M
//upp接收、发送buffer6 @" P |. N: M0 ]6 H
#pragma DATA_ALIGN(upp_buffer_a, 8)
; X' T. p1 t" t* M# T$ q#pragma DATA_ALIGN(upp_buffer_b, 8)
; w: N7 s) h) N: t [
% [% T" V& G: ^9 h6 d9 ^unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
0 U. |" S c: P C7 \* kunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];9 i) }' ]- j& q' J5 ? p
7 b- z4 q7 ]1 a" g4 Y
9 E$ S7 |0 n7 a. I
static bool server_upp_data_recv(Server *server)
* i8 U. a- p& F" W{9 ]( h1 c2 _$ e X8 G: x, F* l
if(server->upp_channel_a_recv == false) {
! K& D0 R' Y. f3 D4 P0 | m server_msg_send(server, APP_CMD_LOG, "upp recv: start");- D. @) M) Z' M
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {( K) e, F. d- ?# d; ^: \
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
) R3 M, m7 d0 o3 d
6 O& s9 `( u, W, @
3 r8 t3 j/ E E memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);& l0 @ B) W4 S S: w9 U
3 Y- X8 r% p5 E) I# J( d server->upp_channel_a_recv = true;//
) A. l/ S; h% l- V server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
. h' h$ `: O O$ Q$ L6 N server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;2 J/ i7 L2 K6 Q( z( u
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
. J, ?! W/ B! G( G/ L V/ i% @+ F server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
& j" U; x. v1 y/ ]- ~( q. `" b9 q* t$ A/ {/ b! H
upp_error_count = 0;% \( f5 \) X( T! X1 C
upp_dmai_int_cut = 0;" P9 e) j- m2 b7 { T9 \1 Y
% U* B" R3 X2 i8 ~0 x C" y // fill in data
. P* s l/ R" t4 D& z uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);, a8 X* `9 i' F& e) |
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
8 K3 Q$ A& y8 ^7 _/ E b8 K! k }7 }/ ]% E6 r2 h/ L" f' M* M5 }
}9 _2 t* c, p4 w" I. l7 L
else{8 ?) g! _0 ]* M" \& L: g( o7 D
if (upp_dmai_int_cut > 0){" ~2 @3 } k1 N0 y
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
! [& w5 A. X4 E: G8 L. L4 [ Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
1 r2 c( Q( [0 B: g1 \) v/ N6 C, |; `, `) [
$ X( c! j0 W* C3 K; S0 T' _ //copy data to upp_recv_list_busy
: m# Y* @) b* f( p" \% v memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
0 r9 a3 a3 i% Z# X- S) B/ v6 H# S
1 i+ K( d$ B0 ?# i* P. A) E //' B! Y( k* i& r/ x. c. h
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);, J, x) G" t4 }7 K9 g4 E8 `, u
5 d. o! |9 H* z8 F/ I2 ]- j //" ?4 L) F6 U" f. M d. }7 D0 A
server->upp_channel_a_recv = false;//
% ]. u/ z' \3 R; S r
& N* D6 k# g* J% n! x server_msg_send(server, APP_CMD_LOG, "upp recv: success");
* M2 v1 m- X+ O7 ]" r# o2 M+ r0 } }
: N. }6 Z0 ?0 j( @- s8 J# x0 j }
7 A! E1 @/ |3 s; ]
, v c5 Y7 \; q- @! _* F( m- b0 _7 d& X( z7 `- { H0 F
return true;
" t/ m6 z Z! N- f& \}
3 x* _* r1 ]/ V6 k5 H
9 n( b% L+ l4 t7 \9 Cstatic bool server_upp_data_send(Server *server)% R) q4 c9 A! s
{
, X; m5 G% J' o3 \5 ?' Z if(ListMP_empty(server->upp_send_list_busy) == FALSE){6 E1 y7 Y5 U6 r6 K# A* Q
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
' E8 c ~, z. w unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);2 k7 S" A) U1 F' ^5 ?: s
char tmp[128] ={0};+ I: C/ k ]3 `* n
4 V4 O5 d7 t* ~" n/ M$ U server_msg_send(server, APP_CMD_LOG, "upp send: start");
$ O/ R0 }( m' ?1 Z0 R print_log(server, data, 64);
6 [% B6 R, s5 L# |9 L7 C5 {, B- K- f B; j" d- P: F+ K
//) ]1 |: Y" {: U9 Q E+ i; u) R* a
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);# W' X, @8 t3 }& w& @1 q1 ?( j* I
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
4 n% q, X! I9 z5 |. y1 p print_log(server, upp_buffer_b, 64); X+ `4 D3 J! a$ Y
6 e. f; g6 t- u6 a/ M server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
6 g. v: s. N7 x" M- [ server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
4 n4 ?: ~+ P( ~; @! J+ w& }! w server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
+ J8 o, G# t& @" K( U" { L" w server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
& J2 J) M+ B2 s- W& y& ?' l6 \( B3 Z* x- I* }+ @) `
memset(tmp, 0, sizeof(tmp));: M/ K H+ k/ j2 W: K- }5 ^
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", - G3 b2 ?: n+ w0 n2 g4 P
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
+ K9 G$ |" J$ G# ^ server_msg_send(server, APP_CMD_LOG, tmp);
' X7 E0 w8 R0 j" H- |6 ~+ t; i% B h4 h4 n+ j" @$ i) E" R$ _2 ?
upp_error_count = 0;: C9 k( I' `; r1 O X5 _& y, A
upp_dmaq_int_cut = 0;
7 j* H1 B% [% I& H. ]& y) J2 B2 t( ` // fill in data
! b9 g' B" @1 U0 z/ d/ k uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); # r8 i9 }) p/ K4 k( D6 ^
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");. q. h! O& ` o
; N7 C* q: w/ M" f$ u' O8 k$ x
// wait send success
! ~, Y( p% s. y0 \3 C8 A: l' P while (upp_dmaq_int_cut < 1 && upp_error_count == 0); : H* p$ v5 \& P2 M# [' `6 y
- a6 G. N) u: I" {
// make data node in free list
( u, V& f x7 ^ ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
' \# }4 P4 Q9 L2 g, r server_msg_send(server, APP_CMD_LOG, "upp send: success");) c+ r! i( c6 G! S( Y1 J
}
$ K8 Q8 G- S) B1 }2 E/ Z) G return true;
- U# t! u. T5 f p5 c w}
; A: Q1 x3 B2 e! W4 _5 v- d9 u. R/ _
% M& h7 w1 f0 p+ E
: f- r; v" ~2 j* m* {5 C6 {- I2 i) X( o0 c( z- z4 R
' W% D) c6 a' t3 { S |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|