|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
( I' I8 w, N. g# T; @9 @/ s F' j1 n3 k) A: m2 c W1 b8 ^
问题描述:! o* m; k; ]# S' P+ m1 P
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:) `' E0 G: I3 \: E
# |: z" B; u' s: D/ c2 r
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
: T3 Y/ |* w$ \$ [+ h: U5 |' C, c+ o
测试结果如下:
- c7 N# P1 S0 f, u/ \138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?4 C3 T/ y$ M) c& y% C% ^& w" a& `
# b+ W+ {0 N; f, V! Q k' T
7 \0 G" R+ Y1 G" X# |0 }$ G备注:: u" f1 M8 @8 ^4 k
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?( ]2 t- s9 `# x7 z p4 e6 Y
2、相关代码如下:% Q- Z* B6 E1 P# p- \6 D8 ~
//UPP DMA缓冲大小512字节
8 n. Q* M" C5 j+ T! Z#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
! R! Y( L: O6 E7 {* U g#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
* `( [& P( F( e( T#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)# p3 o6 o; f2 X; l( k7 ^
; F) A( f- F6 t& P W7 u
& G v3 `+ R6 b; [//upp接收、发送buffer5 P2 t$ h- T- `. s
#pragma DATA_ALIGN(upp_buffer_a, 8)
& E Y j6 ~/ g5 s, o5 p#pragma DATA_ALIGN(upp_buffer_b, 8)3 P# U; W( q- L' j# D
, ~; d" o# p" `5 t- A _
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];: I1 a) W9 C- q* W8 O% {; k5 L
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
; B1 g \& f8 N
; ]- u0 l2 C' K8 P/ b' ]) J
6 J4 D( ~1 h; o+ U( z% d5 p0 j0 _static bool server_upp_data_recv(Server *server)
! x0 K- Q; }* e5 S) J* b{
' |: `" u4 x2 y. y if(server->upp_channel_a_recv == false) {
2 h9 u Z& Z* ~ A: { server_msg_send(server, APP_CMD_LOG, "upp recv: start");% c, P/ T3 C v6 I. Y6 i R( [( d
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
( L2 P$ R. i6 F- C server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
- q' c; ~. u3 a* y" K+ m/ j/ H1 L2 k q2 c; P; v* _( w9 z/ P
G! N- ^$ g1 y" d8 e6 r& M, N memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
+ ~+ ]) R: C; h9 O" z% k" M* R# [ i
server->upp_channel_a_recv = true;//
) Z" ~7 ~/ a% D+ C5 Z server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);! I' k) C s7 |- ^
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
" p% `- B1 A6 h% n# `- A server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;) B/ Y& k0 T9 g0 c+ Z
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
* G/ `: o* X- B! d q7 O$ l1 A4 ?: X q
upp_error_count = 0;
- P" _8 k; h$ L% a; O* r upp_dmai_int_cut = 0;
7 a) U& i% h y9 S( U I
; {/ ^2 ~: j7 |" {% K // fill in data & ~6 i1 w- _6 ]6 }: l6 U! S
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
1 g1 {% B0 S4 C server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");( A% B# X+ ~9 X
}5 D) O! d- z$ h/ r. F: i
}
: `2 M6 u% ?+ m" l4 q$ r else{
* z- H( q' p5 w: f3 E% B4 m5 V* @ if (upp_dmai_int_cut > 0){1 S/ x) r4 a( M! Z/ z, ~
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);) ?/ M. h* r. {* W
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
- B d q6 m$ d$ N4 P. r
: \! [' { f% M0 Q4 _; ~; W0 e1 U- _" s G9 M
//copy data to upp_recv_list_busy
; y; h* N$ y [/ R2 W' R0 [. Q memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
) E& |; K# P& j) E1 N2 ~& V
( H9 W9 o6 n Y( C# X( [ //1 M e7 A) L7 D1 L3 P
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
R7 u5 r5 C! d& U& V4 Y( A* i; x$ v( A, p2 S. b
//) s4 D- P! L# v% s" p! d4 u: m2 T4 b1 g7 b
server->upp_channel_a_recv = false;//. B7 Y3 Z0 M g
4 c5 T) H6 H: l' M& ~ server_msg_send(server, APP_CMD_LOG, "upp recv: success");( e! @1 E. d; j1 X
}/ m5 I$ B6 G7 t! a! @
}; J; @' ^. |3 D
! r4 [( F6 N- L* G/ H4 H% t6 f
4 Q: r6 D- n( q7 s# M0 N return true;% N, Q5 Q! H( r9 Y6 x. Q8 a
}7 T/ W! ^2 M! s3 b/ M# i/ O
+ I" X; ]! I _6 g& ]$ z
static bool server_upp_data_send(Server *server)+ v* u6 V* Z9 F/ z2 C2 t9 y# Y X
{
v( h9 e4 O3 G8 e5 V if(ListMP_empty(server->upp_send_list_busy) == FALSE){
$ H P+ u+ J2 t! ^7 W8 Y- C DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);7 c3 k- A2 }# E- v0 G
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
8 O: P: G8 U% W& X: G4 i; r char tmp[128] ={0};
0 a, g$ r2 b- H8 X ]( @
6 Z2 _4 T+ D% k" J server_msg_send(server, APP_CMD_LOG, "upp send: start");8 m1 J1 ], @/ n6 Y% G/ T3 c. J
print_log(server, data, 64);& t: g- W. ^3 X" ~7 x% i* q& ~" C
' d3 }4 q4 V$ y- R( I, o
//
# K. n. Q7 R. H8 M3 S) m- T1 Z$ r' S memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);& _8 B* W D% H9 a" q1 o
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
9 t. ]: V5 R, N" ]2 M print_log(server, upp_buffer_b, 64);, S; d5 K$ |7 {$ g
0 f& x, s% ^$ W6 r4 E" t) I; @ server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);9 S4 l D. G4 t4 D% N2 T
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
7 C, z1 d' B4 `9 o, p+ {7 ` server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
+ j. q/ x, W- s server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;( y% R! g# V+ n: [$ `
/ o6 j7 _ d" d% P% C
memset(tmp, 0, sizeof(tmp));
9 Y5 ]& m6 b+ ^7 f5 Z# H6 b' t sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
; m* D5 Q# U- J9 f# D sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);) }% r8 Q5 i4 N& M' R& w
server_msg_send(server, APP_CMD_LOG, tmp);% B) N. f9 D, D9 `7 R4 Z
$ \! k3 z1 h$ H7 \, w. N
upp_error_count = 0;
4 k# N3 A5 l7 F" z upp_dmaq_int_cut = 0;
. a4 Q+ x' F' t# u // fill in data
" u* c' L2 c9 E9 W uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
% B% y# F/ F( W1 }, y3 \: E6 t server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
{% N( {- c& t4 K& L0 u9 x2 C5 H- J1 f0 L
// wait send success
& h' X9 \" h8 K( n while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
7 d9 H' t' M7 U ~" R! }! a/ K4 p/ C+ J" ~" b4 J* @% r0 F. |8 a
// make data node in free list & m) _& P7 D: i
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
7 r4 [4 |) l6 @- h- K2 l server_msg_send(server, APP_CMD_LOG, "upp send: success");
1 t6 g4 N& n- c# ~. y }1 c4 {& D8 i7 v* L9 N& r. e5 r" g
return true;
+ H# G% ]7 x- O}
; D6 A$ D) Y+ Q0 A' n4 [0 G+ m7 e5 \/ v3 z
. m9 ]) N5 l3 y- \; ?% `
# p6 p" C8 L7 a: Z* n
; m8 i$ j( U0 t9 v' l$ `( n
( P0 o( U" t1 H# x |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|