|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
7 s6 F7 R4 d0 H$ V" s# R
( P$ K! p. c# f* ^- X% C. M4 O2 H问题描述:) L, f- w4 c. D. c
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
7 z( R4 a7 {; V" A, g8 A3 F/ n0 Q3 ^, k# T
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。( ^# D" M4 X- m' K: u1 K- q
1 ^5 o5 N! {( W0 d; L5 M& r
测试结果如下:, J2 D6 ^4 v H' E: G8 C
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
6 e$ `1 k4 W* C: G9 V" F! B* l6 C
0 v5 D! i/ x! q# [- b- ^- M( _) L! |3 C/ h% t' i4 z" \
备注:
, L9 G% f! L+ i1 B. L1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?0 V( c2 `9 b5 _3 _; w7 r/ `
2、相关代码如下:, A' ^' s* Z- o# `* P G8 R
//UPP DMA缓冲大小512字节- B% z6 ~5 q% @; q. j
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍9 e7 j4 w$ G2 {% h. G8 l
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT9 X- i8 a2 Q2 Y: Y1 m
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT): h! Q; X# W; _8 P# v& K# B1 f
/ f6 a, @. A. D5 R9 K
1 c. B; |4 O+ `2 r: v//upp接收、发送buffer
q" p# W/ t! B0 M5 \#pragma DATA_ALIGN(upp_buffer_a, 8)
3 `$ |: S2 L i {* J#pragma DATA_ALIGN(upp_buffer_b, 8)' i! x) j# ~, G
0 S8 w4 K' ?5 |: d' aunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
. b6 X8 P4 B7 H& Dunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
% J) s8 ]* }# o) B3 k+ `, p9 O9 N3 s# Z2 b7 G4 u
# R- R2 c) G2 ?+ Gstatic bool server_upp_data_recv(Server *server)
9 e7 R* P0 ~' c8 [0 c{
4 E) ?- E) ?% S5 \( @4 D* h if(server->upp_channel_a_recv == false) {- o f. }0 H# W/ l
server_msg_send(server, APP_CMD_LOG, "upp recv: start");( O( K) ?0 @+ M7 f9 V
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {* l% Z( B0 @3 T
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
+ p- V& x p# ]# J1 }* k! B* W
% e; [6 u/ C5 v& o, `
( X1 q+ u2 x5 e memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
1 \5 m v( s/ J! B, c" W% W) ?
8 ^5 D2 Y5 G+ { M: p server->upp_channel_a_recv = true;//
* H& l- _0 @: l* {: ?8 Y server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
3 s3 o2 G' ]4 k0 W* C# F _ server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
( B! h* p# K6 h( y3 R( o server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
; J/ b2 d0 B9 I+ z( M9 G server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//! K6 B6 R( n/ M. u4 S4 y* }, @
# Y) A, p/ T7 N+ y* w upp_error_count = 0;$ ~3 A% j+ ?) V" }6 s' m. T
upp_dmai_int_cut = 0;% n* H% w* o% ]" A! x' j# q
0 g- W+ F$ Q, r! L
// fill in data 9 u, z; T# }& I
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);5 W1 x* [5 Z( s; ?! ~ [9 Y; a
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
5 b7 Y" T' E) _- Z }
8 c% ?6 l5 {5 A7 `7 v1 V- i: r( |9 Z }
3 ?( z8 t. C( w/ B% W q else{
3 a% @ `0 e$ t# U0 [6 m6 W if (upp_dmai_int_cut > 0){
" j8 X* A; L- |, t+ F DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
3 |- n4 _5 [9 k6 J* g Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);7 z9 a" e7 r1 D* G
+ v7 _# R: L, M+ [" d
6 x( S" m* n F5 g2 o8 H3 G //copy data to upp_recv_list_busy
# E7 K- G9 z" K% b' `* d memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
" j( S/ r, k# o# T0 G* K# U. a, M5 k9 E
//( I% F2 J& Q0 F* K1 z2 J
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
; y! L. t: N S+ f) Z k) V& o6 G7 r4 s
8 r9 ]2 [% \' {) S t3 g" ` //! \$ A5 [. o; z
server->upp_channel_a_recv = false;//3 p0 e/ A* c2 }$ Q: N
( ]; B& E$ Z% d1 B0 u) G
server_msg_send(server, APP_CMD_LOG, "upp recv: success");3 v. K5 `1 L' `; X+ ]
}
4 D2 A& z% m5 z }' b- P0 }$ w' }& w
, l; K9 p7 I* M
7 T8 l7 D, o, I return true;
' |. }! m+ x% F# l% @}
4 |1 \0 `/ p1 q0 r0 t9 a. ]$ p/ y
static bool server_upp_data_send(Server *server)8 ]- i( l. b$ b& L
{: P% V7 f) j" i$ G) d6 [1 e
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
+ |$ m/ H% L; a1 u$ J1 M- z* n8 H2 B/ Z DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);% a+ P5 E) W9 A& C6 \# Q
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
6 f: N2 \1 E5 S$ d% x( }8 U- u char tmp[128] ={0};5 L7 u; ?% e# S
" p( p8 B7 d0 Q* W* X# Z- Z server_msg_send(server, APP_CMD_LOG, "upp send: start");) \$ g! h0 C8 r' K5 J9 p, v
print_log(server, data, 64);; ]9 h* P6 T# J5 Y+ U
+ s! Q, i4 G/ W: ]
//( l4 H. H8 e1 h4 U, D0 k& }
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
4 N. u5 l% R1 M7 x& `) }- ~5 V memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE); j9 r. w" }; m0 {' l8 w; A
print_log(server, upp_buffer_b, 64);
* o9 R8 v4 j) |' U: |
7 @ \) y; W+ q% ]! N2 z server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);* G9 C# R9 @1 E2 }. d9 [7 ?7 m, F
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
* Z0 Z$ Y/ ^1 R: m d- z, k server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;% }% U2 Y/ a' U9 |. l
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
j/ D. ~* b) e9 \' p- j$ }( \4 `
memset(tmp, 0, sizeof(tmp));
% e$ \+ ]4 M& m9 i/ B# F! E sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 7 D/ N& g; d# q3 H5 v: l
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
) J) B! Y% q0 T server_msg_send(server, APP_CMD_LOG, tmp);0 Q: b7 i0 e8 b" B8 p' C: T; B
: S, Y8 A1 Q* \' F upp_error_count = 0;# r* h7 V: e7 i7 O
upp_dmaq_int_cut = 0;
9 m5 a: q$ y; Q6 N1 C9 A* ? // fill in data
( z' h; g4 ~5 g4 }; G/ p5 c uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ) @& l; J- X y2 V
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
2 m9 r: j- }, D! Y& ^- M. k/ W
' P0 O2 A2 I( Q4 j2 G* V# v // wait send success* k6 d: ^- @) F" ], N2 O X
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
( `) a. [4 B3 r: A" z2 r' y
7 y' @6 ^, D. ^, r4 N; z U* ^ // make data node in free list 9 i' w8 p) D t; {& y; h c* j) Y
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
" {8 |) F* m7 B& K _ server_msg_send(server, APP_CMD_LOG, "upp send: success");: D+ E3 c6 y, C* Q! d
}
( l* `" ~3 N4 E8 j: ~8 | return true;2 l9 p$ I9 H5 C
}3 B2 l) z s- X0 e2 L
" J; \) G e' a1 [
6 n# R- ^0 L7 m6 D& j, H u5 Z- o
: O- u0 X! Z5 q2 V: ?6 O I5 e) V" }2 A* y
! p% L/ I# w2 [0 _ |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|