|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ) r! G1 {" ?. U) Y6 `2 G; U$ f
7 s* V& o" H" V9 c6 i( q& p问题描述:; }$ i* {# k' o, Y: W
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:. w" \& b$ a5 z" o$ D
% c9 ` d5 C( r/ Q9 v# n+ g' Z0 k" f图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
. L% C& c1 j# y' d9 G9 S
( G& _) }; g p% |* V& L测试结果如下:
7 z- G/ j3 k# B( |138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?( }7 M# S- T1 S% a% u' L
3 @) g) k7 x1 G( `4 `4 x
9 `+ M: t; K+ u+ m! W a W备注:2 T& p5 v" `) V& f% [
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?0 `/ Z% I8 S, S3 }1 x# J, l) Q
2、相关代码如下:) ]) T9 x; C; c# ^3 `9 {" j8 D& i: M; a
//UPP DMA缓冲大小512字节
7 Z2 W9 h" ]+ B- H#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
$ `* Z2 V0 Z. ?# \( j8 ~#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT5 \0 B) m( C. {
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
- |( t, m! J. M# n7 I. T, G' U% N% \; N0 y( k N
$ W, i2 K3 W1 p6 E6 y( G//upp接收、发送buffer
1 U. h, e1 B; G9 i1 c. b#pragma DATA_ALIGN(upp_buffer_a, 8)& W, ]3 Y5 d+ w4 ]+ ~/ b! Q
#pragma DATA_ALIGN(upp_buffer_b, 8)
9 m& u+ S( i6 {$ B5 X
' C, r5 _% R; _) |8 D7 ^unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
' d9 p J! M3 a) t4 K7 j9 `$ {unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];" l" |4 {5 Q" W* u t! t
V2 A2 w, L& H; d- z
4 X7 E! ~: s4 g L0 h3 x* Istatic bool server_upp_data_recv(Server *server) " d' |0 R+ i4 b1 R/ f" _! K
{
W7 V3 m0 {( q) v) e& P$ |: q4 i if(server->upp_channel_a_recv == false) {
9 C& J; A9 P) a$ Y. X- q server_msg_send(server, APP_CMD_LOG, "upp recv: start");
4 ~3 _, A6 t: a2 n$ ^" [3 @! X if(ListMP_empty(server->upp_recv_list_free) == FALSE) {6 b8 c" Q0 E' k' \, j+ q. ?9 q
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
2 H M! n7 Q+ x5 m5 G }' |7 [" r) `- a3 y3 {" q) A
0 C% [& x/ [6 G% F# `& O3 E memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);* i" W/ C1 X5 t+ F. U; e5 d
, I- D' \1 P M' O4 W0 h+ W3 u
server->upp_channel_a_recv = true;//- d# Q2 r- N) Y( e7 \$ V9 [
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);7 e9 I" }9 i% g2 Z% H/ Q% p+ k
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
+ {. L% x3 \3 B) k7 X& i server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
! j; A/ ~8 s o server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
4 C9 Z" J! k" |: [* X5 \6 h" J
v6 S% J- ~: y9 l) Z4 @ upp_error_count = 0;
& {0 d! N6 F. r" J8 T2 }- @ upp_dmai_int_cut = 0;. |8 |/ Y0 @* C+ H- k) l
' Q, V/ K$ A' a5 k3 Z // fill in data 6 P! R. E1 n* |9 ]
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);, e V7 N. j# o. f! Y6 c
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
! F" u8 H) F- v- F8 e7 f } O" y: w. Y* p, T) ? G7 ~* Y
}! o' n8 V' E' k# U7 P
else{
6 }8 h' L( d$ {$ l0 r" L if (upp_dmai_int_cut > 0){$ L2 x3 `$ g8 d' b
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);" A9 i$ i7 w/ N. v
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
0 y9 \/ @% n, y0 Z2 L6 z* e" C$ | }! t. v
& q2 B' v" e3 U% c" H //copy data to upp_recv_list_busy7 ]* c) C% p( z: i
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);" b5 e" k3 E* Z( s/ p
( `7 Q6 j6 M* I8 t$ P3 s# p( x* [ //
9 y$ H7 U: B7 V. S* x ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
* j8 M" }& ?+ P2 a1 f4 g8 y# m; U' Q- }! u; W! L% J
//
" f ?) U& P" M0 O server->upp_channel_a_recv = false;//
8 `: D% u$ ~8 z8 u' L# U( u: N% ^+ X9 h' l7 e, U4 ? n) v8 P! x
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
8 B" ^4 u; T4 I6 P( | }: k4 @) }" f, p
}2 K+ O* o* M" z5 |' a# x2 g$ s2 `
2 v8 m5 r( l8 i! W' P0 O' ~4 D- f) k4 B
return true;2 ?, n$ v. ]7 Z
}. U1 J G5 r+ y5 j2 n! \
. F) b, l2 s& U, H" \7 l; {2 R( U
static bool server_upp_data_send(Server *server)
# x$ Y% i. Z5 ?; C2 e2 |{ \' h. J( g; i" Y+ ^) I
if(ListMP_empty(server->upp_send_list_busy) == FALSE){9 I, G' ^! K9 J j# m- h0 n" [
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);7 Q4 h9 `4 i, n0 I; W- U
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);( X5 `' o4 s9 \) X6 D$ N
char tmp[128] ={0};0 ]; H ~; e4 h# e$ B1 C
% G+ p/ c) k- D! J1 w server_msg_send(server, APP_CMD_LOG, "upp send: start");% ^% J# ]% P9 ^8 ^2 G
print_log(server, data, 64);& x+ D: e, A+ l% v, ^$ E
4 l* v" o) s+ g! f* r4 i1 n
//6 f& V6 j1 X: r3 H7 Q
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
$ ]' Z/ `& N z4 Z' k8 M: l memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);( e% q: v/ Z8 X
print_log(server, upp_buffer_b, 64);
- `# J" f# t1 t, z* h. c5 A
' j h6 k# @% V7 ^) }& \- f) E server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
: w5 R2 V; K* Z' l* c! R! }4 j server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
6 _- M3 G4 z; {: }8 i server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
* |! E) E: d& |3 O, y2 I6 ` server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;5 ?% [1 |3 Q. t( t) S) p9 P5 {
9 R: v* X" I0 A) t# W5 `4 Y4 u2 h7 _ memset(tmp, 0, sizeof(tmp));
. }* d0 |/ D) Z' B3 `, x; w+ N sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ' k7 ~7 g' t3 k, n$ D
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
$ U2 x* c, Z' T: F' m server_msg_send(server, APP_CMD_LOG, tmp);2 V5 W% j& o/ c" K
9 [4 j3 d3 M# E% _ upp_error_count = 0;
: Y/ b3 _3 u. |7 _1 e upp_dmaq_int_cut = 0;
- o) t" \! t/ \. n$ ~* N" d. n // fill in data 3 D. O& v% p) I$ \
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
) g7 q1 p W0 _& |' o- l+ L server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
. N: o8 P1 Y, @) Y. R
% S6 X8 e6 _% Y8 `/ N& W // wait send success
# @- X9 k# e( t while (upp_dmaq_int_cut < 1 && upp_error_count == 0); * r1 f( z+ o K5 M5 k
3 x. a: [) J9 @3 b' U7 S
// make data node in free list
h- q6 _9 Z4 Y, Z; z: w: y- y5 s, ` ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);/ C s5 \/ C! _1 Y- A
server_msg_send(server, APP_CMD_LOG, "upp send: success");2 X9 f9 S$ I5 j3 m+ X" g
}
- U: O, \; b# M: i I: V) \7 U" m return true;
+ m0 Y# O6 g2 Y& D. o* o! X7 \}
. E, ~2 Y1 U/ b: r! z% F1 [, U. b
) ]+ y# A% b' \8 l4 k) ^" p, a: j9 B. C z# d( B* W
* [. l6 h4 A8 }! d( U; {& D. Q
- F* F4 m/ P' |. I7 f2 P
! d7 o' M, p) a8 ? |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|