|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ' t* b2 \) X9 S9 E
! {" q! f6 B! G P2 }7 W, J
问题描述:8 q& f9 n$ @: w! @, b s
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
$ j" a2 t7 Y7 O* E4 v7 X4 }1 g: h; b, `5 q& P p! B
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
( _& r$ }0 f8 H( |, Z* ^0 P. Q y- w
测试结果如下:
2 Q0 \1 m. O7 l8 A138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
# V: s7 } T* u2 t9 U; m1 s/ K2 |0 u/ [+ {- v
9 N# _8 }( T8 G x ]. a& I; m. d$ Q备注:0 Q% f/ U% P0 {0 w9 D3 ?+ b
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?4 p5 L# _' C! ]3 y k
2、相关代码如下:
& r* ?- m- ?4 l0 d//UPP DMA缓冲大小512字节0 l9 A6 x* X1 |7 E9 Y, @% `
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
$ J$ J2 T* A U# ?+ H#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT' C6 V2 P3 P3 S! S7 a- a
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)& N) ~0 ]; u+ d) J
8 c7 c$ g$ F9 L/ T
; k, y+ S8 ?/ B% Q& R8 D. i//upp接收、发送buffer8 d0 b5 }' E4 E. h# g1 B A
#pragma DATA_ALIGN(upp_buffer_a, 8)
& d" b5 Y9 e/ f2 B& y( Y) r#pragma DATA_ALIGN(upp_buffer_b, 8)
# R. J a m+ U, Q) f; y. V' C" u" B ^
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
; u, |$ `0 s! A; eunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
0 n& l# G* A4 p* g) i: z8 w
" U: Q1 d! V+ ~3 I- _" s) c+ f) V; ^9 N
static bool server_upp_data_recv(Server *server)
/ \* R" x/ A3 } P9 d{
3 ^7 ?/ T$ ~* t9 c if(server->upp_channel_a_recv == false) {7 N& P6 E5 @$ u. w
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
# G: w9 X% C) E. E if(ListMP_empty(server->upp_recv_list_free) == FALSE) {+ Z4 l5 p. W* Z, [
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
( Z0 V$ K* B1 u8 I: E0 M9 ?0 {0 r) S$ c8 f4 \3 K7 J7 l1 Z+ J
! @/ a" D7 L- p. f- _ memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
5 ^% z5 s8 O0 u5 v0 [
7 v2 E% O' J' c% ?$ b$ G3 U( ?5 _, E4 l server->upp_channel_a_recv = true;//
) \- q- m% Y7 I! L" W) S$ O server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
% _+ Z: k2 \2 ? server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;' D3 _8 O9 h9 |; [: A; u$ T- m
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
. @- n0 Q. r8 S8 b$ y) v server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
: z9 ^7 t$ L$ A2 W3 c4 ]
; H x; X2 C% V: { ~5 ~ upp_error_count = 0;2 n% ~: u p l( P, b2 F$ M# R
upp_dmai_int_cut = 0;3 U3 @5 N& e$ H& G( n9 w1 g
0 n" v4 \ w+ J. H // fill in data
. o8 w' j/ X' x) ]" |$ |5 ^& ~ uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);/ B3 G0 d4 c: e* \+ P
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
8 a0 O0 S1 [; z: l5 K }
; a' c/ q4 B. P3 Y! w }/ y" @: x% w5 \0 t) |* y
else{. f6 j2 F$ T& N6 T- v2 E
if (upp_dmai_int_cut > 0){
- K0 n k1 P$ I( ]* g DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);2 I9 [; R$ d6 V6 H& M
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
" l* J) O. [' |5 }9 a+ e" i# O. ^3 G" [8 N
0 l/ s1 v8 S7 i) H7 F //copy data to upp_recv_list_busy8 z1 y+ S4 o0 e/ b
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
9 j9 I. N6 R/ T% s/ S- b4 Q3 \5 N% u9 K! h- o/ R: K5 C7 i
//7 c) F B- }5 q8 D* B) r! ?
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);* ^5 y2 t2 `! u0 T% Y& u+ \. t
& l4 t+ Z N8 X$ T- B! _% ` //; k4 b% a3 X; j( d+ g! M" C! H$ L9 y5 f
server->upp_channel_a_recv = false;//
* ? c# X# {! L8 a" T8 `9 W: d; @! w, Q
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
0 [! l: { t# Y6 e }
3 H5 E, x- I% m* m4 a; n: P7 m3 h }
' s4 C' o+ w i$ u5 ^
. }! X8 A" _7 @, a# K8 ^: _
# R5 X2 A: N( f' Z7 b" o" W return true;
! N# ]. `- x% Z o! k% G4 `0 T- R}7 s! O% m+ \$ P7 l2 }
5 m) P( t/ g2 [! ~5 t3 Z0 r* a
static bool server_upp_data_send(Server *server)
A" |$ e% F+ Q6 _. G: ]/ s{
& r& y3 ^7 U5 q3 v+ J1 M, O5 Y if(ListMP_empty(server->upp_send_list_busy) == FALSE){! i. X# e2 P* E) Q% y0 d- t. ?# K
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);5 z0 S" Z; ]* t* y* J0 V# y
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
0 p) T+ \. D* x, z char tmp[128] ={0};' ]5 ~, S" R- ?4 `, i
" z$ c. H' p1 n5 @8 z) j server_msg_send(server, APP_CMD_LOG, "upp send: start");* \. L7 R0 b* B0 s
print_log(server, data, 64);( @- \+ T: N9 u9 k9 d3 f
0 l* j2 a+ h$ ?5 c1 `
//
! Z- ^7 c+ M2 C4 E memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);+ y6 [7 }7 O$ d4 P) N) G6 q* y: L6 A0 k6 w
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
! O1 H/ `$ t' i0 R$ E print_log(server, upp_buffer_b, 64);2 Q6 A2 Y( y) F- c
1 N Y M. D* | server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
3 Z$ C H u) l% F1 R server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; / m6 W8 U5 T- p( u+ b; S) J+ j
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;! p( J1 i [1 I9 K, A! F8 k
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
# t/ a# O4 v/ v+ o6 |* I
1 Y* u9 x7 S0 f! Z: p8 x3 K& Z memset(tmp, 0, sizeof(tmp));; a& I' @ E" ]8 W7 X! r# k
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
) J* `7 }% e4 h2 Y; U; v sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);5 L. _" Q9 G3 g/ e: s& {0 B; o8 d
server_msg_send(server, APP_CMD_LOG, tmp);4 ^2 ?3 O. c+ m. _/ L3 @
# h$ U& R/ m/ P4 z: g upp_error_count = 0;
1 t: ?( ~% |( j2 z upp_dmaq_int_cut = 0;
% R5 x: m& _! l // fill in data ) _4 Z: R" |. X5 o! j, X* y0 O
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 2 q' M# {6 i) W& M4 [3 ^7 }0 H
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
6 C; h w) f- ]/ U2 G# v0 U$ ^$ e3 l7 Y( f/ r5 }
// wait send success6 `! t5 @5 |# X
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
. z) j8 V" ~& S3 n7 i) T1 D
`& Z' U5 U$ m5 g6 r: X* E // make data node in free list . D% D2 r2 E0 Q' y2 \* N
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
& h# B/ k5 o: F0 Q( o+ f! ^ server_msg_send(server, APP_CMD_LOG, "upp send: success");' m2 d) T+ v/ V0 ~+ k* i$ z* W7 l
}' [( x! g% Y8 B6 C& T W' B2 o
return true;& J8 T: l$ [" v) H% M1 F. B7 c
}2 l! `; V' W6 x3 S
( Y; z2 a; ?! g9 h$ Y1 _7 z, O0 X* d6 l4 I$ Y5 }
; g* a. z9 A9 B, q$ n& p# m7 Q+ O
% C3 @4 N) T2 r( b5 d
; w5 _1 a3 d U+ E V3 c! D
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|