|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 G# L5 y. ?# ~9 b
$ g6 m! b0 V+ ]! E! O% s问题描述:
9 c* B, n2 {- K: h% [在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
; i# C3 c% |" r# w- f' g F
( E! r2 I X+ Z4 t* c s0 C; f图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
! E, J& B1 J- ?* j0 e8 b0 m
8 a1 T5 p* g0 v L; q# n. F; z测试结果如下:8 e8 A+ C7 {8 H* N6 f
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?. X Q& C; h/ _
9 U) r0 g$ l9 u: _; _
+ x: a2 z6 ~7 Q$ [备注:
2 {) h) t M! E# a& {1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?, y- j) P6 F- o I9 C2 \
2、相关代码如下:
9 q9 s' u% X) F, @' O//UPP DMA缓冲大小512字节, ^+ W& k* E0 ^
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍# y% S9 v1 v1 T* H. V
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
, R2 H J# ~( v2 F5 {- T#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
' b" P4 X! D" V, e0 `
% G/ [/ G2 S0 h. O- D8 l9 M! V$ g6 i# Z$ P) k$ q
//upp接收、发送buffer
% e4 I; r7 s6 @ {+ ?# c C4 m) B#pragma DATA_ALIGN(upp_buffer_a, 8)
F5 `; l2 u8 q1 ~: k3 b {/ `#pragma DATA_ALIGN(upp_buffer_b, 8)3 [; r, P8 @& D- T$ N0 A7 k
/ R4 {- Q, C% z% U
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];( p3 G. m$ O" q, d
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];% e$ r9 n# y# P, g/ U( x
0 {3 I4 @5 I/ ]8 {$ K2 k/ I
' n1 v* b4 b$ L' Y* ~4 |
static bool server_upp_data_recv(Server *server) " A0 T! U* J. J
{
V1 b$ g8 C" R) Z! ~ if(server->upp_channel_a_recv == false) {7 ~2 \2 x) L1 U8 ]
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
4 T4 Z2 A2 F" |% d1 k" y if(ListMP_empty(server->upp_recv_list_free) == FALSE) {3 N2 I9 @ G; Q% Q) b t
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");5 g$ K* M6 n& q2 W
) e4 Y* i. _9 H; e% y$ O
5 B' h2 K x( f1 R0 i! t7 A memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE); Y: y) l9 Z6 `" D) u
, _$ r3 b D8 ~$ Q- e server->upp_channel_a_recv = true;//* ~" y' C$ A$ L( r' j
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
1 ~/ i! a+ ]8 i) R) t, b$ c5 Y- a server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
" _5 s% l# e. i: G* F server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;' Q, p. H9 R3 w- T& m- A) _
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
; l8 b5 O# @5 X
' d0 J& M4 [9 S" ?0 k' W upp_error_count = 0;
6 O1 P: R* ]+ _6 R) n& m upp_dmai_int_cut = 0;8 ~# k& j, Z+ g" o' H
/ w7 J$ c+ i/ h3 g: o! j& P9 R // fill in data
: H4 X3 l1 I! q9 y uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);/ y2 Z8 y" w; Z6 F8 `
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");7 }. G4 } q8 ~: ^' J$ V! {! R! r
}( P n& L! H. H, \
}
$ e& W4 ]5 W7 a" [. Y else{
( A0 P/ J1 E' o0 R if (upp_dmai_int_cut > 0){- D: [( S7 Q' U2 F4 X2 B' x3 i
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);4 C' q) V$ u# f- H0 D$ \1 F/ r
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
& }7 t4 C5 v9 \1 q4 m* X' _, D" g- y9 q
& P) r4 l1 P9 Q |: @3 D7 ] //copy data to upp_recv_list_busy5 x# _: W: y% q8 |0 Z
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);, d1 J# }8 a2 @8 r& F8 L
1 z% I0 v6 W- k% Q% j9 W
//$ N6 V- s7 @0 t1 ?+ ?6 j4 E7 M; p
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
! Z8 r I8 {1 o# G; h4 A; r& C
: r6 E, C) X V) n ^% V //
$ m0 H& D3 ^+ V, A, x M3 L server->upp_channel_a_recv = false;//
& J) r' ^3 x5 R/ [
: K( r6 w$ _9 D9 z. |) D$ C$ { server_msg_send(server, APP_CMD_LOG, "upp recv: success");
+ S( i$ s, c; n) n7 W }
- A, I/ W, F Y+ W0 o% O; q0 u }- `) n- G! Y2 y+ P* V/ K2 Z$ G
7 u% R! ^8 f4 M2 L9 p9 ?" |2 E; B; h. v% o
return true;2 r4 d8 a/ t; i j7 k
}
; s9 B) Y" V+ y5 ]. ~( H6 f9 Y# N5 m! y6 P
static bool server_upp_data_send(Server *server)
0 K% i! G c+ Y6 y{$ M6 e6 U) {( A0 O3 u* O
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
: L( e" h9 H+ h0 A- G DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy); c* K4 W# E% g1 g+ I2 e
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);9 \' L6 E0 w) H% c! O( h! H5 ]
char tmp[128] ={0};$ V6 T j( c9 R/ ?' i; L7 P
8 m0 f$ O$ \% a- E- U7 ^, g
server_msg_send(server, APP_CMD_LOG, "upp send: start");. c! O ?6 u- A$ g* m) b
print_log(server, data, 64);3 S* c( u" G7 Y m! X8 a
+ n. f# c- }1 }& t
//, \# l ~5 r {/ k' T
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);' q& s8 m9 E+ c! ^% _2 t Y! o& b
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
2 G8 e( b8 \! ?0 W9 n print_log(server, upp_buffer_b, 64);
: |+ q6 j8 ?$ i Z8 \! m+ L& m8 f, D, r. N- p
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);9 ` B$ ^# h2 R* N. T. M2 o
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ! d) B) O# u. \" r8 e* M
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT; k8 ]) j2 m# R6 A/ X
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;0 _' l S A; ]/ K, n
, Y4 m9 q1 Z( y9 ^) i# B
memset(tmp, 0, sizeof(tmp));
; {1 `4 r U& q7 m& I4 R% t6 b( m sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ) ]$ [: o6 b3 H9 j
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);6 I+ T; o3 d9 I0 I5 x N
server_msg_send(server, APP_CMD_LOG, tmp);* @ ] }, Y, A$ {
" c# A( M' h1 k6 X {0 D/ N. H
upp_error_count = 0;: s& ?4 H7 ~1 ]. U) h2 K
upp_dmaq_int_cut = 0;7 P+ h! B* I) e5 O% Z" S1 {+ n
// fill in data
7 K% i5 U; j7 a. W, ~7 P uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
" n" m/ P# c$ {1 n server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
. F; B- f9 ?" ^
3 W! j& T, R b( Y6 [ // wait send success
0 t) e5 z8 a/ ]3 T% P while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
3 T# `: ]" j0 `: w) Q
% ~% L& A7 ]- L3 f# ~1 S% q // make data node in free list ) a( @" K! f* `- r
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
, M7 m$ [% o; V. P+ M# v+ m server_msg_send(server, APP_CMD_LOG, "upp send: success");
8 X% u- X# {' G3 {- W# k5 j( x8 } }
) M& H# E: W' m4 `1 E% x- I return true;
$ R$ c3 R- f- f) R8 y: C: q3 S: A! [}* K5 ] K( G* W
$ K1 r" z2 [( u' P
2 c7 R4 i+ ?+ P- M0 F. f9 e
: _/ r# V1 n( ]' L; o2 r1 a5 U; e; }
, [9 s' }; A0 X$ s" _
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|