|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 , N2 h& R# F* D+ \& o: Z. D
U( o! b2 C$ Y! X0 j0 l# J) U0 F& E
问题描述:
+ |4 _1 H4 f& c S9 W在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
3 c9 D) q4 {- D* j9 t
$ j* @' B8 n* G3 s图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
! v5 G5 `7 i6 M' ]1 i, }. E0 j, g9 r' Y% H: a' E8 A
测试结果如下:
" Y# w6 E9 h6 A+ P138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?+ o$ Y) |% o+ @1 P. m6 F* {$ a# y) [
! O" x" y# H: k
: e5 [ h8 d: b; S' S8 k备注:
5 X( c" u# `" S7 X1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
8 r3 @7 K7 u' v2、相关代码如下:( L0 t2 E: e; ^6 w3 d
//UPP DMA缓冲大小512字节
- ?: R2 _2 d; h. K% D# L#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍$ C1 `9 O$ D- B! P5 p* @, P
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT* p7 I' b1 t" P. M1 F& y$ @
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
/ X1 a1 V3 T+ G H+ T( L3 } G9 e3 N/ i3 e. {- [+ e# \. {- j! A
. V J! a0 _' w; M( P* Z9 I//upp接收、发送buffer
9 D8 R. _0 D8 [3 ]+ s#pragma DATA_ALIGN(upp_buffer_a, 8)1 L1 c4 y; w3 z6 {% _! v7 d! T
#pragma DATA_ALIGN(upp_buffer_b, 8)6 [- s6 u3 Q& a8 g, c8 r
# ]) l/ X" ?- z" Ounsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];# f6 Y, G) k5 z8 |( I
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];- W: c1 H3 N8 Q6 @
! L. z8 ~; t2 j
! Y' t: w% A( K0 o' e! lstatic bool server_upp_data_recv(Server *server)
# I3 V- L, }. U9 D- ]3 H+ Z{
4 V4 ^& y( j7 f4 W6 e/ Y if(server->upp_channel_a_recv == false) {
, t5 J* n, J4 x- g B" O2 ~ server_msg_send(server, APP_CMD_LOG, "upp recv: start");4 p0 H3 ^- ]/ X$ ~9 J( ?& B
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {) I3 z+ r) P8 b. _
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
3 S( i# @1 ]! ?# Z; M: y
7 E; J: p3 Q" L2 _) d
* m6 l* M, m* t5 S! r3 q! H memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);/ j+ R# T/ j# M/ h: ~, g5 u3 J
7 X: y' i: r$ N: c) ]% G server->upp_channel_a_recv = true;//
" k v0 l, M% ?: E& T0 h2 T q server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);3 J' o! u# {2 k$ ^% p
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT; p, |( x! ^& a
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;5 ?1 i2 D, l& ]
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//$ m' |) l; A2 v3 K4 Q- E& J: ~
: h) o3 ^. l$ Y5 n* L" A upp_error_count = 0;
# B5 a: S; v5 s1 E4 z7 B! j& I" ]- C upp_dmai_int_cut = 0;8 z0 U) H7 P2 {& J% S
; V4 i) ]" i3 O) {7 ~ // fill in data
! }0 x/ @2 o3 u2 A* d, ?+ S* ]) S uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA); E5 g+ s5 Q, `! V4 z8 r7 p: k% X
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
0 y. C5 \5 @8 q. c# y+ c }; v! q+ _" w3 a" Q- H& V+ E
}/ [6 [, x9 }& \! W6 x: U
else{
: E2 T3 d: g" h; u1 F" R, B3 U- b if (upp_dmai_int_cut > 0){
6 X5 W6 B) o5 ?: z DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
7 D4 g( t* C5 g1 j Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
+ c N' i6 p" z
6 d+ S* b- y& P4 A* I1 r' I4 H) l3 I9 Q0 V- k, X
//copy data to upp_recv_list_busy( M2 K" ]9 g7 [3 |
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);2 k; ~# G) I7 h3 @6 i
% m$ [! G% @: i$ A5 w2 ` //
' _1 [: a; M$ ^( B8 N$ x! | ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
" e4 w% s% O6 K# W. P r6 T) g! v& b. C3 t& x
//) H% G- s4 \8 @2 E0 _
server->upp_channel_a_recv = false;/// S: I0 z) L. E: W z( ?" H* i
) F; s0 {2 [4 d, h. S. Z; h server_msg_send(server, APP_CMD_LOG, "upp recv: success");
" Y$ a4 [5 k* g! I$ K }/ F: M- N" p) s/ y0 |) U
}
2 ^1 Q e0 S7 ~& p3 { c( k5 e2 q" o
; x0 P+ @$ N7 E; U3 b! R F6 U7 Q/ f2 n7 A4 D8 C) N, B
return true;3 H9 z$ n1 i) r
}* ^# N# C# p1 v# E" g
) x: |5 y1 i: [) y
static bool server_upp_data_send(Server *server)
0 F7 k5 q- l' l E+ c" _{: v5 z1 o1 q# ?3 I5 Y
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
, Y7 M- n. m( F2 N7 |! _0 }0 w DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
r. k% c; b j A f3 T1 @4 a- H8 T. T unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);# j8 M; ]; B6 w: _# i
char tmp[128] ={0};& H$ w9 z. p/ G' C
& U6 R8 t& j, g5 Z8 P2 w0 ^
server_msg_send(server, APP_CMD_LOG, "upp send: start");4 y( Q L% a# ]9 v" o/ A
print_log(server, data, 64);- f& x) j5 R& N" A$ L$ c
% N8 l* J5 j; y( g, K //
: H" D* j4 u7 {7 l# N4 X0 a memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);! T; _! b3 x% B$ F
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);% o }& x( g x9 Y! W# Q, x) D
print_log(server, upp_buffer_b, 64);- `/ v# T0 L2 V8 O
* U* ]1 W. f9 q; U' @; g server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
; y- ~- B$ R8 O% z A/ g server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 3 Q H% Y: ]4 ]- l2 K& m8 j
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;# @# r6 y8 p; g; n4 E Q
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
: U( z3 k$ J; F5 @3 D8 S& q7 D, z! Z' q' @
memset(tmp, 0, sizeof(tmp));
! W! a" e$ ?$ q1 G& H, ^3 ` sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
; S% s7 i0 j) v$ j1 F1 f sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
1 l' `" J! v' { server_msg_send(server, APP_CMD_LOG, tmp); t9 }) N& @6 q5 t" s9 j0 f
2 u* D% E k, A: ]: { upp_error_count = 0;$ h; M* b. `0 P( b3 [
upp_dmaq_int_cut = 0;
3 D* x" `/ Y* O1 d8 }- h8 }+ i% t // fill in data
; ~' X2 n4 W/ _6 _3 D uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 0 Y1 O/ U5 [7 |$ N6 y$ P! K, Q
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");, @4 O& \; e! }" c( D6 r% f( a! p1 C
8 h# E3 F3 e Z9 o // wait send success" J# Z/ C2 n* @8 d. y" I5 e
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); - x2 K/ k2 V. l' Z- j: j
' s3 n; J5 t" E7 u9 V1 f& _ // make data node in free list
; d0 k& m. _6 `7 w+ G ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
" g- q2 y: X( N# l8 |6 c% K. C server_msg_send(server, APP_CMD_LOG, "upp send: success");" M' V. |" E2 |+ \! D, k! U8 x5 H
}* p3 c; }# l! [. g# Y- n: `$ w
return true;+ f, ?( }0 r& {; }
}
3 D" R8 f/ N" f+ T4 Y& P( t5 U# W) ]6 K) B
8 Q) y- N+ E# x7 Q
3 V+ w& x. g: l% y [6 X) @
9 M p4 F- j1 G0 c
4 e: Y, O; g4 {7 E( k- G |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|