|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
# P; T" i$ u% j" b" g& v
, [3 e: `# V/ E" ?' m5 P; D6 T问题描述:
% S7 V( K9 r" S* [8 M在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:& p3 G/ ^7 n2 ?/ P/ D+ D- V
2 _; _6 _' M! s' N图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
5 M7 c/ b8 B) `% B! c+ e$ f
5 g# h: |2 J& U' ?% q; C7 ?测试结果如下:0 k! d T) N3 I" x) s- e$ S
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?% \' v* q( _; P1 G4 |
0 C; z7 i" y+ q6 v9 D
4 [" u3 X/ g5 {) s9 |3 g. E$ }备注:
$ U6 E* K- K$ k# W) P1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
4 E# u( S9 {# h4 Y& {1 x7 _2、相关代码如下:
) ?/ C' I% L" k5 n+ x5 V2 Y$ `4 T//UPP DMA缓冲大小512字节: p8 ?) B' v {* |6 ?$ Q! Y2 Y
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
- F3 s, U. D/ k2 L7 }9 M" a6 a#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
2 x, v8 ~, p; Z1 l7 u#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
3 h$ U S: o# a1 t1 _2 L, P! t4 s( G# G4 n8 P6 M
; P, X; f8 t" _
//upp接收、发送buffer
) R. X/ A) e3 v6 @' K" x4 Y#pragma DATA_ALIGN(upp_buffer_a, 8)
) U1 M0 g3 ?2 q#pragma DATA_ALIGN(upp_buffer_b, 8)8 a1 o8 H! r) q" G6 x" ?- g
; e3 m8 B" k4 F& B8 B7 ^unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
5 a( ]! X2 ~5 L: Cunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];' y F3 E6 M4 P7 r2 e
! H0 l$ @: _7 K. c; E/ e
7 ]0 ?. E! i$ z$ s5 z" Dstatic bool server_upp_data_recv(Server *server) & X" T# K6 e: N) H2 } Z* ]1 u+ U
{3 `6 X# W6 I- m9 n
if(server->upp_channel_a_recv == false) {
3 E6 X3 B7 \+ k4 Q server_msg_send(server, APP_CMD_LOG, "upp recv: start");
F7 n& h, R( Y# i. e if(ListMP_empty(server->upp_recv_list_free) == FALSE) {$ g- b' T2 G! B
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");$ L' r$ k. t$ U# F2 c& _% x9 Q
$ G5 `. [ y9 v7 w0 C: e( e! Q. J
; m m8 u( p: @ memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);' l$ L0 V5 _* `
* e2 a* i: X4 {: V2 E0 L server->upp_channel_a_recv = true;//
, }8 S3 j) w% ] server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);, i: P4 W4 w3 r# I& W8 c8 T
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
5 v) b: a9 e7 A( @, _ server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;( G+ B; f! y* ^1 J' W- v$ I
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//7 @1 r# j3 U% q% P; E: W
7 y3 T% S& [$ i6 r& P upp_error_count = 0;
7 j4 \8 e2 [; W8 m upp_dmai_int_cut = 0;) @0 V5 t+ d' |
8 @+ O! w6 t m1 Q% N7 o // fill in data - G- q# e; T: C# A: U
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);) O r1 M2 U0 M' X0 ]$ p, C
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
( a% g: L1 o/ t3 r7 k& A }
8 Z; N5 E& `3 C/ ^5 p }
& I1 K9 |* E5 v else{
% J+ @$ Z8 [& x& f+ ]- } if (upp_dmai_int_cut > 0){
9 g- w8 p, i; I, b) P* A( Y DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
4 F5 w# _0 l! ~/ t4 m Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
. Y* d8 I, r& f: g
+ j) B# l8 r) z( X. f! R/ ]2 O. @; u. R# I6 N$ W% ^3 \
//copy data to upp_recv_list_busy
& }1 r6 F7 M+ m$ _; M5 _/ h memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);" I$ K4 @7 j- f+ G
7 [( z% U0 R" {
//% P! D/ Y. b) d
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);( A. S: ]4 M8 I! z3 X5 I. v
$ v( X, x7 D! y1 x
//
' ~, f( w# ] G$ ~8 o# Z server->upp_channel_a_recv = false;//
" ~9 F# W1 F# |
. R; w9 d9 m6 O5 f- w server_msg_send(server, APP_CMD_LOG, "upp recv: success");# T9 G- b# c5 m1 p( m% D% a Y- j
}
3 q4 V. I" W) b4 c2 n: z2 }/ F5 x) ^ }
( L; {( A- Z0 t/ _8 z9 U- R2 Y
0 E/ {$ G: L: D* U
2 G6 A# p. g4 H. l return true;# N! ~3 k# O/ p+ Y: `% U8 B
}
2 b k! y- N4 {
4 P# W% a) N' {. d+ Ostatic bool server_upp_data_send(Server *server)
. T( R2 o# M) p; B% B8 R8 L# a{
o" U1 T" R0 r+ N if(ListMP_empty(server->upp_send_list_busy) == FALSE){
4 _' d+ j/ P# x DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);5 ^& u$ Q9 B b# P( Z/ a. x8 r
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);. q. J9 h! }! w' j* o* X3 R/ F
char tmp[128] ={0};& l/ c, e, s5 y* S% P% h8 k3 Q% `$ F
6 H* p5 e3 [/ `) h: V: P server_msg_send(server, APP_CMD_LOG, "upp send: start"); w, G( o( ^. E- [) i
print_log(server, data, 64);
: \. W" ^7 H' f& e
" ?8 O% s$ I3 X //( j' F9 _+ i O6 B% f8 y
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);9 }! I+ \6 C* F
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
2 f$ r- ]9 I, s print_log(server, upp_buffer_b, 64);; @; {, H! @4 G* k% [8 u
' V, `! K5 i; C7 W server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);1 M3 d% O0 Q, I9 @7 k
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
5 r7 s, I; P- c' t# b" j9 d1 }) i server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;# x8 u7 u% \% b/ h8 B5 g8 @- D" o
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;3 Q* r) i' I6 Q6 ~- v7 ~1 Y% X% c
% F' |, M& N+ ]3 F. f
memset(tmp, 0, sizeof(tmp));
" @' `$ `: b# c$ T/ R sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
/ D! Q, z) K) I9 W" I sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
9 D6 j3 P& r9 d% L# h3 m% A' y server_msg_send(server, APP_CMD_LOG, tmp);, k1 ^7 K. Z: k8 v }) g6 F( V
& z/ w' G; P7 `2 T8 p upp_error_count = 0;
% n% Y# k$ w6 T' Q$ C upp_dmaq_int_cut = 0;0 S& K* R! m* z3 O* }
// fill in data 8 `5 k7 f1 k9 S
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); / t D9 g8 A- i* O
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
6 t; V, _% ]# r" [
# J/ x C& O M: s* U // wait send success
7 l6 r$ L+ O$ Y S. f- @ while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
7 ]4 N7 g( X7 v1 E9 g: D& ]0 P, X+ Y# `' r
// make data node in free list & g. _2 X8 C) v& X) W* h/ r! d
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
2 N6 c0 y6 E4 Q$ i' V server_msg_send(server, APP_CMD_LOG, "upp send: success");! e z- o1 C% _$ O) w! w Y- }
}
, M T% l$ B) a' j1 f! W6 j& K return true;& f7 a) b% p3 r* L
}
7 H6 \' J$ H( E, b0 ^% b, b6 i0 ^
* F0 v5 R% o0 i( b# f3 x: T5 m6 C" C, b4 c1 R' @3 P) ~& m% U% \
) s: J5 x" H8 ~- \8 u; r: E9 E. Q
, p6 a; ?+ L& D3 P5 x( q$ H2 h
- U& _; z8 Z0 Y0 C( A! ~ |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|