|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
' e2 [8 Q5 }+ H$ R, d) O3 K2 o" `3 \+ a0 d
问题描述:
+ A! t+ f l4 v9 {在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:; a; A; d1 z2 s) u* N8 P. t) U; N7 q
' ^% n5 |3 d- z: ~图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。. M6 i- b0 A$ K/ R" M6 p
( H3 M/ _% X0 ?测试结果如下: F( b" l/ x }1 F* u
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?' A) j: m6 a+ R3 H( j* t
- Z' S/ y1 a1 b4 v5 z
# P, p1 s9 u3 O4 g, U- R备注: {; y z% b. K8 ]- K6 W+ O
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?: M, l& R9 r% h0 o
2、相关代码如下:
; I+ q& n4 @2 \/ O; b2 G: P//UPP DMA缓冲大小512字节
) M! W M# v0 q3 }" ~0 V#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍& @4 @. R& M/ Z& ~) D# i, q
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT0 O: E, |! ?$ I4 x( `$ _7 d+ _
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
1 }# k# v- |) \# Z, k2 S4 [; v! v' l# K
, n# {% n6 J6 ?) X0 a3 s
//upp接收、发送buffer0 Q F% J E+ T" {( N0 t) U
#pragma DATA_ALIGN(upp_buffer_a, 8)
- N3 ]& Q6 L2 r; u#pragma DATA_ALIGN(upp_buffer_b, 8)
; \% ^) l4 A# b" b- r! G) v \ }
( J$ x1 X' P, [0 i8 H$ w0 H& xunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
G$ B9 [& `3 G5 ]( n3 D6 l) @unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];, Q6 \1 f( }: G
. u5 c& `8 d1 {2 A- n9 V7 \
! }: I+ _5 K0 a. w, y% t9 kstatic bool server_upp_data_recv(Server *server)
8 l# h+ N1 W. j m( {' u{* t% Z* m5 ^: b& S# c
if(server->upp_channel_a_recv == false) {6 O/ ?; p5 }5 z# g- C
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
$ U& p* g$ n( X* Y8 D( f if(ListMP_empty(server->upp_recv_list_free) == FALSE) { S$ }+ n) q6 P5 y' V
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");/ E0 ]( d5 ?8 i0 l* S
5 Q. k, Y+ V( q( S2 ?0 Y' c2 [; y8 n# I
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);0 N! ~" t4 ^: L, Z* U6 z! O
/ `0 ]7 y3 s2 G$ A
server->upp_channel_a_recv = true;//
8 s& E& w/ A/ S$ c; } [* o( B) L3 i server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
# T. [' D4 w4 n2 E" z, w9 a1 p. n) g server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;3 }9 t1 ?* j' t+ f' q* ^
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;3 @, j- a6 t( d2 _
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//% @: [- E; u& |& N7 x
2 T9 N7 ]- Q) b. c
upp_error_count = 0;
R7 @, `* U F5 v* H/ |& P: Q' G upp_dmai_int_cut = 0;
! X' c* E$ u( y& B4 L# F( w
& t2 ~3 P5 v; F8 Y1 [0 _0 B // fill in data % |. p4 W; {1 M& e ~2 ?# j; o
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
" ?* C9 t \6 R% g. R$ p server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");2 Z+ D$ n& F4 _0 y K1 S- p! U
}% z4 g/ x' R& F; |
}
* e5 X* e+ }6 l* K else{
7 y% e! ^0 v) @4 E9 k5 [- ` if (upp_dmai_int_cut > 0){
# I, I4 g9 l( c! H, c" z DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
4 Q+ ^. x% H6 e; P Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);' P, c) l) K3 \* o" _
# g# y B8 I& N
5 B6 u3 R0 M) k, N$ u1 d //copy data to upp_recv_list_busy
7 b t$ N4 N' B$ |' d8 r memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);6 P* {5 d) E" S( J% S
# s$ b: l* _9 W% `# \* v
//
# r5 }8 ?, d$ X4 P ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
: Y2 O# ?' x8 H; ~% R4 V/ _0 U* e& Y; g7 C* x1 q5 c2 O# q- g
//6 N4 p" ?& A9 B' u1 h& K8 x
server->upp_channel_a_recv = false;//
' f7 P! e0 Q3 `/ J: ]7 D, E# ~0 Z- {& |; ?5 C' _; \/ |% p. m( m$ y
server_msg_send(server, APP_CMD_LOG, "upp recv: success");: A, n5 Q3 m. H2 b
}7 A7 A* k8 U, i# `9 v" i" _& V. ]
}
; U+ P0 _9 T" ]- L& D, ]# y) Q0 n" e7 E1 J
$ C" e, V+ G, r! z* S return true;
+ T; s/ v3 }2 a$ G}4 c/ o$ Y/ |% g" J+ q6 \3 b
# z6 ^6 E. h& o+ r. Estatic bool server_upp_data_send(Server *server)( N3 [# N) s3 u6 W( U
{
! F0 j1 M0 z) S if(ListMP_empty(server->upp_send_list_busy) == FALSE){: @% t' Y% m2 L1 R* [0 v& B
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);* O# d9 Z j3 `: V i, U
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
( P# ]( \; G p' U# g0 n char tmp[128] ={0};
: Y/ ~: @7 Z9 u5 V+ f* f/ U$ B E" i+ S% Q7 D+ ^0 @
server_msg_send(server, APP_CMD_LOG, "upp send: start");
; Q' [- {8 W! z2 m, k print_log(server, data, 64);- H l1 |9 s; ?# F; X9 v
8 S/ F7 i% m T! s8 x
//
$ P& k( G; f0 _- Q1 Q memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
+ e- f. K" t9 h6 V memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
8 Q! ~" T4 A4 I/ \2 K: O1 D' \2 B% W print_log(server, upp_buffer_b, 64);4 h8 D; g A. `4 u/ Q- a3 u
2 ^' o8 X, U1 Z/ \9 ]. { server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);2 i" M9 e% M0 l6 ^% e8 d
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 4 E3 n" q1 ^2 g* ~& @) q
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
' T3 L" V$ Y) l F2 F server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
h7 T& ~# m3 Z5 q" c; g u: F! T( ^) u* H- f2 M
memset(tmp, 0, sizeof(tmp));- `: g/ [& ]2 A4 D
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
/ ]! m: B- ~& }6 l- K sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
8 V( Q7 p% P g- N. l( @ server_msg_send(server, APP_CMD_LOG, tmp);$ V! t& a2 s" W' T& Z7 O
/ }3 j- i% r. L# r4 C* D5 G upp_error_count = 0;
" j9 O& ~9 v& n7 g% [1 ^4 Y5 D upp_dmaq_int_cut = 0;1 H$ @% n( l2 L, z
// fill in data
3 Y: W9 l J2 J' s2 R uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); - F4 \$ W! E5 ^4 r7 ?# v
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");1 Y" F y. Q* i$ S0 r2 k* O
+ w6 h7 d& k5 o& F% R
// wait send success5 \+ M* k( g2 P; Q" m" z/ F
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); - s4 ?# h& d, t( q5 M, [
% l* L& p Q% S3 {4 | // make data node in free list
0 S0 v4 d! M* M7 l) c ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);9 v. h: y0 D& T ~7 v* s3 e$ X' E
server_msg_send(server, APP_CMD_LOG, "upp send: success");
$ f; l# Y5 d! {) d$ q! ^5 j0 j }7 {$ H+ t& @/ k& D
return true;
3 K/ s, s, |6 J+ R( [- x- g0 c}! E+ Y$ s0 f: H* w& K
# s- N! M0 d4 e5 N8 R& b. z
0 P+ _( ^/ X) S, B3 o. _
$ ~! m2 p# E% v; Q% V0 u
" g, Q+ [: x3 W# f6 P" e5 U* O5 s
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|