|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 % l$ u4 z- J. ~. H3 N
4 l/ l6 C3 u$ l) ?7 ^9 H问题描述:
6 Z9 m7 ~: P7 T8 G& ?在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
$ ?5 m: ^+ B. g1 w
3 m- H- C, u6 v4 W图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
1 U2 s/ K: D6 H9 D. K% l c; q. h3 U' ?
测试结果如下:
% g' C2 F0 t' J* v& q- C3 ~1 ~138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
1 E5 t' m4 |2 X3 k* X' F& t% @: K9 D( L0 f& k* I9 R4 j! D
- W) Q& | G* Y; A) N
备注:
: ~. A3 E- V/ d6 ]5 d8 I X7 E. u1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?, X: q# R% K4 z$ _- j" {
2、相关代码如下:
0 V) _6 w! X3 c& V2 p; v//UPP DMA缓冲大小512字节+ I) ?; H1 @) P% K! _: Q
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍! ?1 L8 V( s; u5 C1 q! N5 X
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT; J& ^; ]) J/ ^% ^/ X( D! e6 N
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
# h* K- S2 {* M
0 @9 t, u0 ~! L# v3 A* b
4 v$ o2 S% r2 J- Q" B7 u//upp接收、发送buffer1 B, P1 T6 f& t
#pragma DATA_ALIGN(upp_buffer_a, 8); y8 | {5 ?: P+ X8 c: z
#pragma DATA_ALIGN(upp_buffer_b, 8)
! @* A9 w& v6 o2 ~" t" f& j; E' L' S+ q. Y2 t
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];5 T! B' z9 |9 r# v- _
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
8 a. [6 C9 B) Y8 Y% M
% k' b) u& r6 ?: O3 x4 N" m8 w+ U+ w
static bool server_upp_data_recv(Server *server)
; V' i3 X0 j: P{
8 {0 T' p3 Z. @! O8 g7 L' w: d if(server->upp_channel_a_recv == false) {
: a& g( @/ R! x8 ?1 h& f server_msg_send(server, APP_CMD_LOG, "upp recv: start");; g: t2 h3 P0 H% n4 t4 J
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {' A6 p; i# ]" H* Q% ^# `& A3 T, {2 F
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
6 h$ K. _. y, x# K+ K1 w- n8 P. j1 E
# o3 U- q. F/ n3 _7 E" U memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);, ^! {/ U/ ?- A) R+ V2 }9 q2 E
1 T0 M. T6 K7 j8 s n9 H- @/ R server->upp_channel_a_recv = true;//
. C) a& ]' E) A( |2 g6 T server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
+ B2 \# l/ e6 p& M server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;: e0 a }" W& Y/ J
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
, {( L" ]( _5 n! a$ i* E N server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//- b, ~. ~6 ]8 O% ] t2 I
5 T/ C, k+ b4 V6 Y" W upp_error_count = 0;0 L% w$ B% a) C: {, t6 L9 O3 l
upp_dmai_int_cut = 0;
1 |, K5 r1 w- P5 Y. u% b; s
, F3 G( _) U/ o // fill in data
; t6 h3 I9 x( m5 y uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);9 X9 N" p5 w0 \7 V2 _2 U7 e8 N2 {
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
* g& u6 k4 d0 q" o3 z }9 S4 C! h, j3 C- M% ], u
}* c o8 B! y; z* P7 I6 w
else{
& r+ C, V# ^3 E if (upp_dmai_int_cut > 0){
9 H# l8 _; Q3 R a, T: V% o" e* k DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);9 B! @( V! \/ j) I7 x t% L
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);+ Q( k# V' n5 J% ~, M9 ^
; G$ @+ L% |0 P: b$ M
+ n, N5 n( _7 N0 [4 @0 _' c3 } //copy data to upp_recv_list_busy
" a4 I9 S+ ~4 ` memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
0 Y* V# H$ v9 V! \6 m1 ?2 P L$ N# X
//
4 z7 W7 S0 m' X8 x- m$ B$ J/ ?& I ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);8 c$ e+ D! I5 R, ?
, k2 z# k$ g$ O) G7 W: Z
//
7 G2 B% t P3 Y4 n+ l server->upp_channel_a_recv = false;//% t6 H7 R; S% ^( ~$ [2 `% h
3 P7 ?: B) E. ~& \
server_msg_send(server, APP_CMD_LOG, "upp recv: success");1 f, }& ?8 P [* B% V
} o4 e8 _& X1 K% b
}
, l$ |; S% ^* D0 h9 |3 |, X E, y: P7 }0 \7 ]; }9 L. Y6 [
7 W0 S/ P/ R8 `& w b2 j return true;
1 O: A3 A2 q7 H& ^$ |7 _& d}, |8 D0 j3 G: ^
9 K& u" Q2 D+ q
static bool server_upp_data_send(Server *server)
" s* V1 Y6 c1 o' k) _{% K/ Y* T; I [5 F
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
; T: |( C2 P& Q6 e DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);6 n" n* `; d h, X1 |
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
) x0 |- G3 H# g/ N char tmp[128] ={0};
5 ~) [- I/ S$ |% K5 F# Z8 q S& {3 X8 q5 `0 L# B3 \
server_msg_send(server, APP_CMD_LOG, "upp send: start");
1 s, a6 G# Z8 x& l print_log(server, data, 64);
9 U6 G n3 ]& P( o: H* S. {4 a# d5 V6 G4 M. M1 ~. K
//
) h# n, _- w1 h1 r7 ~# X" P memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);( N' k/ \- u, @ F: i! K8 T- T
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);' o/ T! M! h( R0 m
print_log(server, upp_buffer_b, 64);
$ @" C4 g+ b' ?( J" K) Q2 s0 K4 e8 s4 \. \9 Y( d/ V Y
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
9 p( u2 F8 e6 b7 `+ e server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ; ]: W. X. }/ G3 D% O2 {, w
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;" X6 p8 I# ]$ Z( r( L
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
5 C, b7 C+ ?' a% U$ q
0 b U9 _3 k" j7 p memset(tmp, 0, sizeof(tmp));9 C. n# \( U; @5 N& }4 X- B
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
; L' z1 y5 {+ \ sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
7 C& }% b6 Y* r2 J" X7 ?7 X server_msg_send(server, APP_CMD_LOG, tmp);1 \' s% N9 \3 h7 R4 `+ q3 k8 w( @& U
/ p. M K" I' z0 n4 H, C upp_error_count = 0;: L- m( x) [" D3 X4 A0 k- C
upp_dmaq_int_cut = 0;9 n$ N' u' v3 u# \, w" V
// fill in data
- t0 N7 \# T2 k R: a uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 1 C5 A( u0 T8 ]
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");0 w* E& L l" `( j" n& \2 g
! [& Z+ q* Y3 J {! m // wait send success
0 H" O. L. n* G+ t7 K1 c0 m while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 1 Y a! w! b- B. c
8 \4 O5 y: S5 M8 n, b
// make data node in free list
0 A3 }0 ~4 \7 J; l9 n W ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
2 C5 s- a: r* {4 |1 k; j( W server_msg_send(server, APP_CMD_LOG, "upp send: success");7 j0 d9 S& G( r- D+ W
}
2 D7 Y0 ^. Z$ k9 K return true;8 k/ P, s; l! i7 ~
}& C+ `8 y* j' ?0 y) n1 H! Z
- W& X& \- x1 ~0 Y8 a8 G/ g( \ ~
* x# n1 y( s$ n1 _9 }+ I" G, G' d# v; Y* L( s+ T% V" ?! o
: ^& ?0 y6 p; O
" c- r! J. W/ {" Q7 U |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|