|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
2 y) A5 g( j* N7 s* u6 q
- |4 B0 b% B+ C/ I问题描述:
- Z! K& B) \. F3 j在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
4 N5 W3 K; k2 B4 D0 x4 ]' C7 V% ^8 D+ P7 P' l$ v
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
5 ?0 [4 J+ v6 _ }- i+ A h: l5 F n& r0 q' A0 O: }
测试结果如下:
3 o( B& u% r1 s1 g. `+ h5 \* }$ t S7 s138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
: }" m, c8 p: G+ B* X/ q
& {. Z5 L: _7 E
8 j o; q+ D7 J$ r; a备注:
6 L; D* c6 m( g0 D! v7 e1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
, J' g4 m) A5 F' l. Q5 q. S2、相关代码如下:: T% B+ q- p" d6 S+ c
//UPP DMA缓冲大小512字节5 z2 W8 r% s& c/ h9 C
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍- ]7 P8 z7 j' s4 F! X& G
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
z& h R. k0 X0 b- B5 b#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)$ L3 r3 b. j7 i* i; z; z
, a+ g+ r- e( I9 I4 E' {$ F% J" s7 I
//upp接收、发送buffer: I- P1 [8 \: R, j4 m
#pragma DATA_ALIGN(upp_buffer_a, 8)1 h8 h0 }- y, {
#pragma DATA_ALIGN(upp_buffer_b, 8)9 H0 e6 _( _/ @; d3 q" _
, [8 }' G1 A+ M6 L; b1 ~
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];1 u) X j" w9 S" X4 d( E2 \$ a
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];. b: \* N! h6 ?% E4 L2 k8 q) o1 ^
. T1 P; b3 {9 j7 y1 r" c7 A2 s) f6 }8 j/ }! X8 n
static bool server_upp_data_recv(Server *server)
3 q" P- S2 I* k5 ]+ B9 c h{4 u% C& r8 h5 M' L
if(server->upp_channel_a_recv == false) {
, E9 E4 G" t8 d. A0 y$ R4 N( K! Q server_msg_send(server, APP_CMD_LOG, "upp recv: start");. e6 Q! }% m6 G/ C8 w$ D
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {8 {1 t8 j3 ? z! Z4 F# G$ L
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
1 n" R5 \, N( V9 L$ W0 J C, ?1 {+ F: a$ I6 _' T( N% q% C" Y. S
* k5 {. y9 P, a! { memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);! s3 c% s4 c5 i0 t
, K) c8 s R W4 ~' F: z
server->upp_channel_a_recv = true;//9 U. ^8 P2 f, a9 J2 _9 V
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);5 f% p) `, F9 n" I! T) s
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;+ Y8 h0 z5 T* ~6 Q/ A5 L- e8 o3 [
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
- y1 D- v/ W8 m0 q. A* ^ server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//9 _8 \2 K; J/ o8 H0 N
/ {+ o7 m( T! o/ Z2 M. N upp_error_count = 0;
2 p" S* A3 `& v' Z. a! t6 T' ] upp_dmai_int_cut = 0;0 y2 t: x/ {$ s& |
; e! K5 r, ~5 [4 s7 E
// fill in data
' c( m1 S: f G, R* U uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
: D' U: r% H, a4 D) B- r, E* u server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");% C- Z) P# |7 M2 @4 D* ~+ S3 V
}* A3 G* U, i# L" t
}
$ k) J& v* U+ k4 l- z% P else{4 g" e' P9 V8 r- j8 K
if (upp_dmai_int_cut > 0){
7 h! A- R% L1 N2 B) F DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
, ]7 b! p. X/ f: s6 ? Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
7 i1 y9 h1 D+ x5 x, ~5 I2 j' s8 f# b/ x, M; l$ U T$ o" t2 Q2 s) g) s7 K) l
: m i0 a1 n2 S9 Y. f9 M. H //copy data to upp_recv_list_busy2 R' Q' o0 r$ Q2 S
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);2 f7 P7 h+ | S/ d8 {: _; R) a
7 F3 V5 `5 d/ Y) f% d
//8 m% f0 c( S, E% _- f% W' Z
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
2 e7 E$ C5 x* ?: ]2 u$ u9 z" d7 S
6 L3 f0 q3 m6 N$ H0 T5 P9 p6 b //
V6 }0 P. {9 w' d5 J server->upp_channel_a_recv = false;//
$ q( v" L9 R: W, E# \ P3 {+ {, E h5 @) L! q+ [9 \; T
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
w* _# h3 }$ i: a# b6 L }
- J- N( X+ ^, v }, I* t, y0 i, d) Z7 c" ]# L5 L
3 Y+ T1 z& Y, M- _ _7 W2 G! r6 \1 h$ U) z8 b) P
return true;
) `7 G( x% {' X1 J& q} [+ P( j8 e, y8 N) f
! i& I3 a& `0 w# C7 v1 C9 i
static bool server_upp_data_send(Server *server)
" K. T* c3 w# ~6 q$ l; D7 |2 ~{
: Q# c2 O, Z$ R' ]' x0 p if(ListMP_empty(server->upp_send_list_busy) == FALSE){* r% |+ f, l' E6 A. x. H" W; p- c
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);! a' u0 J# H( c8 @, H5 p
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
0 l5 E, n, E1 v( W' X! `. b8 k char tmp[128] ={0};
7 x0 u( }1 N* c. o" [# v, O
t- U' C/ v7 N$ m2 u# P; ^ server_msg_send(server, APP_CMD_LOG, "upp send: start");, J, K( M. ~9 g8 m. u* c. t
print_log(server, data, 64);2 r$ H4 L* b: m( ~% l
, M5 I4 f$ J8 G+ Q //: n6 q3 n* G, L1 L/ R
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
# V- y2 m0 }& J; ~; N memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
! J* M$ O, e* v" s- m) c$ F& v print_log(server, upp_buffer_b, 64);' E& U9 v6 B; q5 m7 U2 r8 {! q
1 F% V! T, T* f6 ?. w# F9 _ server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
- E# [5 T- o8 I+ _, w& e- x server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
/ Z; h7 r" ~1 p4 |5 C% ]% r: ?9 X1 n server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;7 ]! O+ A6 K, ~; Y7 X' ~
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;, [8 r, R! ~2 I) |( g# ?' B
2 ?+ R* k3 K5 w, f+ n7 N9 q% l memset(tmp, 0, sizeof(tmp));1 V- q3 }& K* M" X
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
, ]6 k& H1 A" l sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
* i# N9 h9 W0 i9 E" h( c8 _ server_msg_send(server, APP_CMD_LOG, tmp);) O/ @% ~6 u/ [1 { l+ f6 `
( Y. s& X& w% a; Y
upp_error_count = 0;
. } A! r0 ]2 G u6 K7 V$ O upp_dmaq_int_cut = 0;
, D/ ]. T, K" y/ U5 Z! r1 ?: j // fill in data 6 j' f2 f: j0 v" c
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 5 p) L6 w2 S+ M% ^3 o5 x; e
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");' n# x' g9 n6 _- n
$ f2 L s6 a% p // wait send success
1 |0 Z$ _. U+ J t7 P# Q" D while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 2 F3 r) I/ o7 U3 w
# D4 s3 {- U; {
// make data node in free list , \% g* j8 g7 @( y2 ]( p& f- m6 ?
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
d2 s* n0 m; g4 p/ V) t$ x server_msg_send(server, APP_CMD_LOG, "upp send: success");
8 g) P9 Y C; X3 k0 e1 z$ X }* s; o# {/ y* L. a" w) }5 ?! R) ~
return true;
, a6 ]4 e6 K( l- }1 @: O# c}
) ]1 K( x3 J4 q, `0 v% E
- N2 `3 a* C! U- {
- m, F/ g0 y1 v7 }5 h' o5 ~$ |: h* H' y4 W* K6 j
6 t7 q/ r% G( Q/ @- @" A
* w4 i, k0 v _ |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|