|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 , I( g5 {/ @, T2 r' X
, |4 W- f$ X7 o+ M3 Q) l7 a( j
问题描述:
* z7 s& b* i! _+ M在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:$ m, ?( ~9 @- {/ D/ r
1 _* m- T8 P* p2 d
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
% G* K) N+ R! Y1 g% ^! I# G
3 R- O. x4 c$ m* x8 V8 u) P6 x测试结果如下:
9 v( L5 \& Q* t- y2 n: E138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
2 `+ q/ d: o3 r) z4 g( p* c. u" n$ |; B# @# [
( |& F# i2 M8 ]0 X5 J备注:
' v9 l. f+ s0 `2 p6 o8 q1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?* A" P+ @& v, o y6 j8 U6 u& U
2、相关代码如下:
1 k$ G# G# R# u3 D) Y) N//UPP DMA缓冲大小512字节
- _2 A% h1 _( }5 r9 ]6 j#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍/ J2 }& l; I: m% F
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT1 o4 X0 J, x* k
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
3 P8 W1 _2 g5 j4 Z! y# H) @
/ ~( V' P+ O0 M4 I; D/ L# [: Q1 B; O' F! P
//upp接收、发送buffer
/ O$ g' r9 Z! g) h- }/ x#pragma DATA_ALIGN(upp_buffer_a, 8)
- ]$ i4 y: M/ Z, r% X Q1 x- }' a#pragma DATA_ALIGN(upp_buffer_b, 8). [; s* T5 N6 W: u' q" t! Z
, e$ H) \4 F. V( I& q+ f. Q, o
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
/ C5 ^8 p% Y& e8 ?8 Munsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
- T0 o7 o0 o3 j
5 v3 n. d* L8 b6 S% d; p& D5 R
- C% @/ j% X2 t# b( J" n* Astatic bool server_upp_data_recv(Server *server) 8 t+ V/ Z2 n+ H+ x/ }5 b/ ]
{
, t+ t. {0 t; ?" R$ S- R$ L( v6 w if(server->upp_channel_a_recv == false) {1 |; X0 U- D$ n, {( I1 s0 {3 ]
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
& g) H. O5 G) X7 N$ K if(ListMP_empty(server->upp_recv_list_free) == FALSE) {" W6 r4 n9 `& ~: G
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");0 L- r6 |/ i& I4 F# k2 Y5 L
# \/ _* o0 D5 v8 P0 D( @
, s1 K5 @0 q! j1 K y2 `* S memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);6 I5 e4 E# c1 r, b) H3 e
$ q" m7 ^4 ]! m1 ]9 \& v server->upp_channel_a_recv = true;//9 z* S: u: k. T
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);, \& N/ w+ Y2 Y( A) Z/ i
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;5 `2 \4 `4 S! D4 ], |
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;! L7 J3 t5 r$ e; t& c+ U7 z+ [; h
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//8 Z9 e6 m# N: _; n; g
( v2 j' n* t0 g; A+ Q( y, e
upp_error_count = 0;4 ?1 I# v- r% Y( P* t
upp_dmai_int_cut = 0;4 X P! R: p T1 g( R# W+ {+ O
, C% b4 E1 ]7 q- [ s7 R
// fill in data
, }0 v4 l: K: G q; Q! R uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);) S/ P. s) w) A# A% D; P/ ]5 {$ y
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");" w6 G; M7 ^/ D. q
}$ O; _. f8 t2 q$ e
}6 P4 K& ?' [6 Q0 R% _! b
else{! a ^# o/ K; i
if (upp_dmai_int_cut > 0){, v( Y7 T! I3 Z+ {
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
: m; I( n8 U! z0 u0 j8 E' ` Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);4 Z. ]: D$ `6 Z7 ^
' x2 q5 q( A) [# W) d9 }* ^ H' B% E- L; @, Q# k8 H% s
//copy data to upp_recv_list_busy; I- w4 |3 |% d# A z9 P+ i
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
/ z6 `: ~+ S. ]! H# P
) [4 h1 P- T5 O7 E3 a6 E" |4 X( s //
3 F( B# r8 _; q* L9 i- i& L& |7 X ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);2 W" p e' e; s( v+ D
) W2 ?' K8 n/ ]" m% Q/ P //
) \3 m4 a! `7 V3 y4 l f7 I server->upp_channel_a_recv = false;//
% k7 |9 |. R! \! i6 e4 h4 A! y0 y8 K* A" u
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
/ T) V3 d$ Q: L9 s }! Q8 N5 E0 S+ \3 a
}
6 V- O* |" g7 X( i- Z ^. ]* Y. {& f# f) F X# b
; k; q, q# a0 K$ s return true;
. q0 @& X- R; l; o}
' g8 }/ B; c* q7 a* |5 b" y/ M! D8 \9 q; P: H; s% a
static bool server_upp_data_send(Server *server)* k3 N! m3 H4 h
{. f0 l3 p1 ^& o P. e; e
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
: Z) i! L7 r6 C" z( B DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);4 b* A7 r! y, q7 z2 T# \
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);, Q* y6 S3 p( z, Q% @
char tmp[128] ={0};. P( n1 s4 |+ H+ C1 ^) f1 y
* P. k& d8 j$ d- l# ]0 p! M0 d* c server_msg_send(server, APP_CMD_LOG, "upp send: start");
# \. t2 w: u; N5 @ print_log(server, data, 64);: u5 b( B7 J! Y
, W2 M+ X0 G. Z( d1 g7 F( x1 B
//
2 G- f) K; ?( j4 h9 c memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
& M: A: @! q5 D/ j& l memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);: W$ [( W! ^: p. o: f5 N
print_log(server, upp_buffer_b, 64);# @* v8 n! X$ j7 r! z: ]$ Z, n
6 R. v. n; r1 M& H0 Z) b
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
' t9 b5 ?8 C6 ~5 p) [3 j server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
9 x: ~1 P) n2 T+ u i server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;. f3 ^1 V: W$ g; ~9 c
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;6 i& k6 v! R5 e, o
% K! g. l8 d0 x" N( r memset(tmp, 0, sizeof(tmp));
! q3 G# z- }+ t! E7 H, N" M sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
! [0 o* a9 [) {4 Y4 C sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);5 o7 U* [% e& [0 j
server_msg_send(server, APP_CMD_LOG, tmp);
, o( h3 t) R1 [9 j
. ?7 P( u8 {+ R upp_error_count = 0;1 F: r/ M3 L' s: s! H1 |
upp_dmaq_int_cut = 0;' p) S1 k T) ?- [0 A
// fill in data
, }, y. R" \$ F1 j' g uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 1 Y# ~# h6 h% U+ S% F; K
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");' V. m. m) Z# I* i) V
) ?! {* D$ i" }! S9 j& |% u
// wait send success$ H, S$ c7 h( [/ W9 N/ w4 @
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
, ~% k5 D: I4 e0 W8 R; j) f r$ V
4 ? S! h' B7 T+ ^. H; |& ]5 M // make data node in free list
# H% V4 Z( Q8 T k9 w3 }* S( \8 i ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);/ t+ c# Y* l9 J" U, o8 l; r8 a
server_msg_send(server, APP_CMD_LOG, "upp send: success");* n5 H" r! X6 |
}
7 S: {$ t5 ~) a, f return true;+ w: Z6 s, q1 S/ U. ?0 i' G
} r& R2 X7 J( P8 _% K1 j! e
4 c( u6 Q9 }! D; u- W# e$ Y+ O$ d% p% o' R
' p0 w$ {! S2 t" C b; ~
6 {" p6 S+ f8 J% X- G
# s9 S: c: {# J) G0 Z) h8 u; h( j |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|