|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
5 E6 E+ g8 M0 l, d& C( T% Z: J- V0 l) v' f0 e* @- j
问题描述:
9 ]/ F3 k! ~1 R; l在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:1 Q- v" t. M* _/ y4 w3 o) ~! [) ]8 _
7 Y4 E# A: V: A2 r4 ]. x' d+ |1 I
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。; y# I1 z% v G4 k: n
+ v8 c" N" d% {0 \: w测试结果如下:8 k( x/ O6 }( {' s7 B
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?: m9 ~8 J, {2 V
' h# i! C5 l+ e) t/ s: ~
9 o. G' a! f6 H' ?备注:
) e+ m. i, K% B; j' Z4 m# } W1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?8 Q, z8 z5 c+ B! I0 ?9 ~) r
2、相关代码如下:8 |1 ?+ s, j0 n- z _
//UPP DMA缓冲大小512字节, R( M, j7 v# o
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍/ |6 D7 ]- e7 F5 w% ~% B/ ]& J. P
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT$ E9 ?& g& @1 r$ X2 R# d! `/ T
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)0 d6 T: h3 D& R, N4 I' N) i
3 V: \% i( g7 i Z3 b% F
+ h) l( [% c0 T! `" z//upp接收、发送buffer2 F3 ]) p% D8 M: f
#pragma DATA_ALIGN(upp_buffer_a, 8)3 E- C8 N5 h5 X E$ |
#pragma DATA_ALIGN(upp_buffer_b, 8)
4 v% S# K2 N$ M6 h* X1 z9 \) E% g6 v; e K! C' Y
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];/ X& e5 k; x$ @2 q; C
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
' @% G( \! Z% I5 E" [$ F8 i8 b# I& r0 `9 ^: N) o
: ?; D5 j* \" Q+ @- G4 P
static bool server_upp_data_recv(Server *server)
$ _" Q. z/ C [, e& W{9 q6 l% T. X, z) F2 I
if(server->upp_channel_a_recv == false) {" Z2 I2 b& j$ L* x7 {) m7 {
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
0 ]( h8 w0 h! m- B! g if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
1 U: n: v4 u1 m! _# u$ p server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
2 Z: `( `# G. S( z( |
b. K3 N |$ j
9 j+ @" Y2 L8 ^# Z1 S' P memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);7 l% J0 W7 M& s- Q, _
( u5 S$ Z2 M2 q' `' }
server->upp_channel_a_recv = true;//
& |9 O2 m, m r# P6 } server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
- T% r j c6 R& _% }+ l server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
9 X9 N" I7 M3 M. K o2 M3 k6 w server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
5 z* e$ R/ M+ _& n9 e4 h! m server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
( F# L1 `1 b! @. R6 H. A8 z- C# }) L: V; [# z
upp_error_count = 0;
1 {3 W8 `* k: P; D( h- n( V( x# _ upp_dmai_int_cut = 0;" ]1 r [$ k5 g; x: F$ i: j# |, t
, X! C D, c4 l
// fill in data , Z+ S/ U. m0 r1 |- K" x
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
7 n% W$ R6 I/ f( _: S3 x server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
$ j* @6 ~ q5 }+ U }
* ^0 U( P. L L }& g' V4 b. J/ G
else{# U$ y4 |3 z' x7 y
if (upp_dmai_int_cut > 0){' n; f* f, P5 i- j; _! s) |
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
1 Q- H3 S$ `5 {5 `$ L Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
# _+ j0 n- a( g y4 J
% U4 E( M3 \$ B2 M# k2 S) l n% d# a2 I7 g; t1 n: I
//copy data to upp_recv_list_busy
. [6 i' [) @) r memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
+ P3 W2 z3 V; D9 I2 J, {# w# q6 w: {: R: m6 y7 D
//+ I, b# O, V; g" t
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node); N" v7 P' F d7 X/ C. p
+ x1 r" O6 n# `+ V1 n# J9 ^- s' `
//
" E! g8 b+ ^6 d* i# Q server->upp_channel_a_recv = false;//
+ f/ i& w% U* N' b/ E
. }( D; c+ y4 {+ ]' T- l; w# O( ] server_msg_send(server, APP_CMD_LOG, "upp recv: success");* g" p+ ?/ {3 R2 z$ C
}
. T" ?% S& g, u3 t+ o6 ^ s }. x6 Q- ]9 {" e
# x1 @( C" @" o5 S; ^. C6 M- Y) [/ m& H; U) N( |# f3 Z
return true;9 k9 P; \+ d1 y/ Z3 Y) G: Q
}
4 ^" }: f5 H" X# F
9 X g3 a$ c' k T9 u, `static bool server_upp_data_send(Server *server)
- a. ~4 G) i# l( b0 o, O! Y; A7 K' L{
; S8 R( q; y B/ B+ f if(ListMP_empty(server->upp_send_list_busy) == FALSE){
2 s5 l+ \, f+ M x9 C DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy); }2 `4 P6 O8 o) M3 y
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);, T: ]) N* t( b, M6 L
char tmp[128] ={0};
( H9 h4 f2 H& v( _6 K, V
7 P; \7 A! Y7 A server_msg_send(server, APP_CMD_LOG, "upp send: start");
% x# x; j8 u8 E) } print_log(server, data, 64);
k2 ^# |! H% l. g: a
( W& t2 H. _ N //& L) L. S8 v: e, x- J5 @4 a& v" b
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
9 D; ~! S2 ?2 S6 y6 D6 { memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);4 @: z# O- [: x) Y; K, n
print_log(server, upp_buffer_b, 64);
' H+ D* b& k9 p7 H E. d) @- `0 d
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
1 K2 }& U. Z9 E. x server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
7 ~1 m5 M) ]5 ?. C7 M server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
' y: D* S0 j* k1 P" n" @" W" `1 g O server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;3 q( s1 _( [% N9 H3 \
8 t$ {' O \& v2 V1 k7 s0 V' K memset(tmp, 0, sizeof(tmp));6 h0 F$ S- Y% n1 Q
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
3 e, y0 f, ?9 V$ v' u1 q1 j6 x- q8 a sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);0 u' R- w& x3 X" n9 Y; U; h" [
server_msg_send(server, APP_CMD_LOG, tmp);, \ t1 ]3 F- B" @( l+ Y) F# u; ]
* F( `; c8 B# I. T* }. s0 s! g# ?8 @. z+ P
upp_error_count = 0;
& X4 s# {) B+ V" F upp_dmaq_int_cut = 0;9 K" \1 ~0 {% U ~ x' }
// fill in data # x2 S( { N& X( {+ r
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
! {7 w* U9 L1 Q1 G server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");- P3 K, s& A T6 t! V
6 w, E# G% q% N2 D1 c( U% E& i/ w // wait send success
: t$ v3 Z' ^3 W% i while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ' j" s% e% }, | V; p! f4 V$ {
, d& D* D, I: E+ S9 ^, O7 e
// make data node in free list # z; g. q! P @3 f
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
0 Q( p& }( s% c$ i9 J server_msg_send(server, APP_CMD_LOG, "upp send: success");
) m+ V' _0 C1 O } E! X! {) `! J, z+ L% u* q4 R. D
return true;
8 Z/ N1 E: m% }$ c- m6 i}
6 o$ P+ [% ` G0 A" i
/ g5 x( z( Y# ~: w
- A9 v5 t9 X8 M& R
' q( b& [. e1 T- m& E" Y: C1 c% i. ~+ B' Y3 ?+ _
9 Z0 q$ Z& m( r7 m2 ^9 u
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|