|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 , E( F/ m( b+ P" e; q( z* ^
2 |0 ^; d, E0 s; T问题描述:/ U8 k: |! l, |& f0 H' a" P
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
( w1 t7 \6 S9 t- v \ ?2 h, z# ]! z, c7 v" k" a7 _* |
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
% P# {5 Z) B0 V& N3 n) [' ]9 T: A- k+ Y1 t
测试结果如下:
9 B! H0 e- _- ~138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?" @$ i8 n1 j W& u9 d
( k; K$ J% M& g% i0 D' {3 F8 W( A
' e+ d) W, M5 A8 f备注:9 W7 C- E, l# ?$ ~
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
8 p9 l% M) \7 P, Y2、相关代码如下:3 V6 Q$ a: R; A4 h+ a- N
//UPP DMA缓冲大小512字节
6 p, s. F& i. P8 c#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍! X4 M$ s4 }2 `! W4 g9 Q! F
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT- N5 M( p5 i" M3 J- N
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)% a' t% V% A$ M8 ]* Q# \: K0 p% N
" _1 N- H. M5 o& G
- a3 S2 g3 w! Y! R" S//upp接收、发送buffer
& v$ w0 ~ X8 {#pragma DATA_ALIGN(upp_buffer_a, 8)4 \9 \: b" t6 p
#pragma DATA_ALIGN(upp_buffer_b, 8)
8 w" o' O& q# n
9 }& z9 R4 t/ funsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];5 n* }+ @2 P C0 u+ U6 e
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE]; ?! x- F! U1 u7 E
* j9 ?0 v# G6 i7 m! J0 k
8 H8 T) [4 g+ G- b7 O0 \. Q9 Wstatic bool server_upp_data_recv(Server *server) # N3 T: P% F9 a' B5 W% o K# J+ L) Y' y
{9 w% ?& c3 Q. y8 N; N6 F
if(server->upp_channel_a_recv == false) {& _- I1 N& [) K( d
server_msg_send(server, APP_CMD_LOG, "upp recv: start");: v# y! T6 H1 l9 K) s. w; K
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {0 L5 q2 _+ M( e: k2 A
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
! F6 o! Q2 k3 ]4 f' r7 D6 ]: N* V' a2 k2 k3 c
' \; Z' M' X" E2 E memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
/ X1 r, r* N1 c6 C0 R: Q3 C& f7 g* Y3 V$ j% r
server->upp_channel_a_recv = true;//! H" B9 a0 M& S( t, ^5 y" P" b" h1 g
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);. z( w5 Q& K1 R
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
4 R* k: |' e. z1 J server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;) Y, U! Y2 R& b7 q2 @. n0 Y
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//: }! O! r2 `$ [3 A0 ?, P
1 s6 N" B0 _: r
upp_error_count = 0;
# \5 w$ P5 J4 ^1 }7 S2 ^- b$ [ upp_dmai_int_cut = 0;5 Y3 p- y$ I& O5 Z4 g
, S" Z- N! q! T+ E
// fill in data
$ k0 y7 ~! f5 `' i" h4 H9 |0 @ uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);' U# h8 o( X: {# ]$ j7 Z( z
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
. K* p, M$ z' H5 L9 Y" e$ D3 e* Z }
# B$ a ?+ i& c2 s* p6 U }
2 x9 @; z* S" e' h5 X0 J else{' A+ `4 q7 {/ v0 o; g5 L ~3 }
if (upp_dmai_int_cut > 0){
; n7 l+ `( i0 M& K- [7 ^ DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
6 T* y; Y U, @ Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);9 g' U0 J& Q, n# i& N
8 K; ^( i* ]) P! x0 N
% \# \# O/ p- R& W1 O) h% m: Z //copy data to upp_recv_list_busy
1 W9 G/ s2 k$ d9 P memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
; I& E, s c* P5 z$ L# s/ V6 X0 ~9 ]6 p# g' C" ^3 T5 F ]( E
//
9 c( X/ a5 e4 N2 F ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);; [% Q* X/ C$ f, a
- P) H4 y1 u: e* K5 n //
3 L: J* G U0 { s3 \ server->upp_channel_a_recv = false;//
X! u1 [5 r8 \! g( j$ I7 l3 T
4 v1 w, r, L4 d5 i# i' f! l7 Q9 o server_msg_send(server, APP_CMD_LOG, "upp recv: success");' S/ \/ r3 b; ^* p* w
}% _9 G7 Q. j6 z7 O; |5 _7 T
}5 k* w7 S3 a5 _7 ^; h' g. z
8 G0 o2 |; X0 K- v! j# e! L
* w V8 U; k. |9 I0 e' J2 S return true;
, F& L" w( r7 u6 z+ t. d}
# n; U+ ], g; p8 @
: p$ E0 b( M; b9 mstatic bool server_upp_data_send(Server *server)- j5 o) \! l7 r9 r" |
{
# d" B% w- M/ c" ]6 |7 @8 j/ q$ s if(ListMP_empty(server->upp_send_list_busy) == FALSE){
' U5 r" M% J8 { J# } DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
) J; v" E9 C1 v6 `+ M. ] unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);4 @2 W+ h$ C" p% G9 t2 F, x
char tmp[128] ={0};
$ b: U! _' B- X3 S- Z! k
. t" e, _1 a: t P server_msg_send(server, APP_CMD_LOG, "upp send: start");
9 U f' w4 a R: q$ {3 a | print_log(server, data, 64);9 C( X* j- O) M) ~( t" F9 R; F; q1 [
0 w6 e- Q2 g+ \" p7 m6 V
//3 b G3 X( P8 W
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);& I# d5 i0 a: z: S, K% u
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE); q3 T) g, g( L' n) _. J+ w
print_log(server, upp_buffer_b, 64);
) W Y' c$ I' o4 N8 r$ E" W/ z4 |
( s' }5 K* }' g/ t) Q$ a8 ] server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
, ~9 M1 V) ]( R server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
( N5 O$ q6 e& x server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;3 Z0 w/ [6 v' c
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
. @) i$ d4 w0 k: O2 X
( g% @7 P( A( Z; s! y memset(tmp, 0, sizeof(tmp));
. q) ?5 A( t. m. U/ W/ l sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 4 ^1 A+ Q) }7 t/ q8 _4 Z, v7 h; t
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
* ~3 T( y: ^/ P% D5 v$ S! z: [ server_msg_send(server, APP_CMD_LOG, tmp);; `& j# J1 t) I, b
0 g+ q1 v0 u- F, L upp_error_count = 0;' n, c9 ^; V+ s7 G) k. u
upp_dmaq_int_cut = 0;
* ?. ?3 H& M( W4 U // fill in data
( g) D& j. f3 i5 r, Q, |" F, W uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
& H k& j+ q- }: P server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");: n. {( Y( v) ]& G5 U* v5 Y- n- [- }
' c1 Q/ r2 S& K m% [3 ]
// wait send success' ?8 H. ?' u: J/ O" i/ h) h6 R M; R
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
3 N9 {/ m& M& {' Q: L3 G$ z, a
* C5 r9 e& r' z // make data node in free list
- E: D6 W; t" r$ u, D# |) T9 B ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);1 Z9 v5 C% W' n6 j& o/ @
server_msg_send(server, APP_CMD_LOG, "upp send: success");7 D6 S$ k7 J+ X2 ^
}
7 O q; _2 p- Q" ` return true;8 W* y* T, y% e8 F# @
}
9 X# @9 i7 L ~/ H! L3 W+ P
0 T: S. ^0 L( O9 ~6 Y0 M( Q. y% d3 J ~9 } ]* d, H, N6 Z
3 R/ p. H0 n9 z, j0 Q L
0 i" R! B+ D* Z$ o0 V# e
' C1 m; a" s( W) i1 S |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|