|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 1 T4 E! V$ V7 Z6 A, a0 H
' c1 o! v b1 N" X+ c问题描述:
2 Y! X6 d, t4 r U- `) l7 T! _) e& l在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
" K% E" o3 @! _+ d! J5 }& U2 v/ A6 @% L# F* L& _2 l
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。" q. I `: O5 A& U T8 g0 [2 X
4 a+ k x- p+ k' A0 `! |测试结果如下:
. S( S; z/ D- @' n4 w4 N138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?' T% X' I9 P" Z4 G, j4 j' `
- i4 s) _ `! H( N; n- M4 i3 u: s! D5 g5 c
备注:
: o8 v& M! H+ r1 a4 b' A) ~$ d1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?$ e! A* \5 J, y) q( Q# X2 f
2、相关代码如下:
+ s& ]( @/ \/ N, F: p! _- ^//UPP DMA缓冲大小512字节
! _# F0 \/ `. Y/ X2 ^+ y#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍! l9 b, o1 W( l* h% u8 u! O
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
3 b& G+ L# |$ K; w" i2 J#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
4 C8 M% v4 N9 M# ?; Z9 N: ~
/ _7 h# h1 u# `* j
; ~, F5 {+ b: U% h) u6 }//upp接收、发送buffer
. R, Z7 f+ ]- s- A; _6 O8 G @#pragma DATA_ALIGN(upp_buffer_a, 8)
, _7 c3 L7 e/ e7 n" z1 P#pragma DATA_ALIGN(upp_buffer_b, 8)2 i- }8 J" J. ^' w5 q. i: A
" v F# [$ Y9 K$ m% qunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
1 }6 B# t+ }# u" E' }- lunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
! C+ w' E& \" p* o9 o, H# Q) D m Q) \$ P! m' @
" z, e" D2 L9 x6 z7 Q) G& Mstatic bool server_upp_data_recv(Server *server) 4 c. t5 V' W$ S1 `: H( L
{" A8 j8 S5 T$ M: Z
if(server->upp_channel_a_recv == false) {
5 \$ o( q9 o" Z6 B5 U7 I: \: f" ? server_msg_send(server, APP_CMD_LOG, "upp recv: start");
7 p5 s! O0 m/ _6 s& [+ } if(ListMP_empty(server->upp_recv_list_free) == FALSE) {4 E V9 l5 p c5 c# }3 U. P
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");1 d! [1 @5 D# S& {2 K" z$ T. q) Y1 C
/ f8 M4 f! u$ t' V
2 x* m+ L/ _* L- q2 T9 W+ T0 J memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
% {8 ^9 z) n6 p% D* m
8 @. {2 H" C0 U% q8 w server->upp_channel_a_recv = true;//
3 t w4 ^% y( \! r3 F" C& E6 J! F server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);. q% s2 w6 H8 Y& W# ^( Z |( j
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;2 J: \1 Q8 ~: ^1 O9 T
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
6 i* o+ L2 M* W# C$ r- n% {" e5 o# ` server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//% R( d5 E& K& N. q. [
) O9 ^( j) f+ n- c4 O% `7 R
upp_error_count = 0;( [" K3 D: C3 c6 d9 P
upp_dmai_int_cut = 0;
) A+ {5 u% M8 [- A7 j% h3 c# | b% _& Y0 _9 u
// fill in data
( ]. ]( y/ ?5 \6 Q0 S3 w uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
% P6 l7 Q/ P+ H6 P ] server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
p) T+ @2 V m5 p$ e$ N }' O4 R: X F4 v; N3 u ^/ K# p6 e
}
1 w( r$ j& ^" [) e' o: q else{' Z8 [! _ y7 A! e; Q9 |! Y
if (upp_dmai_int_cut > 0){+ f) ?, X" S8 T) v9 Z& i
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);" U' G1 Z2 ~. d8 t
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
) [ K; H' J: ]1 D7 E
: o- L$ y4 H+ B3 u8 j
, ]& q% e- h9 P" b) i. C //copy data to upp_recv_list_busy
# `5 \; F+ ]2 m% D memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
8 J( c7 G# u" Y! g0 L( Q% r/ o; g* y; t Y" ~
//' i0 r5 r& l! t5 V7 O
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);3 y% N8 [( }( K7 u9 J+ _/ t
3 E2 q; i1 w9 M
//
# ^& _4 c7 B' l* [# Y server->upp_channel_a_recv = false;//
/ K! u4 Z5 q; y7 f6 c4 \5 n$ g0 i) H- v( P
server_msg_send(server, APP_CMD_LOG, "upp recv: success");& T/ j) {/ P# W! ?+ g
}
9 c* V+ H8 |" w' Q/ d }
% g7 g$ F; u; A' @( q' T8 u4 Q
9 v6 i6 Z; B9 q, _. b( b6 c& E" x, Q7 c( N" ~# G! u
return true;8 W6 @ G; i' j0 ^
}
) y4 }, M1 i7 }3 @: Q5 J R. Y
) q* W n8 ~; l/ l9 s8 [& tstatic bool server_upp_data_send(Server *server)2 U3 A5 u$ x& M/ x
{6 ]8 A! P! `8 H9 K! ^4 [
if(ListMP_empty(server->upp_send_list_busy) == FALSE){- X8 I2 ?" w. Q, x, z/ A) h
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);6 S- U% t5 d$ Q1 k2 j# g$ b
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);1 j% b6 t9 ` X s+ f
char tmp[128] ={0};0 a1 z( E+ G. p5 N% U# I
( b0 Z4 F$ H2 o) V! n' V+ F server_msg_send(server, APP_CMD_LOG, "upp send: start");- C' l/ C; g. I
print_log(server, data, 64);9 Z% i e/ @& Q
|5 c; b/ W7 c/ ~0 E o6 e9 \
//
. Q* c6 c) I6 b. P9 o9 y v memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
7 _1 G' V% r) ^; F% f7 ?3 c memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
' ]3 [2 k& E& W, U2 m, w print_log(server, upp_buffer_b, 64);: `/ f3 T) u( G) s
9 d, g' P* w9 a3 g0 s* I* z$ }
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);6 y1 p; Y7 E, Z4 ]
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; " r% [( { H$ _5 v' u
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;' X& o2 {( r; @; F. U @
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
* {1 P2 a6 V% K% F% ]% i# e- y' e0 e
memset(tmp, 0, sizeof(tmp));4 h. q1 n3 C) A9 Y9 [+ ]6 T
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
- O0 G" _" L$ t6 } sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);8 c+ @$ Q& d0 a- Z8 B( D9 i0 }
server_msg_send(server, APP_CMD_LOG, tmp);, b" X/ ^ i& E# p s( E- L4 b# x0 M
. n7 |' i; u# ?8 p upp_error_count = 0;
{0 b+ Z3 c* O, v7 l9 |( r upp_dmaq_int_cut = 0;
8 e: n- Q3 e( @ // fill in data ) k9 W3 V- R' T* C
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
% s D% ^: z& ~ }: a. P3 ?& G server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
# o4 @% V9 Z0 U$ x. C: q) c5 G5 u& C8 N# C* L7 f& n
// wait send success
1 r' x8 G3 l4 v6 { while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
0 ~* ?# o" u* y# c) \8 e1 x: X2 {+ ?! r6 R" [
// make data node in free list % L \# ^) V% K8 A9 T2 T
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);8 b' R6 B C3 V4 O( n
server_msg_send(server, APP_CMD_LOG, "upp send: success");* f. L3 U# h/ N& B) h; K
}
' i- j6 P* [ f4 L& ]: @0 p6 C. l K return true;- E) n9 s/ q8 J: n$ @; `
}, n9 w; k9 ^" e$ w6 y# @
4 K! J! ?( x3 G3 N; ?4 E2 k5 f: r4 |$ M. I6 _
3 G# s: o; S9 k/ J; o+ W2 j* h
5 v1 ?7 [; C" y8 b
& L6 j% U3 q# ]' i, H7 N |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|