|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 z! S8 M; k. J5 S7 f- o4 O
, B4 T# f) z/ I/ \( B% ~
问题描述:
7 K" S7 k; h( K6 Q$ W在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
2 h7 J. k7 o4 Q
& Q- k0 D: {! m7 W% ]图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。. i2 p0 Z6 T7 s q0 B
4 o) m* _) I3 K7 n, U& Q测试结果如下: a9 W3 G7 L2 q" z5 b# k. R) p
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?7 Z8 q* ?2 n* A) ?3 w& M1 w6 S
' v4 d7 c4 ^/ ~2 C2 r' J
3 R1 ]% s1 k# ]6 K, `) M) a( v0 s$ ~* |
备注:
' s" u0 u9 @/ R- ]$ \4 w, |- i- \1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
! }, I) E. _- f/ y( b; s/ T" k1 ]2、相关代码如下:- W' O+ L" s# I8 G, G( T, N8 ~
//UPP DMA缓冲大小512字节
+ ]+ O$ M" |+ x, T#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍% a' f I, n" i2 p6 D
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT6 z4 j, [# q8 G& \/ `+ ~ V& ]
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
# D4 o3 P5 g1 `8 A4 m2 c
\9 Q4 G- ~$ n4 O3 }/ m$ c
7 ?" y0 Q9 A! Q( R' Y//upp接收、发送buffer
1 A! o( s0 ]; M0 }2 x+ R' c2 [#pragma DATA_ALIGN(upp_buffer_a, 8)* N$ s/ [( u5 t* a# |
#pragma DATA_ALIGN(upp_buffer_b, 8)3 C l. H) |! A2 U' Z; S+ h% S
* e Q; A' {$ m% |: ]2 L5 h5 h
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
# T, @9 n6 ^! ^1 Uunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];, m! \- a( `+ [% ]# U8 i0 ?
3 Y1 H5 `; T1 n" S' u
5 {9 ^- y& S, {+ z4 \
static bool server_upp_data_recv(Server *server) # N y3 a. M1 f# U. N2 H) B/ n
{1 [9 f& \/ D2 {! b( Y @/ B
if(server->upp_channel_a_recv == false) {
; |/ K- ?# ?# o% r: ~% u server_msg_send(server, APP_CMD_LOG, "upp recv: start");' z( m: M; w8 T
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {2 `3 a! v1 f' h: l: K
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");/ V8 O3 j* C. y5 R3 Y0 I; |
; Q/ P. j }- g) |
& L- D8 j; _, ~, E9 i+ p9 }- {" z% `9 J memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
" ~; b' d1 V. m% L# G5 ]# i
. v+ g8 A `" \: |- P server->upp_channel_a_recv = true;//
/ s$ c2 M1 j* t* o" [ server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
* c- n# h% g! } server->transposeParA.LineCount = UPP_DMA_LINE_COUNT; b6 F7 h$ q& v4 ~3 ]* A
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;9 Q0 c% F3 b/ n; }5 h- K" s% U
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//) A8 Z4 l3 U: H3 S i
3 i: f- j. M, c8 g6 B- H
upp_error_count = 0;
" n% [$ C0 M: h% ^ upp_dmai_int_cut = 0;" V% e2 X5 _. l- E& D: H, ~
6 F' I0 I, u* s1 p9 N // fill in data
, ]6 ^( a5 N+ f% I2 S uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);" N W! ?( Z& v: }9 K
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
7 x9 R' i0 g* t: n! { }
, S5 f9 E) d3 \' [ }2 ?; X! w) _6 j% T. l
else{% ? j; Q4 _5 A7 E
if (upp_dmai_int_cut > 0){
3 b( J: j7 k9 k5 ^' G DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
5 a, X& _" @4 K' ?- }1 d" x Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);5 H- N9 G" e3 A, F6 L$ v$ f+ y* |
4 s% n: h$ D! W- M5 a0 G# y. u# w7 \) b6 s
//copy data to upp_recv_list_busy
) @9 P( {/ @9 K! I0 n memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
0 _! G2 Z! ]7 R% K5 ^ {0 S% K
. ?' k# r% }7 g: F! |2 W/ A //
0 U) @1 f' q j. U ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);* D1 g) y# k4 B5 k* k% j$ t4 |
7 b& w; a) t2 [5 B& x: w //5 q a* |! C) s0 `- |9 N
server->upp_channel_a_recv = false;//1 W1 Z; i X" V" Q/ u. M) u
# h' g0 a5 y7 w$ @. p
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
' ~& X+ ^! g% Y: N" M' ?, m }
# P; o) k3 m9 h6 Q# T }" T. b$ s" ` b! A9 [6 G) y( y+ J) ~, D
( C |+ p! C l' O7 R) l, ^8 u) m# c' Y
return true;3 h+ f! y( B5 ?- G
}' R) u+ `3 R9 n% v0 C
6 e7 C/ H7 e6 k3 f2 r4 q
static bool server_upp_data_send(Server *server)
" d6 ]; D' m8 v& F9 ]1 L{$ J6 f. K. M* \1 y
if(ListMP_empty(server->upp_send_list_busy) == FALSE){; ~" R* M2 {8 I* o
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);) O6 Q C" Q6 b+ n
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);2 }' I$ X" v. \, j5 J0 f, V- o
char tmp[128] ={0};7 K; v$ C% V. \& M
9 N9 \* \, p' _1 k
server_msg_send(server, APP_CMD_LOG, "upp send: start");1 S0 e4 S; ~0 ]( Q: {# f9 Z
print_log(server, data, 64);
! [- [5 X3 o% G& H) ?5 S8 e
+ u7 L) o6 L" u& s9 r0 q" w2 ? //. Y/ M1 o* _% {4 Q/ M2 Z
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
$ y1 f6 Y G! h: ]& P% p memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
1 t$ E: Z6 U) \1 T3 L! Z+ i print_log(server, upp_buffer_b, 64);
& d$ I4 @8 v0 x( h
- u' a! H. A3 E9 p3 [# f* G+ E4 ] server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);* A7 Z+ E9 O# j8 v. l
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 3 X6 [7 K k4 B0 F; h- \
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;1 A( Q% Y' G a0 o7 J+ [
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
% g- x, T3 |6 \% r
, f9 w" k [( _ memset(tmp, 0, sizeof(tmp));3 \2 K+ J% H' `/ E$ l9 C: v
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
* W' T0 C1 P$ C" u. I2 \# N sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
: L8 q. e: c2 C) J, Q server_msg_send(server, APP_CMD_LOG, tmp);
8 i5 t4 h) Q: T) N8 O' }/ M( G% S, w& @
upp_error_count = 0;# \: |/ W. `& Y- D" i/ |+ p
upp_dmaq_int_cut = 0;
8 k/ ~# F. [) f9 Z. B- g V6 t // fill in data $ s% ]0 _6 G, `6 J n
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
* V3 Z) n$ } M6 h% a7 @, z server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");" u- f, N# R3 \# l0 N
" `# z; [/ G' t5 q* ?+ I7 k% X // wait send success) V: B. `, Y" c4 X* \
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); p" @1 Y% L, ~9 j. i
* N$ o+ X% v. `1 x // make data node in free list 1 V$ y2 Q9 K: t7 ]/ P
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);9 t. g7 \6 C7 f5 m5 D0 T1 k
server_msg_send(server, APP_CMD_LOG, "upp send: success");& X! M8 g( H6 A' X- h! z; x
}- S; J) W- g7 G: Y
return true;
: O. T. Q. }5 _3 F6 ~% J}* o6 a- _. N; C& I
3 w7 n8 _) Q$ [9 z
4 m, R! ?3 J" ?& w2 L( x+ |" L! O( a" Z7 m1 O* {8 Z
9 E9 @! W3 c: `! o6 o8 I, G6 c
4 H0 M6 o2 h3 Z! X/ X' ^4 K |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|