|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
, q4 r# u9 z+ y/ R
7 A0 x5 |4 V2 a" e: N! o2 `问题描述:+ q' f, \! `- Y* Y/ O
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
; T0 e2 V- c; G: v) v- ^* Q8 \
$ t9 c; |# B; P' ^2 G0 l图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。* l7 q4 C6 j3 v8 u% n$ E$ k
& ], d, F/ y) u
测试结果如下:
# J, R' Q; G7 @& {6 E! i138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
6 U' Q% w8 ^0 g) _$ {5 O% Z$ B: P5 N% w3 L
3 E8 i4 s- ~6 ^0 C s备注:
2 Y" R5 y+ p6 U# \$ M' v1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?8 ~- A% j4 ~3 ]7 T6 N
2、相关代码如下:
6 c# [, B+ |0 Y" x# j# k//UPP DMA缓冲大小512字节0 l7 q2 g# t0 W& n
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍) X G4 `3 R8 V/ L F6 f
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
0 h8 Z1 ^& H6 x2 k' u$ u4 ?#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
4 A3 A" |+ u) I6 e7 e$ Y- r! w- g1 [1 J8 e" V
# k$ r( T1 t: A; f3 _8 }//upp接收、发送buffer
" W l) p7 m: v: U8 w7 a( [' m#pragma DATA_ALIGN(upp_buffer_a, 8)
3 m0 P: {* M' H$ z#pragma DATA_ALIGN(upp_buffer_b, 8)8 P% K5 G5 j6 z- Z+ d# O
# k# s$ J; `) A, a8 b2 w
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
% z$ [9 A* Q1 j* M! Cunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];, k/ s6 K+ H+ c
5 @9 \/ @' j* a7 o# y
1 U- g: p7 @2 N! g/ K* D& \5 Nstatic bool server_upp_data_recv(Server *server)
3 ?% z2 `6 I; `7 |$ A4 y' Z( V( y5 Y{
1 E; w3 ~) X! h; v if(server->upp_channel_a_recv == false) {
' C% B& V. x: J7 ` server_msg_send(server, APP_CMD_LOG, "upp recv: start");
, B- ]' E0 s5 F3 V F# q* j- K if(ListMP_empty(server->upp_recv_list_free) == FALSE) {2 D% o G7 I0 v
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");- b+ _7 p t1 a) _
2 Q/ V: e+ Y2 \4 l0 J! @" I V
! O- C5 g( o* w$ N8 Y8 q7 g: [ memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
2 a& H6 a0 r$ Q8 x1 ]. N
. r+ @, S5 e" y4 V+ q7 n server->upp_channel_a_recv = true;/// e7 I8 O7 O" b
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
4 ?( G5 K# `1 }7 p! S' v" a server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
% [ n* ~7 C3 p8 }* j7 z server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
9 V2 V5 J3 w5 ^1 V D, M server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
- k6 I) G( w' @. ?
6 v& x/ k w8 `! s- H L upp_error_count = 0;
9 j3 T6 b- y2 e% v% g7 t3 ` upp_dmai_int_cut = 0;/ v( s3 z7 J0 [1 {4 v) ?$ M
1 Z; ~3 h; X/ ?) [1 J
// fill in data
4 g; p6 G4 N& S# { uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);+ p" U+ T2 @- U0 j( D; s. K. M, v" g
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");& D7 f* Z# X- o+ v# l; |- v
}
) V6 I. G6 b% ~/ E# w$ ~8 T/ f7 K }
8 f1 z3 I7 j* i% {9 x* r( h; g$ u, n else{$ E5 M8 E" K# o! u
if (upp_dmai_int_cut > 0){
- g$ u$ Q Q" V$ T' ~1 l7 x DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
" o4 s# {7 b* A, ?" m Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
: Y6 x. i3 y' [) ~9 G/ M, z6 t( c+ ^( r N
0 q8 W; H. ?9 Q" T1 {+ Y$ E; O+ t
//copy data to upp_recv_list_busy7 @4 t4 b; t- l
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);' Z" K9 h7 Y; a$ p8 G
( n+ _1 M, o! y- D' ]
//4 u- b+ ` Q! ~* h+ V
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);9 _! L) x/ a1 K/ a. N% M& A" f" n
* k. U' c( g8 ~1 t# j7 G" v //
' e, ~6 ~( I1 k2 \, w& I' l server->upp_channel_a_recv = false;//
# |+ {: t+ l- t
( U& Z7 p+ r6 n1 v" u5 w+ t server_msg_send(server, APP_CMD_LOG, "upp recv: success");' s2 V' C& s- h/ E) E
}( K# y3 r( j. P4 W$ a
}9 D5 r4 j ^# C7 C; h5 @
5 B1 F2 ~& I* G
, Q4 E0 T5 j$ a return true;7 V) L) E9 g- l( \. y* e
}
2 X) V& z! B+ o' [- q5 l. u& D+ w# X" ~- S, ^+ B; z: x( a
static bool server_upp_data_send(Server *server)
% w. `% l& O# m& e8 h{$ p* y0 Z9 L, \- t: }- H1 j
if(ListMP_empty(server->upp_send_list_busy) == FALSE){& ] n- V2 l3 U6 |5 J
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
# |9 A1 [7 x5 r. H6 q; l7 ~% Z& Q+ _ unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
1 b) h( j9 G3 b' `& C! } char tmp[128] ={0};
& Z' U/ q! \/ u7 B
' c/ v) ^ J. j& @. z: R server_msg_send(server, APP_CMD_LOG, "upp send: start");
2 V* {0 u* T# b6 |: R) {2 s) Z: ] print_log(server, data, 64);
/ X8 b3 ^: ~+ p( R; H8 z1 ^/ G* f. m# Z6 Z' t% V O4 ]
//
3 ]+ Z. v7 @% A. h memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
H1 H3 @" a2 F memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
# J9 C8 _' U+ T" V( t, S7 p1 O& b print_log(server, upp_buffer_b, 64);
+ X% Q& X( a! H( ^
* E5 i- |# u/ `# z; {7 u server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);( k a# J3 x ^/ \7 ?
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; # x0 p" j( _4 C
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;6 n3 ? c! F3 P5 `# S/ p
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;$ S' V" a' B3 n/ l5 q P
( N# |; b6 G( P( N: ~
memset(tmp, 0, sizeof(tmp));
8 I# p/ l) U4 o, C$ X$ d6 L sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ! J7 p. x8 W5 R' |+ ~' Q
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
# f! b; X) y \1 f* C! q0 l2 Q server_msg_send(server, APP_CMD_LOG, tmp);
/ g& m) B5 b3 i
$ z6 j6 H9 `% n3 \ upp_error_count = 0;( f6 E F: L9 R g) h
upp_dmaq_int_cut = 0;
, `9 p, F ^3 `) f* I2 r. t- R // fill in data
! U6 w0 \' Y" E: \/ t' v" z6 u uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
" ~* x7 k9 D7 H8 a; d& G+ i+ K server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
8 `( J6 y3 M) f1 C) z- x' Q7 x$ @& d: P
// wait send success" h: f% @; z" t- v
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
4 T& w% d s( J& c. f S0 W8 _! m, Q k2 ^+ ^5 T9 _& M
// make data node in free list
! q% L* [# n: O w0 v" P ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);* X$ F N- F. i0 p h6 i
server_msg_send(server, APP_CMD_LOG, "upp send: success");% m6 W! p3 g' q
}
b1 G& ~* \7 `& C return true;% g4 U! c1 ~8 N7 E5 x
}
4 K% w' L% t( P5 ~0 ]! V! P& j/ j) C5 r1 \: K
9 M8 E5 `' y1 a, q' a/ S7 y- V) u4 d4 ~ B" j! O$ ^4 g" j
, Y( w1 x+ J' R _9 ]0 u2 A- w. U
# G3 g# j6 W& r2 v+ x: l |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|