|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
7 ^7 I# ~+ x/ d A3 |* G8 A3 t, S. i( {2 I" l
问题描述:
) K7 K) g$ L% y9 P* l1 @' x在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
* {1 a% `! o- o% S1 I* a9 l) c
6 y8 i6 _$ z3 l! n! V图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。7 E5 ?. D! e. r7 G7 z3 K, c, l! g
$ \; ]7 y3 A' x& ]测试结果如下:1 k; Z' j- Z6 O8 O* g
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
3 `& i( G: C* L$ B" I5 c0 A
- A. x6 G7 d) R8 m3 }/ t7 k
8 W+ Y* o# Q' {5 s备注:' `8 x% u/ V% c+ X! G2 m
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
5 M4 s) L: k: }2 { W1 Q% m4 j* f2、相关代码如下:
9 i# ^5 d. v/ [- I( m% f1 x3 F( U//UPP DMA缓冲大小512字节
) [6 Z$ H' C$ T, g6 ^' p3 B#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
- o+ u! I3 W& r2 _#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT- L1 n L, w4 l
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)( L6 d- M1 \0 e/ c
, d* a$ g V+ Z- ~2 M: m" A, E/ r4 y, Q, v. c# \0 {, e( y
//upp接收、发送buffer' h: M: D, }0 L/ r1 a, a0 F! z
#pragma DATA_ALIGN(upp_buffer_a, 8)0 j( n3 m$ G0 i. O
#pragma DATA_ALIGN(upp_buffer_b, 8)' B, U# V- D% F( O! a) N* n
6 c% P; F# z9 v" Q2 Cunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];4 i; f- _: U8 ]- a3 C$ a9 l
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
0 f, A; R$ p- D! `1 A" e7 N. Y) Y* X* g% K( }8 Z* U
6 a1 B. J0 C) H8 P' [2 l! ~static bool server_upp_data_recv(Server *server)
1 b$ s6 H* U* s3 O{
6 W2 f2 V& ^5 }# s" Q' w9 l' | if(server->upp_channel_a_recv == false) {: a! Y6 U* }9 G) m3 L5 \; k
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
8 U* s9 l' }6 E$ V if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
4 T% h9 n c& @. Y( S( t server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");4 B, `; r0 J+ K* C
/ V. l! g8 P% d
% J. d; C, S( t0 ? memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);$ H( {# R% B. q
7 X0 r1 B" r9 p! l+ Z4 ]0 Z
server->upp_channel_a_recv = true;//
- ^/ c: X9 t2 y! f/ A- s server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);: Q& H7 q7 C$ _6 \/ ~9 Y
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
8 C! O; e* e' c9 C3 C l server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
9 a2 R" k3 n: C server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
- H6 @. Y5 ^* m% c+ `; Y
7 P1 E! R3 N# @% S" b0 R2 x! m upp_error_count = 0;
* q) [4 Y0 b. s* F8 L0 c9 m; F! k upp_dmai_int_cut = 0;' N/ ~1 J6 R: \' J6 O4 P
1 B8 q# h6 _( Q: b9 k // fill in data
1 a0 e0 v. Z0 x( S( H, h3 P. H$ p1 O uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
0 k3 q; d D& p0 n server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");7 X( |2 l! K6 |- M$ w- j
}7 u3 S* W! C. F
}9 w8 ~. ~ _; @! w8 ]# y% H
else{8 r( O) D1 P0 W/ Z& Q& _' Q
if (upp_dmai_int_cut > 0){
& O% L2 R: E! W1 y DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
) h: z3 u9 u; ?6 L9 D Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);4 Y$ n# e% u; o$ [' H, E$ O
! D7 Q$ I4 M1 w# w
& F, y. C: p' `6 Y# J" m
//copy data to upp_recv_list_busy
0 j/ @) L( E. x' s3 C- b2 h memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);9 U3 D N2 w/ I7 `/ J
: A& C( i, g* o9 ~, A' Q //" c$ ^6 t3 z! i' F1 H% K, v
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);5 a5 ^7 U. | ?' n
$ k7 q8 ?1 i- O, h //4 `& T9 s- s. a, H- z, D
server->upp_channel_a_recv = false;//4 }$ i6 O" W! M; l+ [
" K. G; M5 [1 k- q' s% E# O
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
, [- E! F& L: f" d( [ }7 `4 r0 D( T* s% n; Q6 A/ p
}$ Z6 ]/ W: \! B
. s- ^+ r. r# H# E+ L/ k& }5 ^5 S3 g3 l8 e" ^- I1 [
return true; H- l, M: S+ a+ r A, `" m
}# C+ X! l8 c/ ^' ~
$ R3 H; _" z K4 q; ]" @% L0 @static bool server_upp_data_send(Server *server)1 {, [2 H J4 s3 x* N1 a6 v! _
{
' U. {$ X h4 u% o if(ListMP_empty(server->upp_send_list_busy) == FALSE){2 R. C% e# _* |, }2 ]# C
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
- p, k2 G- M4 ?) N unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
; S) b" I2 A! { ~. q char tmp[128] ={0};
6 D4 v5 |" L+ H7 S( c) } [( j
4 c) u4 L0 Q: e server_msg_send(server, APP_CMD_LOG, "upp send: start");
! K4 H% Z" V. c: {* t print_log(server, data, 64);! M: S% P1 P, z a" D! q
3 P. i: e, S8 w% f //: i+ |" L) e3 P" X2 p0 s2 e
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
" t0 m$ I! Q7 R7 B7 G0 K/ S& q$ j memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);$ N- Y+ s0 \: E ~' j
print_log(server, upp_buffer_b, 64);
. `& N: i+ }1 W! x7 v( V+ n
; E' W5 q+ n+ u5 }, T' y K server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);" ?' R5 u7 b1 D7 n3 J/ Z. W
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
2 ?8 r0 e7 u( O1 b: v$ s( P server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;3 l0 b- {$ Y% ]) ~
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;& v- A, |8 z, H. {8 n1 w7 ]
/ ^. P* i" P4 w memset(tmp, 0, sizeof(tmp));
8 U( ]! o/ @& t% Q7 x' e1 o }- T sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ) d' Q; V+ K1 X
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);" d* d) L* w0 Z1 |5 m2 V
server_msg_send(server, APP_CMD_LOG, tmp);
8 _$ @4 ~% |: ~; M# D
' U: p! q4 X0 k& J upp_error_count = 0;
8 s% p2 f- d* P( K# E upp_dmaq_int_cut = 0;( ?0 y1 z1 }3 n6 _1 A
// fill in data
+ s+ U( |) ~5 y/ m' C; N. l- E uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ! O+ B; Z5 h u) ?
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
; N( @" Q J2 x( @' r$ Y! t6 \4 Z2 r: M r" N
// wait send success* l- D A0 {# C* }4 @
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ' Z ] D: s( z# _5 p4 [. D
, B. n; X4 y/ i* a& n1 ?/ m! E // make data node in free list * g7 S3 n- E/ w( x) q+ u
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
' s% Y/ g ^: ?/ \ server_msg_send(server, APP_CMD_LOG, "upp send: success");
# C3 Q% U! L8 V& Z }# I+ x, X7 J1 A. Q5 l
return true;
9 b1 Z' y& s% e! J* T; C+ [9 Q}
! o: [1 N. V# ^- O7 P& Y1 F6 J- X3 S. g) F% C7 {7 H' A
0 u% m4 _0 ^0 l7 W0 b; n
9 V, }) l, s* _! s9 q2 {4 c/ V) K
2 e+ B" p. ~: j% j
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|