|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
4 J+ Y$ W5 W* Q# U. w
4 W' S* |9 s: h& |; B问题描述:' A+ [/ V8 q+ x( H& ~
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
. b+ H, v0 j6 r( U
' p" K* K3 N* w3 p2 t, @5 r图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。4 X2 u$ m% a% Q
3 p, H# H7 B* n. r8 q2 I$ N测试结果如下:( B' \$ ~: s0 A+ ?2 X
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?4 ~! y- H8 }- E" B
- J$ @( v% n8 n% ?# u' z p
6 @% J* R' {0 F" w3 ]4 u7 H$ u备注:' U9 \" f# q1 Q3 v+ C! x
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?7 `( g- i) |, ?. Q
2、相关代码如下:
1 ^; m5 h1 x4 m/ ^1 }//UPP DMA缓冲大小512字节
7 _4 n- j! Z7 }! b9 t/ F; V; ]& m2 O#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍6 A4 o; t4 C" q% O
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
1 e: Z) K% L: ~#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)- Y3 M+ q2 N1 L$ `
7 P4 m1 `( q1 z# Q' {' z4 @
3 t5 W% W% n+ Y- c//upp接收、发送buffer: L4 j+ e: L: x- k
#pragma DATA_ALIGN(upp_buffer_a, 8)
& Z! z$ \, G; Q* S- r#pragma DATA_ALIGN(upp_buffer_b, 8)
% H+ b9 X4 L6 A _; q3 s
+ r( H5 T Z, funsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
, j4 Q* z/ U% W% munsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
% F5 B8 B e4 T2 H( G+ o* I1 L/ E" d) g
& ~. U: p: o8 n2 z5 }' Lstatic bool server_upp_data_recv(Server *server) ( }2 a- x& j i
{
% C8 U* q+ U+ L: \, V if(server->upp_channel_a_recv == false) {* f- ~6 B: V8 V0 H e9 C/ K' ^
server_msg_send(server, APP_CMD_LOG, "upp recv: start");5 y0 n/ B2 ]1 h& j% j6 |
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {- {6 Y- q+ G- O# v3 J
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");$ C6 o& k6 o( F7 J. j* z4 Q
# ^, K% r' m5 v% C M* R
+ [; M1 M# g/ W* t4 ? memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
, o" o, }+ F5 a7 D" a; I
5 c+ P( M- Z0 G3 Y% k server->upp_channel_a_recv = true;//! F0 y6 Y) w% X5 w, n
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
+ ~+ n* c5 A/ X8 W" J. s server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;! D, N+ M- d" n
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;% [7 F! H! r6 z, d# M
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//6 F1 D* G% H3 f2 [" Y
3 y+ K" }3 p7 c; ~ upp_error_count = 0;
6 P: d1 e; U5 r: b' D. s upp_dmai_int_cut = 0;
/ r G5 ~3 X* G* Q# [: u3 e$ Z4 U2 f$ T g
// fill in data / G5 J# o, D" U
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
" |1 N j2 Y- P ~ server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");+ ~$ i7 F; O4 a' E( P& @
}' J3 c6 b+ `9 H: Z+ m9 l+ @
}
; u! }$ }* h3 }6 u, t else{
8 G7 `* b4 O( `% {; v if (upp_dmai_int_cut > 0){* P! ?0 {6 Y: A/ [+ [3 l" N. n
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
9 D; ^; f1 {. O# M7 a Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);# v; u1 x- `) M. {! B0 S% \4 z
! [% P* n) b" n; Z2 o/ i1 `! h. S/ Q/ a, n/ V
//copy data to upp_recv_list_busy' P& c" A' t; X. @4 S+ e& H
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
. Z8 z/ Q, D* M# U! A' W0 e& N5 L. j
//. b$ u p0 K7 s ^, J* q; ^; c5 s
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);/ K# \9 s# Q! X, o5 a
3 z1 c0 D8 J3 H+ l7 [ //
# E0 @* d- P4 S, u9 | server->upp_channel_a_recv = false;//7 Z0 O! D9 M& l0 J. G* V* n; f5 K
$ u/ b. \+ | [ K7 ^+ k
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
2 j" y& \; r* D+ Y. _! ~, w6 Y }6 m% ?/ Z$ W3 v, o) }( |0 f
}- m+ j! Q/ G0 i7 R4 P1 e$ g/ L
2 M: F% T2 {2 g- e3 S' {& ]! w5 H) e8 d3 z5 a% X2 ^
return true;2 |: O( _& Q" B! h- Y6 ? |
}* k; ?% d- _2 p, Y0 ]8 G9 X( E
# m0 d) B" U0 @0 zstatic bool server_upp_data_send(Server *server)
, @; w4 X; Q5 M7 g2 `1 n{* \" y* M) f0 g7 c& Y( M2 i; j
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
; i2 S j9 {/ N; H! w DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);0 x. @" E. K& U: o8 l/ J, n
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
' A- `* l' n1 H2 S" P0 M6 g/ ? char tmp[128] ={0};
7 e! t2 v# U ?: w* T1 O$ L6 v/ L
) r N, U# x" V8 v$ y server_msg_send(server, APP_CMD_LOG, "upp send: start");
4 f8 Y- P0 j: Z3 q& Z0 p print_log(server, data, 64);
& y8 s. p7 J" O4 G
! }6 D3 ~5 D! v2 c f. t' b8 c //
! d7 P8 w. M$ G$ Q7 M1 y6 g memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);2 K5 l) Y: x3 u* Q- x$ r
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
" }) m- S' s5 g; h% g* c6 V print_log(server, upp_buffer_b, 64);
4 P" P2 y" P% ~ T$ e
- s* X9 \/ P8 I! A; c server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);' `( H/ ^( k- Y+ g6 G! ~
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
0 Z; o+ U% X3 E* p9 q server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;- a1 I# R3 W4 w3 p$ C( Y3 F: R
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
& B8 p R) f0 b6 B t! J$ |: E1 ^: L! c0 K' y3 I2 i+ f9 U3 H0 o
memset(tmp, 0, sizeof(tmp));' ~& M0 C9 W) r
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 5 Z+ L" G$ `6 v3 k# K( a! ^
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
# Z0 k& p' c, B; O5 O- t* v; s ~ server_msg_send(server, APP_CMD_LOG, tmp);
. r4 }0 ]9 s3 @2 d
( {2 M+ r% e+ Z, X. o upp_error_count = 0;- j+ h' J: p. {
upp_dmaq_int_cut = 0;
2 d1 _+ w+ [* F6 V // fill in data ; h7 D" @8 p2 M7 K
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); * z8 |$ y7 J% ]9 ?8 R+ j
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");0 |# B E; ]" D# o
& }: i+ j9 i$ H- H6 ?: |" B
// wait send success
2 ?9 h& \: n* ?$ f. r" W3 S" F while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ) c5 _6 q' f& e6 C" |/ }# e1 t
! K" j V3 d" w // make data node in free list ) w( o3 M' v. c, J( R' R# p" o
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);) p/ G) q6 f! n+ {" D( p4 ?
server_msg_send(server, APP_CMD_LOG, "upp send: success");$ f6 @/ r7 I H J' }" F* _
}
( }- `( f1 N. `: S0 L9 @ return true;! O8 g2 t; T6 a; L7 a
}& K {, G* j4 m5 \; g' E2 U
0 Y9 E# G( a( B) ^3 A2 l8 [) R2 n
, x3 E1 j+ O* d" V& E0 ]
0 z) n- t0 [7 x8 Z+ b% n
2 Z) `4 }5 j, y8 {: W$ d
- I U" c" e o6 S( J% v6 v2 G) f4 q/ G |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|