|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
0 V/ \% u' J4 ~7 j3 d Z) f1 s. p
( e. B* H: O+ q- Q/ {; [9 Z- P问题描述:
9 g: |( [6 }7 l* ?在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
, |6 |. t& N/ T- ^
6 U& t9 y4 N3 r( F6 V图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
8 n- H0 I5 `- b5 ~, q7 L1 a+ b
- k1 n! j/ j6 q' G+ _6 a$ ~2 ?测试结果如下:- }: r- Z( ] t( R7 r
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
5 k2 d3 Y( g: l( K$ ^% w& D2 N
6 [. `5 M* M" M4 ` P& K/ g
! C6 U) O5 [8 l. g7 D% o备注:
. V" E$ [) [( Q& q, K1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?: ~& Z: [! }- M1 U9 V0 y
2、相关代码如下:0 b3 T" ~2 ?2 l: D% F# ~' w& E& }
//UPP DMA缓冲大小512字节! w( w) D) a. \. f
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
8 t+ N& ^4 v# S( ~( S% {4 E#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT3 { a2 ^' [6 M I' P- }! j+ R
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
3 p0 A2 x- O& ]8 s/ u: G) d- @8 D1 T
; ^/ E0 ~8 F# J0 L//upp接收、发送buffer
% O5 S9 F' w0 x6 S& Q/ B#pragma DATA_ALIGN(upp_buffer_a, 8)+ E- u7 b% w! o' X4 z
#pragma DATA_ALIGN(upp_buffer_b, 8)
4 [* o$ E2 V3 O* Y) X5 P; {0 B4 j- o
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
# M4 Z, @, C1 [/ v dunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
' @# ^2 B5 ]& b8 U) R( Y! I
& A1 ?9 [) k9 ~7 w) J& n/ H: N `0 `9 P5 C7 n# d2 F% W1 R. H
static bool server_upp_data_recv(Server *server) ) r2 K' P& z# [( k. v
{
" t1 n' [; ~# y9 T: X if(server->upp_channel_a_recv == false) {
; V& D# F2 P8 \3 l2 m2 _7 h- d& ~ server_msg_send(server, APP_CMD_LOG, "upp recv: start");
l7 j k- f) S, I* b; r if(ListMP_empty(server->upp_recv_list_free) == FALSE) {; }' S7 x- y% h4 c
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");* s, H$ A$ S2 s% y4 D5 m" P
; I+ q$ E- j" B6 V8 F$ F" M: _
1 k' d* f, y9 |; w# A memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);( v% y' e: f; T( i" ^& {
! G: p% B; K% r/ B server->upp_channel_a_recv = true;//
, m1 y. z8 `7 u6 o) m& W6 _. Z server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);( O5 O2 {8 \3 d, O
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT; s$ f/ F6 j+ i; n( s
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
4 |+ P( X2 ^+ o9 o+ o server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
% p6 c6 f4 ?6 \8 ]7 M
: s- G) b b( i* I, ]& T/ T- N$ x upp_error_count = 0;
# S# ~0 e% D6 a. l9 y- { upp_dmai_int_cut = 0;6 E9 A2 Y4 Y0 k0 Q
% t8 d) D* E7 O' l$ q
// fill in data : r- y! r8 q8 f1 z V
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);. d9 ] v3 ^' X, r" w
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");* [. ~4 C5 j: R4 A- L7 A; w& K
}3 c1 {( ]( l4 d4 N, F M
}1 n1 s$ k$ i% }/ S
else{" ^9 S7 P4 b: `0 `+ |' D h
if (upp_dmai_int_cut > 0){ a4 J2 p' f U% x% p9 E! t0 j
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
5 |+ X5 A! @( O0 x' f Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
' N8 g2 C3 i- q0 ^( U# D( a9 i3 U6 ?0 @ n. q
' ]: c7 c/ K4 ?/ C) s- B //copy data to upp_recv_list_busy
_+ O( X2 S5 c1 Y4 R memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);, q& t% j; w5 D( \, F2 u! ~
6 l4 e# H: L% C" {9 R% Q5 i
//
( B! Y% d% @' G) m/ X/ k ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
3 h% l3 M3 B6 F s; p2 @* }% c8 Z8 P+ _) a7 z
//
1 r" N7 R. _& o server->upp_channel_a_recv = false;//
! s3 K+ y0 }1 P# U+ G, t) K- K$ C3 ?- C* Y% o$ B6 U" y8 W' [% R6 [
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
3 S$ n1 P: r- C" v4 ] }
% u$ ^4 f. E( M( d# m6 D }5 {4 v r2 n# l" Y+ h' |% o
K4 E! d8 H3 W3 H. V6 B
3 A+ a+ a& R/ [! L6 | return true;' m1 q4 M% L% _5 ^# z4 c z
}) T- V6 E& W3 U+ k
; p+ c* n$ i3 [4 j. R# W( U6 x9 ]$ Y% P
static bool server_upp_data_send(Server *server) Q: ?0 T, E" [0 ~5 `
{
6 V. ^" L$ i7 e& s if(ListMP_empty(server->upp_send_list_busy) == FALSE){; C1 R, T7 k# }% A7 j" c8 L
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
) n# h7 V" G+ L. ?) O) T unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);, P2 K7 X' r1 u4 r! y$ a5 e' @, ~
char tmp[128] ={0};7 N% `: S5 V/ F" w
5 F" S. Y6 u2 o9 B2 j F; d5 E" j/ w
server_msg_send(server, APP_CMD_LOG, "upp send: start");8 l. w+ a3 |' u0 y& Q
print_log(server, data, 64);
% p+ o& c" n2 S5 ?# @2 U% e @: \( c M8 ]
//
" p. z! _5 t. n1 ?- {( q3 w memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
' z/ j% e: ~1 ?6 w+ @ memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);2 q* [ x* u, K/ f% d% w8 q4 K5 w
print_log(server, upp_buffer_b, 64);
/ T: W1 e( |8 `
0 M, [% J: G- X( ^7 `& q server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);- ~, m% ^/ x8 z. T2 `
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ) b) ]& C+ {% a
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
: j- s8 y, N) p, o$ u5 h3 T server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
0 ~/ Z& r) P6 h9 }; t# n; B" L. R# y
5 S) n: Z, b7 l' S9 G! Q, y memset(tmp, 0, sizeof(tmp));0 }; u& z! [, X# q) H
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ! H$ O _" G6 w4 X8 E! @( }
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);" u8 F/ z* U' W) F" M8 x2 ]
server_msg_send(server, APP_CMD_LOG, tmp);( K" ^2 E4 N0 C" z% x
( [) a5 z8 \( o P8 f2 A: M. o upp_error_count = 0;% _2 x; r6 R# k3 ~- Y
upp_dmaq_int_cut = 0;
9 b+ Y0 O! e! F. S& ^ // fill in data / g8 S5 u) u. y7 o$ @" q; n: o/ o
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 3 k3 g9 L+ d0 N8 u) O8 e: ~; L1 `
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");. M% S8 n0 F; p5 x; {0 m9 b- X: f
1 J, Y% F% G: c# t& x0 f
// wait send success
+ y" P8 Z0 y, ~ while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ( z& W- x7 _+ b; _
7 ]) _/ Q* L9 b% [' W // make data node in free list
% ]; E5 y! m1 y0 R3 m ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
( b% P$ T! a0 h, M server_msg_send(server, APP_CMD_LOG, "upp send: success");
: z8 }$ O' I8 m- H5 }+ ] }
3 O# ~4 `0 } X y: ~- W; X3 N. K return true;: H0 ^; R9 K$ F" A
}% x- Q6 a5 Z4 i) d# W
0 [( o3 {$ b: v2 g7 R3 X' f) d1 R
4 P8 C1 c) Q' A. O2 B4 g) }7 K7 [! c' c" J8 e1 L! o
7 @& f2 r9 u/ T( W' Y! P0 _0 F; J6 s$ l) m. `3 i% r( _9 c
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|