|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 . f# \# Q. L8 N7 U* U6 r
* v" b+ J4 {* R, u& {4 d" S- f; a问题描述:
. N9 M. t& ^2 N2 b" I7 E在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:# B1 J, f3 H! \$ \6 J* S
" X; M, f3 G, P+ x# N8 J' d7 t
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。' G4 T {0 J8 K* Q- I
+ h s+ p/ C/ W/ `
测试结果如下:
% n% r- \; c0 Q, W O138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
4 P. }: G* N: M* g+ [# ~0 x' ?
, n6 d8 ]+ s; y4 A4 N! A+ a3 c, U, F; W3 Z
备注:6 P, j$ k* T- b* y' w7 Y( @0 b. a! S4 L
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?. C7 ^# z, u7 m' ~/ S
2、相关代码如下:4 r; w8 F, Y6 |! P
//UPP DMA缓冲大小512字节* s. X6 d' w7 Y4 |' m8 c
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍" m, v- r6 H* w
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT; b) W" G" x* P/ y% t
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
3 R- W2 m0 g1 J# W% T d1 b, R% Q9 I B1 ]7 k5 G* x
v3 X; r; W% q3 `+ [//upp接收、发送buffer
9 \' ]- L3 X, M' `1 p: K#pragma DATA_ALIGN(upp_buffer_a, 8)0 I, f k- w4 C
#pragma DATA_ALIGN(upp_buffer_b, 8)
6 o1 L6 L9 v u& {) Q- t8 x# z' ^+ l& q
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
. K% U4 _- R. _$ e0 _unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];! v3 l6 m; c5 ~* D- ? ^0 I
# P% c4 A" A0 i1 E+ Z$ h' ~1 A# F+ j) o
static bool server_upp_data_recv(Server *server) & w; d" z6 t. s8 v' _
{
0 w$ ~/ m. r2 Y: x if(server->upp_channel_a_recv == false) {
. l6 Q o$ Q. d6 D server_msg_send(server, APP_CMD_LOG, "upp recv: start");1 a" C P1 h3 @
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {9 s( Q; y1 j' e2 ^: f
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
5 x3 J. ]2 }* G3 y. @
2 {, k- z; Q( u; g; V9 w
7 R8 f: c1 }0 J! \6 Y memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
' g2 ~; o$ o1 ]
( D4 z- `* D" {# M% E0 n& s server->upp_channel_a_recv = true;//
$ k! y5 B, L" P4 |* U2 R' j server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
3 `% S4 X% H8 M! D3 L G server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;" c8 {8 T- k$ G
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
9 s8 o h6 c ~) I) Z server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//" w4 c; e9 R0 i* `' _; `; ?; S
/ E0 Q7 R) u8 A! m upp_error_count = 0;
; R8 T+ l8 j2 I6 C upp_dmai_int_cut = 0;1 c) q } {; X( f+ ]$ |
* F' @( Y' C( e4 o // fill in data
- W8 ^- r; } @9 t" b( ?( q uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);! Y+ n; s0 u* Z L% d6 T: \! [
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
, N2 L5 ~$ ]9 w: V/ V2 C7 N }0 i2 F' ^- O, V! P; W
}. m/ `; K( P$ B% l1 X" I
else{
4 j4 s# r0 C9 _0 K+ z' j- B4 \ if (upp_dmai_int_cut > 0){
: k K# y; |" K DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
8 B6 C" n+ O3 G9 Y/ r Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);( j3 b4 x% K4 h. L7 s
$ s5 E! t* g, V5 \3 B
+ B# J+ [$ {$ `+ U* s" j //copy data to upp_recv_list_busy
" i2 T) R( R# T8 f7 `) @+ _. ] memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);* S; H/ ?1 ?" j2 P+ G
0 \; {% H5 v3 e- j
//. T/ P: ~' Z' x+ `: V# {
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);% u5 |" ]- f! {- x& j
# J3 _5 T" o" K& X, Z6 S //. v/ K4 u, l2 s O9 C2 z
server->upp_channel_a_recv = false;//
( q* [7 D+ e/ ~
/ g8 K! E8 X. T; y8 E+ h; e server_msg_send(server, APP_CMD_LOG, "upp recv: success");& i* w( ~" @; W/ m* V
}4 }( k I Y) }: W- \; I) h
}
0 r+ J# i1 p9 T; ?+ J5 [
$ w1 r, ^- U$ R6 x E- Z$ m
7 y) K2 J9 N% c: {) s# \ return true;
9 V+ |+ ?! T2 H8 t/ ~}
9 D; e- O# g" e, p
" E3 _/ c6 @+ k) Y/ Xstatic bool server_upp_data_send(Server *server)$ I3 S7 {) O0 I: h9 N
{
$ L8 Z; S, a; m2 |& ?: q' B/ p if(ListMP_empty(server->upp_send_list_busy) == FALSE){
( [; a. R! q4 a7 A DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
' m* H( e" e# n6 x* t unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
! H, y, _" R2 p7 F6 x char tmp[128] ={0};
1 L5 l$ _) q G. r# G5 X) ]" h" e# D) H2 w' w
server_msg_send(server, APP_CMD_LOG, "upp send: start");
, O5 }" X4 x8 {: } print_log(server, data, 64);2 l1 G1 {/ _4 H4 ^. h; y! I2 n. p3 C6 e
& E6 q& X {3 D: F/ S7 D
//
6 e! ^- S+ B, g l3 R$ i1 r& L memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);- V: j0 V+ c' o* h# N
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
* N- u0 ^% q2 @( F( J print_log(server, upp_buffer_b, 64);8 Y- t9 C" g+ Q2 z5 P0 C8 M/ R! r
/ W( h5 N& `1 X0 D/ g' b7 A0 Y& X- i
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);) s; B# c6 g' G! y! L7 O! h
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
5 K" P' U }0 K1 E6 Q6 H server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;4 V- _2 \, s' Z+ H+ \
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
% y! z9 B4 e7 ~" \6 f$ w& a! U
) n, r# V' p, y. M! l. e memset(tmp, 0, sizeof(tmp));) } g) y( T8 A U' M
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
) l1 t6 ?4 f; l sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);7 @( C; J1 d5 K i8 P
server_msg_send(server, APP_CMD_LOG, tmp);' q4 @' R) m3 S
8 c) X {" d9 M upp_error_count = 0;# | [7 U$ E5 k0 d/ m% p3 C
upp_dmaq_int_cut = 0;/ j$ M; d* o+ e: i' p
// fill in data & ^8 e* x! g, M4 U" |: t' \
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
( v' v" }4 i* ], C1 l. z server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
) u4 o& U8 x( U# k
' i" z3 k8 m# W, G) p/ c$ d% V$ q // wait send success& q: b# A: U- O4 V5 r% u
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 8 p, v' Q7 v3 `
' e" U3 U. f) Q: h E- P4 K5 { // make data node in free list 7 c4 b2 V" m9 F h( Y. {
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);; g- O) p0 D* x8 D9 U, \1 S7 I9 l, b
server_msg_send(server, APP_CMD_LOG, "upp send: success");# ^: P2 r; q8 W& |9 K
}' v) q2 d( A+ p4 T7 y2 A. m
return true;% } n1 B1 _3 e% r; b( A1 c
}
9 N) t9 p' ~* ~+ o
* R$ `4 s& t# k' N4 K. K, ]7 s4 f8 S, {; O( L3 n& s' [
! D( E1 Z# ]: S0 ^, c6 x1 O" q) e) n3 h* U9 K
- ?% c! _! `' Z1 [- D( r7 h |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|