|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 # J; W5 _7 d/ v: Z+ h/ g2 B6 b
9 Q. p2 y" |& V F
问题描述:
# O8 ?& K Z& \/ B* p) P5 b在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:6 K k. D; S- s6 R
# _% n: w' t8 H! D5 H$ E! B图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
, b1 m+ a3 B% R* @2 a0 u
' A ]% m7 S( A; Y测试结果如下:
$ s- l- a: h9 F! P: [' Q138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
2 K, u7 r! r5 u$ Q- Y
2 z6 n7 U2 n. i6 X$ k* F5 D! Y7 r4 A2 H7 s1 w9 r( U8 C
备注:
9 a$ M$ Z3 g' k1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
, c. \4 `& o+ p+ Y9 ]8 j2 O& O* y2、相关代码如下:
/ I! b+ E# ]" v- t+ l: L//UPP DMA缓冲大小512字节, g% p9 z, K# V, \6 d% n
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍) ?2 v) F# m9 x) z# M
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
2 ^5 H8 j" x4 c; G- k$ i2 P#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
+ Q0 S( m. U6 ]' U& C
& [0 U) v7 i) h! r! w9 M
( e* M5 m, _/ i; G5 v$ _* I//upp接收、发送buffer, t* x$ D+ e7 T8 k5 Q
#pragma DATA_ALIGN(upp_buffer_a, 8) F) o2 t% s$ T9 A* I, [& s7 r% {
#pragma DATA_ALIGN(upp_buffer_b, 8)3 t3 M" v$ S8 A$ R J7 C
$ O+ A) K4 u# P8 W$ |9 C1 }, l: u7 qunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];/ C R; E. ]2 o4 V1 z( u2 ~* c
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];: f& j6 U- g2 B1 l, p7 `' p2 Z
. }9 t$ a$ C, m' V$ z8 {1 _' L# e
# a1 M$ F7 g0 y! H0 g9 P8 x+ M, qstatic bool server_upp_data_recv(Server *server) 1 [8 ?9 B! i) y' ^
{! Y( G- z4 T" c) G
if(server->upp_channel_a_recv == false) {
+ B% x( i1 A# m/ N+ U server_msg_send(server, APP_CMD_LOG, "upp recv: start");" U: n5 K$ Q. t8 s0 r f/ R1 n
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
( r! p6 N. Y( u7 b/ c server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
3 O( |5 I8 r$ l5 I# ~( O7 P
5 K& y) e i) j: M+ n% C1 z
. Y p+ e- r( D2 S' J memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
0 h6 E- X/ g2 C3 ~, t! u* j2 a5 L! X3 D. [. @8 d" @- Q$ A4 m, s
server->upp_channel_a_recv = true;//
0 w2 m* @ D! A6 l( m q server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
7 g5 F! t% S8 F6 b3 N' u& [ server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
H" \1 k$ C8 } e9 ? server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
R& q4 P8 C! P3 d; l server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
0 i$ d5 s! }5 O: v9 C0 W
* w' o8 T: D% G8 a3 I2 W upp_error_count = 0;$ |0 T5 ?+ q" `! u, u6 Z( n
upp_dmai_int_cut = 0;" L) f# ]+ ^! N7 g! ^, b& _
) }* }0 b9 w! i2 |, t N: _9 X
// fill in data ! Y+ X% n+ K! X4 Y
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
5 i; n' L8 ]& n4 g" F# a server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");' c* o" `/ D4 B7 _* `. M
}2 F/ z0 S$ J6 J7 |
}% a: T% R/ _! p" \) t& V
else{/ B0 [, \3 b! u+ s+ b; Z( u/ l
if (upp_dmai_int_cut > 0){2 f& C& m) g1 B( ^
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);4 u, |3 p$ H/ T1 h5 @) g
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);: N' I$ v! P, K% ^# Q
$ D) g2 K, \" ~2 D7 Y! ?2 S* E$ I
" T% g2 J8 S. K; @- B# \* U# O
//copy data to upp_recv_list_busy
/ r4 l) K+ x/ I) y4 O4 \1 U: g memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
; q/ ~* Q4 A2 A1 S; u
' t; B9 y6 q$ [# n: x- A //4 x! R+ P! u; X9 |$ g
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
. N2 a% t" @' W' `! d6 \4 O( R
; P/ t$ _4 |/ p //
# I( V ?- P. \ V/ V6 i0 @ server->upp_channel_a_recv = false;//
& d" Y) F) F O: K7 e" d% f3 ]! ]' j: p2 [6 D) Q
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
, a" [* p: W# {$ O }
+ }# }8 p* B& b5 m: @: W1 w; ^9 h1 g }. } ?! \- t% i" Q5 T, c
1 E, E5 T8 W' r0 j
1 _& t2 N6 z2 `# h N return true;
: W5 p' F3 Q, a( `/ d$ p8 g}
" S7 W# M) \7 q& S( Z. l& O
. N$ e7 R8 |6 [; Ustatic bool server_upp_data_send(Server *server)
0 G2 h e. j: t' E( _{
1 w# d& e D: e& C* j if(ListMP_empty(server->upp_send_list_busy) == FALSE){
4 q, T$ ~7 y, S( M {5 y6 g DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);- Y4 X% A2 Z1 _' E, M
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);- \/ Y7 c+ r. s. z( h- p
char tmp[128] ={0};; [7 N4 R/ y1 d5 k
, M/ e. _- r6 u1 f
server_msg_send(server, APP_CMD_LOG, "upp send: start");! v0 o% {" {2 V! a( x
print_log(server, data, 64);
3 u! H- b+ L8 L' e9 g+ f o% O7 w" M5 ^4 T* x$ [
//" W; ]) u: {. I' |8 d7 Y
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);; J- Y0 R( g% ~) |. Y$ i
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);1 X% j" w4 @( _) I2 Y5 S8 O) d+ {* C
print_log(server, upp_buffer_b, 64);
: S4 Y" h% O0 g4 f& P7 Q! u' ?/ f! F2 U4 H6 a7 }3 h
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
3 N0 T$ W5 J" |0 X- Q server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
3 ^5 ] K+ O* Z* d server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;9 v6 y/ S$ g4 E T" @9 G
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
* t& H$ k* U& |9 Q* N0 J4 H2 H& _5 b7 R2 [9 [' J1 M
memset(tmp, 0, sizeof(tmp));
4 K: H. j- Z# ^- o sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
" K9 A# ~7 c" n" ^; E sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
$ I% {: j/ m# p x( ]0 x server_msg_send(server, APP_CMD_LOG, tmp);
' M- h8 b7 k2 M- A% h6 p: M7 x0 \8 u, [+ n) @: I+ @" r
upp_error_count = 0;' f+ m. M4 H" W4 O6 M
upp_dmaq_int_cut = 0;$ M# O1 r( P: ]) p
// fill in data : Z9 @5 e6 r" ^1 r9 S7 T+ A: C
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); . I8 U$ p7 `0 _6 M$ i% _
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq"); ~- G5 M' I7 q" n. W& n$ T
5 Z9 s4 x+ U/ J# l: c W // wait send success( o6 J* A" z" x! h- {
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
. e4 _/ U" {% {, g8 y: ^! I4 y2 E: z& S u: ?
// make data node in free list
7 c+ P t- u& @/ f( P U ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);6 }. `& v7 F5 K$ P' C
server_msg_send(server, APP_CMD_LOG, "upp send: success"); m, c/ x. K5 s7 K# S2 j% e0 ^
}
$ q j! X+ F* m7 `/ z% C return true;+ R, e8 p# X [
}1 @& S. Z5 R% P" Z! ? Z* Z& t8 x
! J6 l. b9 G1 F8 l+ t3 w0 u/ G9 M' h! _% K1 ~/ Q: m! Q
* i- k4 t' y- W$ ^
# N/ F& G( a l2 b$ j9 |: [$ d9 Y: Q
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|