|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
1 J& E5 v2 Y% X
9 z" V M0 H8 F8 R问题描述:
# ^' f% O' i1 g+ S2 E I在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:9 f( o% X9 u% a% \/ }% C
* a4 d0 W! G4 P图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。5 c1 h/ Y9 j' D2 i# Q( s' \6 ?% D
$ r/ c0 Z0 d8 I9 L
测试结果如下:
$ l. b4 v% W6 r7 v- e" |138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
+ s& u. `% u% s3 J7 P& a8 Q4 R# |9 }+ H, A
, L; Q, z, r7 C& r备注:
" n% S( y( T8 G1 b% g! ^1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?3 p0 K7 l8 x9 a, j, g+ d- A
2、相关代码如下:4 o3 D9 }4 w4 \9 [. V& \" i
//UPP DMA缓冲大小512字节
4 m* o) z6 e) k* R" j) B9 ?0 `#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍8 k9 w9 T. J/ B" t! @
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT( C' q: ^; r, S2 b
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)" g" O! d4 L. H
1 P- \% s# h) A7 S4 T: v" W# ~6 L
& m3 z- ^+ l, v. v6 O& g! m. y//upp接收、发送buffer
" \6 @' }1 h4 B. o7 D#pragma DATA_ALIGN(upp_buffer_a, 8)/ r; D+ W! w/ z6 y2 L7 N5 C
#pragma DATA_ALIGN(upp_buffer_b, 8)
: G# v9 ^6 c+ s5 r& j O" I: f# b' V, _* v4 U
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
; s$ [% z" d9 ^7 r: Y) uunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];4 k9 W1 J/ F3 N
3 Y( D2 ]1 S8 Q2 V- \( @& u
) I2 n( e' t( ^9 G2 E$ o; vstatic bool server_upp_data_recv(Server *server)
9 a# f! G _. C{
/ s' n/ c$ R' l: ] if(server->upp_channel_a_recv == false) {
$ a. X- y+ a& D ~ server_msg_send(server, APP_CMD_LOG, "upp recv: start");
9 H7 @4 z% h. _6 Z% r if(ListMP_empty(server->upp_recv_list_free) == FALSE) {; W7 {0 B9 A- P- S" y* t
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");' l- R; q1 |, A( S
. a) ^% t( W% Z: y. s' ]% f
) A+ A4 Y( E' [; h7 h3 Q8 Q- a5 E memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
0 S) g F- C2 [& S; I) ?- X: `" ]; K s" N/ ]" b1 Z6 \
server->upp_channel_a_recv = true;//% S' F3 a, B0 U! C7 I
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);# a! }& M$ ?% u2 u* B) V) Y& [
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;, Q! P# J) S+ c/ Q l" v9 z0 T4 f2 Z
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;7 V$ S* u: j6 f! n0 ~ I
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//" Y3 j w+ f; T
+ M, ^5 S! c2 z
upp_error_count = 0;! y* `, [8 l2 d& ]5 ^
upp_dmai_int_cut = 0;
6 w( w( G9 Y$ l- s; Y$ { v5 P) x
// fill in data
" m1 P3 z9 t+ G) T uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);6 w( N: Z/ I4 Q7 l B
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
1 |( M& v. s1 b1 W }! [! u9 T7 m' M6 [" P: g8 N
}
/ V; `2 J. S2 t- I else{
" m, _ W$ w* A+ b3 U- | if (upp_dmai_int_cut > 0){
4 D1 {- S! h$ J3 D, Z1 ~. z4 Y DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free); w" F& f8 @' O: p- ~
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
# E1 {& i8 H. m8 @; w
; W$ s/ D. ~- q( x) |% t
0 p# Z( P' {- N: t. ~/ V0 R' B% G //copy data to upp_recv_list_busy
6 S' y5 ]8 V8 S, a9 C1 ~% [ memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
% H0 ?# }" W- S W; @7 i1 c- r4 t- L* x, v3 v, f+ x
//
' \' e7 m0 I( r) w ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
. N6 ^- z3 j; f& M) T9 L* S1 H( @
//8 M/ c N5 W* B( T# q
server->upp_channel_a_recv = false;//! L' z. x, E, q$ K- S! Q
4 U9 q* s4 Q8 z, a# ~ server_msg_send(server, APP_CMD_LOG, "upp recv: success");' u7 ?, s- W& d7 A3 f0 Q: t. U
}: z& m4 l4 |7 Z0 n
}2 j+ w# i' i9 L
1 x# G. I X- C
9 M! {( I2 L& O; p: R
return true;
8 ?1 x. V& v4 Y7 l v$ X; R- L}% N% s1 y0 S5 {: \% Z4 R! q5 {7 P
& ~' v! i" r6 d9 p; G
static bool server_upp_data_send(Server *server)# H+ ~+ r" T$ G! M* v: I0 h" x
{, ?( e" d# k! ?: W1 ]
if(ListMP_empty(server->upp_send_list_busy) == FALSE){+ p- A: H6 j) s5 I
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);: J9 B, b( f- s: M. d2 E
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);% f- M, E: u) [" r; K0 Z1 j- g& C
char tmp[128] ={0};' X" K1 H1 J$ d9 T3 M# I! A
* S6 j2 x. r% ^6 @ server_msg_send(server, APP_CMD_LOG, "upp send: start");
7 I5 }, D, @3 v9 L1 }1 R print_log(server, data, 64);3 P( S- k' i( r5 D
' M5 ^% |4 u q4 `) @) a7 y2 C //
4 J+ N) a2 \& O memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);) G/ H6 W' d" A& M( o* `9 k/ s- T
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);, }) u- J! x3 l
print_log(server, upp_buffer_b, 64);
' w- L- p6 G) M5 \) p2 V) d0 E8 e! ?. ~
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
4 X( g& a" V0 ?& Z( R server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
: I3 d5 [ J# z server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
( J; ^7 R0 ?" B9 d1 Y! V5 T server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;) v' p' ?( q$ [4 T; I. E9 A
" p7 ?4 T: E* u4 @ U
memset(tmp, 0, sizeof(tmp));8 a# N+ M# ~6 v& R
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", - h: B7 r& t8 M5 u% C" U' ^
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
! X) [; x1 e$ V v, t5 q server_msg_send(server, APP_CMD_LOG, tmp);2 C! `% B- L1 w& C/ s" a
; ^- c$ u( m# C
upp_error_count = 0; e( W) z1 X; Z4 c% E3 v# i$ k$ \
upp_dmaq_int_cut = 0;1 s3 [& ~/ _# F+ x' Q) d
// fill in data
! H& V8 Q: f+ n1 K/ m+ V6 m uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); * O0 W0 e0 d$ G0 e+ v1 I: V& d
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");4 X6 `5 R( U& l2 M& p' C; l
6 P& x- \$ P* \* J // wait send success! R3 D* S4 ~( y9 c7 X/ _
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); * I/ c" ?3 N) M
3 \8 `4 r" S8 ?' i' F# r4 N' a // make data node in free list 8 N5 M6 H! e9 E3 B
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
: A, B, n1 S& X4 q server_msg_send(server, APP_CMD_LOG, "upp send: success");
# ~/ m) ~& D4 S+ A3 E/ x6 y }
5 @$ W6 [; z& l* e) h return true;2 `% U* Q1 q/ K0 ^
}7 j* K. N- u4 z
0 c p6 V( D' b# t& d( @
# A9 E! w6 I+ G7 R$ q3 K' I5 S7 B" a
8 o) q* G( V5 ~! I$ V- S+ b3 l; W G" S
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|