|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 - s# I! a4 W ?$ ]" S% c4 E4 X
& k) v% f Q3 }" G
问题描述:
0 g; `8 H% J& S3 [在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
: j. ~. H$ j7 _" ^% W W/ O+ R, N
/ B- M1 \ U1 D5 z1 f* {/ X图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。3 u; z1 G0 d( F5 ?% @& g' L
) W4 b1 W0 l1 p
测试结果如下:
$ }$ [/ e: F9 C; W6 q1 \0 w138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?, k- e# l' m) H2 C( [0 b4 C: L
7 [; F% I! X$ _/ r5 h) n" `7 o: D7 C- p+ f& |( g7 L
备注:8 p0 X' r. D2 | W
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?# t# A1 g" B; i* h+ @# M) k+ |2 Z
2、相关代码如下:
/ z- i4 W! M v; ^. b& y8 H//UPP DMA缓冲大小512字节
2 ]0 c0 v- A8 z5 N! W#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
: W, o7 k) o, O. u' J#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT" K0 h- \8 U% u) H+ r
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
1 G1 x. b8 a0 A3 V8 W1 `4 d: J2 t5 v# `: X. u; [
( t9 G: [# I& p; {: e( q: \9 o2 w9 e; |1 R
//upp接收、发送buffer
- L0 O0 t5 f" g4 I/ H/ ?" S; I D n#pragma DATA_ALIGN(upp_buffer_a, 8)( }: ]. N* y3 {6 b9 j) l5 \5 B
#pragma DATA_ALIGN(upp_buffer_b, 8)6 V. e3 S ^" b: O1 Q& h7 K3 f, n- S
1 \, d1 D% K0 z- Qunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
; r: e) R. t/ v$ a& F2 p$ i1 ounsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];4 E9 L! g! Q8 Z& z
3 a+ q# ?. n Z" n
+ z# c \8 _- e) \static bool server_upp_data_recv(Server *server) 3 P7 F- _: P4 f( K6 H+ U
{9 M& M8 ]/ y: ~4 J
if(server->upp_channel_a_recv == false) {8 \/ o- Y1 g M# E
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
) [- x" U, h* [$ [) H! @3 x# I) v1 _ if(ListMP_empty(server->upp_recv_list_free) == FALSE) {( L- w6 d! V4 K% y3 b1 Q% F% R
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
/ M/ P4 g/ T' y7 i
$ g8 R3 I+ a" P, E) C u! T5 q" G8 a7 u& L6 ]/ s
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
P# J5 l4 r, k/ n; D. ^* r V& o3 k6 h; m" V3 ^
server->upp_channel_a_recv = true;// n& s1 G+ q$ N" i6 j+ }, I1 t
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a); D6 g+ R, l- F
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
' {( x2 T2 ~ z2 N; G- K server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;' r$ O( C% G' W3 A" C
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//8 j) q+ z- A- C7 }
9 b7 C* d( v& h2 j4 I upp_error_count = 0;+ W% a$ S9 a% S y6 Q
upp_dmai_int_cut = 0;% N" }! a/ R& p& ?0 G$ U
5 b6 t+ Y& w+ \
// fill in data
$ ]7 l" C9 ^5 G( j: w uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
* K6 C) G( ~9 w- P: w8 q/ q) { Y server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");7 t& m2 j/ c( i- f% G, E
}' C! U$ ^; ~- K2 [/ B
}
0 D' j5 h" H. N- V' v% ] y x- u else{1 X; F% m9 O" U" P
if (upp_dmai_int_cut > 0){
% _7 G8 J: V; c; f6 S2 N, R( | DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
5 M! M* L$ A7 z Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);1 u ~2 W! F& j1 @8 U) ?9 ~) b' d
4 r1 i; j, [ L4 I
|4 @ @7 C5 F3 g //copy data to upp_recv_list_busy3 |) |. d3 M4 U, C' U3 ?
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
. j/ l/ x& V8 w3 x9 h3 z- t' r5 p- g1 K2 H+ X. ^# w7 k
//8 D8 {$ n# O* V; K ]
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
/ a2 K+ L+ O) G. O8 p! ?' ^4 x+ ?) n) I# u( T1 Z- Q6 \
//
( [" m+ P9 x! y' c: W2 i# k& @ server->upp_channel_a_recv = false;//8 F7 t. G- [; V* P
4 R- A% }$ Q1 @ server_msg_send(server, APP_CMD_LOG, "upp recv: success");' r" j" z( n- a G5 [0 U$ F$ o" ]. W
}
8 D/ s- A: d! N, o9 w/ s }
, Y! ~1 U( l3 i- k, p9 i5 I- ?; C( ?$ L$ [# Y) _' N6 p
8 J0 H' S+ m0 a, A5 w
return true;" o; Y: l4 x% i
}
: g3 F" s9 @ r9 n U. X% ?" u% c7 W$ Q# \& P
static bool server_upp_data_send(Server *server)! K" X" J! o1 u8 t& P0 Z) `
{
* s5 G* |0 q3 K if(ListMP_empty(server->upp_send_list_busy) == FALSE){( }+ M% [' |) j7 S9 p# v( L
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);0 b. H3 A" |, w" @4 z4 H
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);8 d+ u" J( y, o$ W3 G' x# A9 t
char tmp[128] ={0};; B: {! X) w, b/ h
! t4 V( u; O$ a% L* K server_msg_send(server, APP_CMD_LOG, "upp send: start");
( O& b) m9 w- F print_log(server, data, 64);
) e: F6 r! ^5 c- A, F* w5 h z" R) F# D1 @% R! @. q. Q
//
( `% u( s! b5 H memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
, {( I) w8 j v( ~- @$ d: | memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);9 J w# d4 s- G& Z1 O8 |
print_log(server, upp_buffer_b, 64);0 o9 f7 v4 @# q9 T A' v. H$ i
; l# o3 c7 \5 N$ s: E' N, h0 @ server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
* [/ }- F( ~ X server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; $ n, _1 }! Y) `$ @. q- D
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;9 \+ s, F) r) x- m$ W
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;2 u* J# H5 _0 g- T* O
- v ]# x' S, M6 C& i1 o( r memset(tmp, 0, sizeof(tmp));
$ e5 [1 G$ P2 @; k2 [" F sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", # C, k) ~( m- j4 ?
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
1 i# |" I. x* J" U# N/ H8 n5 } server_msg_send(server, APP_CMD_LOG, tmp);
; L& B: {- ~/ O% }7 f0 _- ]" c
1 ]7 N0 h1 Z& j! F( d8 H- { upp_error_count = 0;
2 G7 t+ k0 ~2 q3 O' e upp_dmaq_int_cut = 0;
) f: }9 F0 r6 G4 _5 m // fill in data 9 V* R. Q3 w) ]/ h: L5 g& K
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
. j/ k% K3 u. Y8 Q f server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");& p) n2 P* `$ P
8 a0 S5 e9 L" G" Y( D. M
// wait send success" G1 t/ g9 P. j* D/ {' |
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
) `) z& }3 x+ t1 u' c+ X: s3 A+ d; O G9 p2 h7 j+ P7 I
// make data node in free list * Z- Z! Z2 v( u. {
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
" q, z4 m, W5 E2 y5 v server_msg_send(server, APP_CMD_LOG, "upp send: success");
: C, p$ {5 A# R! r$ b$ {+ X% b }, J9 D# T# c1 W7 q& @# d
return true;3 c2 k$ l+ `5 R7 K
}/ S% U' O5 b$ W9 z
( t2 p" j* K1 w+ z( C: B* [. n m
4 s+ ^. ]8 K4 g( f, ^; v
1 S N/ `3 a- R- _: |
4 G8 x& _ E1 b/ O8 x0 N8 K- c) p7 I" f/ U. f" J8 {" r
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|