|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
, v7 Q3 G& B' x+ w
, N# M" H4 G" l, `6 B6 p问题描述:
* s+ |5 A+ [" ^6 m在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
5 m; g4 Z+ |7 B; s7 t9 E* e
9 X6 A$ y: M5 N9 K2 r( I2 f. ?' b8 i图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。+ a+ s1 }/ J; T
$ `8 S3 V+ ^; W: q$ Z" p; z& o测试结果如下:5 n& s& P1 D: {, [( K# e
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?. v0 U4 R' L4 g m% m5 k1 G0 E
: ?" K) Y; e; f6 T6 t6 ?1 ]5 L& w7 W7 j1 f6 c
备注:, N6 `6 K& y8 e+ C! B+ I8 q
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
3 Y9 }2 Q4 F: ]( l- T& K& A* K2、相关代码如下:
1 i7 D& c0 v4 z+ ^ N1 y7 Z//UPP DMA缓冲大小512字节: B! z3 ^" J+ y9 K( X) F
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
* Z. D. o( R* |- }, S#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT! m; Z7 f: d* h. Y; ]
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)6 R% y& C+ I7 J% C
: X- W4 |% u- }9 o7 t& X7 J
# ]* q& M, q* }//upp接收、发送buffer9 _! b4 l* p6 @; u) r ?
#pragma DATA_ALIGN(upp_buffer_a, 8)4 J3 O2 T8 l1 H+ T3 u
#pragma DATA_ALIGN(upp_buffer_b, 8)
& \% P$ @4 C% e9 K: V$ b5 |' W, B( w8 ]0 z
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];1 y7 h; i A8 e) Z4 f
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
7 z7 x1 |' ~( C
7 q- w+ Y$ q, g$ O: Y3 x$ K2 b2 a% [. d. O0 i. U2 l
static bool server_upp_data_recv(Server *server) 9 |/ l9 A; I6 J4 u% g8 ?7 V
{
/ N K' {2 S1 R+ i if(server->upp_channel_a_recv == false) {
) j: W1 u9 A: ]9 ] server_msg_send(server, APP_CMD_LOG, "upp recv: start");
0 q6 \5 ]6 I% ` b r C if(ListMP_empty(server->upp_recv_list_free) == FALSE) {5 E! K1 S6 \- H, X9 b
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
) K# H$ w' F, T7 G
/ m& r3 C5 V. }" X
( z( T* j m3 I, }7 H2 J memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
/ b' `& N ]0 U8 x3 L! @* ~
/ }3 A: n `; P$ } server->upp_channel_a_recv = true;//* V2 [: _; Z) M+ s1 d6 P; D3 O
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);4 u) V- K' F. f6 H- [1 h7 ?/ H
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
7 x1 `+ n; H @; N4 W& X5 I; q server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;6 `) m$ l; c7 y( h
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;// N& t$ r( b9 m
9 i4 l& p/ B; J x
upp_error_count = 0;8 F' D! a0 e( A7 H7 r
upp_dmai_int_cut = 0;
; G& |* D! s0 q1 W& _. k+ D& n
, t' h5 J8 M) e2 v/ G1 A9 B // fill in data
' [9 i* o% N: j4 A8 b/ z uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);1 L% \% u! e+ L+ `8 U
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
6 K: t4 K3 ^' M( o4 c }4 o% z2 [( R) X/ N! H# p, G0 c% M- g( s9 u
}
# i: [3 R/ A6 }4 G; p3 r else{
) H2 J; E3 ]4 |" r6 b if (upp_dmai_int_cut > 0){+ b- E- _% V, p- S
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);! m/ D6 b; t. C3 P/ O" z
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
. K$ y& L, S$ }* R' g8 d, I2 ~
, n; c; F( \' d8 d" k$ k3 j( U( t6 e6 q5 w: Y6 {
//copy data to upp_recv_list_busy% A) I6 E" P: | ~+ E
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
$ p F( j# y. _9 c2 G; P4 p# o
7 h: _: O) W v, y. A //
7 S2 S0 `; K% @ ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);/ T5 [8 D) K# X4 k4 q8 Q
* W. q* {; v' y/ Z //
# K4 z+ Y( _" v7 W0 Z server->upp_channel_a_recv = false;//
2 ^9 M/ h v( K8 c% ], s6 J! q% Q. g# n/ M" N; m2 @
server_msg_send(server, APP_CMD_LOG, "upp recv: success");& G* A! s5 C4 k K
}8 C9 q) n$ U8 \# `
}) J9 V9 X. q$ b9 o& q; O6 t* B
+ \- A6 s5 N3 a% @ I- w$ l$ D3 G, k! q
return true;4 }4 f. b' O/ ^* v+ B- Q
}" n, B5 ?9 N/ f7 A# r0 v+ H
4 }) o' n% o) z) M3 M8 b! e# n
static bool server_upp_data_send(Server *server)
* Z) U. k# x! a" x! H8 v4 d{5 r) \5 k J: ` \: n
if(ListMP_empty(server->upp_send_list_busy) == FALSE){, F' F* Z0 U! ^3 M2 g( g
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);& g. z; ?* B# p6 s( }% r% [5 n9 [
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
2 ]3 c1 N, z1 I, t, J" h! e' s char tmp[128] ={0};
& p( _! w8 @, x( Y/ y4 \# X* l. H9 x* v% H
server_msg_send(server, APP_CMD_LOG, "upp send: start");
N0 ]3 D4 z1 N. C print_log(server, data, 64);- V+ s8 G2 d2 g C# w- U
& ^. c& D" }2 s7 F
//
8 Z! ~0 l5 E* q% [9 ]$ i1 i2 m memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
& l- z" H7 e Z( b memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
% E, W1 P& c7 L% p$ c print_log(server, upp_buffer_b, 64);: T _7 E* b5 n7 Q$ F% r4 _3 E9 I
" @% e: D; N7 M$ z& a
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
9 A6 @! w6 B2 n: V server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; " C# u/ i$ r% w' `# P1 q: `' V
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;# s" Q0 ]* Q% U2 m6 N" U
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
1 l) ~% O8 v7 g; b+ s( L( ~. ~: I+ p) n, q- c3 E
memset(tmp, 0, sizeof(tmp));
: _9 Y. k4 [4 k sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", . W1 \9 y. V a
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);# e, B1 ]5 @8 B$ j/ U: [1 O
server_msg_send(server, APP_CMD_LOG, tmp);& b: w( o7 e) b8 k' Y: _. d; D1 p
" b. G M. D& [$ H upp_error_count = 0;: z2 v5 R- Y$ J1 y3 J2 @
upp_dmaq_int_cut = 0;& `+ B) s7 \* N/ Z
// fill in data
% [$ L& y( G: V uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
! v) v- x& Q x" p server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
' g' n U& r1 u* \2 @
Q: ^. o! K' K& B // wait send success0 Y, y9 L7 M, c
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 3 J" m5 b+ L8 }9 ^* W5 ~. n
# L1 e- N& u; k4 ~8 Q
// make data node in free list
, _5 C* f% t* D ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
. `2 D8 I; y" e/ y' W9 D server_msg_send(server, APP_CMD_LOG, "upp send: success");
8 A. i5 M0 P2 {9 o8 o* f U }
2 I. Y( z4 R' k4 \* r0 M return true;3 E) h* s0 `- [- m+ Y, ?, T
}
6 B/ m0 ~0 U9 e% {! e
. j7 D' F4 P$ G, d: X; \
& J6 w) I* ]% Y" W4 L% X! R/ m
' Y) P1 U4 f+ N( J) s. Z, J# _3 z' F3 w* n
) d$ ~2 {" Y8 ?
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|