|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 1 o: R* f' e! Z$ w6 E/ C/ d" P, d
, Y% ?' J5 R; G, P; a V, C问题描述:- t# q f: E$ v" c9 u
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
2 o3 T9 ]( l0 b, s2 n3 ` x: u3 Q+ a! g5 d
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
3 j' P( l6 ?, U2 A- G& \1 c% j. P% h' W H: d, c; q% o+ `: V
测试结果如下:& k5 D7 f# a4 e
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
9 u# u, Y$ o4 Y2 ]: y9 r- m
9 |: U9 M" {. P0 O" Z& N/ b9 A; n9 O- v# L2 Z+ v3 s$ U3 L. V
备注: w6 U; W g0 ]8 I1 k0 W! {
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?% r/ O# W* M/ h, |3 e$ o/ s/ ^5 o& {
2、相关代码如下:$ X8 G& K( L/ F. J# U6 w* B
//UPP DMA缓冲大小512字节2 P$ _- l1 P$ \; f' y
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍 n+ D; g |. e% r4 V" X- k
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
7 u, \" l U; z* j; c( A0 m#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
2 x+ ~6 h) U1 k( D* R1 V$ y
( J7 z" Y% a% U7 X& \. E" c2 G1 s- g+ G H- p3 ]' c
//upp接收、发送buffer5 ~) D/ m% s! g
#pragma DATA_ALIGN(upp_buffer_a, 8)- Y$ l( `2 _$ t$ M
#pragma DATA_ALIGN(upp_buffer_b, 8)9 I4 ?+ c: F* R' i) K
) f j2 q. B. T
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
0 B7 K0 Z! \( e8 e+ d3 |& r" I% s" Bunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
3 c k1 T" E5 I8 ^9 S
/ [1 r( c1 `: S9 z0 z
I$ B4 h( h. I ]: R8 s$ Mstatic bool server_upp_data_recv(Server *server)
. v- X& U0 |) Y! R5 b' K; |. q{
- ?9 R: f2 A8 Z7 H6 p1 @/ O if(server->upp_channel_a_recv == false) {' i2 g9 J e/ ]/ J
server_msg_send(server, APP_CMD_LOG, "upp recv: start");& ?1 f: I" w# O
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {1 U, ^: m# o: ?8 y$ R8 V2 T) _' G
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");( O% F7 e" ^2 b- g- v! t% P
- `" y6 f4 r7 F* x1 o2 ~3 b$ n8 q
$ b$ o3 I2 c V! d4 u; I memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);2 m2 ~$ }% z% Z, h' r- I
8 [/ F2 z" I/ s |1 m/ ?
server->upp_channel_a_recv = true;//4 `% T2 K/ f) @
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);( s; g/ _% m# {8 E. h" Q
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;8 g# W) R/ v+ G+ j5 Z
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;) o8 _! A/ X/ K7 E9 y0 g- N5 o
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
( S0 q. n* }! e+ E
" N: N+ E7 m% Z upp_error_count = 0;
& O( k5 Z* Y- l9 k0 }! n' t upp_dmai_int_cut = 0;6 w8 L9 W- k. T* u, j+ e
% V3 {6 U5 y% u+ y6 x& K& o // fill in data
* w' ? }4 A3 n1 w# n. _3 d uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);5 W$ N$ z2 u- M% W1 D* j
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");9 S/ ?/ \4 ~9 e! S8 D0 T
}8 Q: `4 m1 i% I/ V0 o2 Y' V
}
6 M; V; A# [/ E5 Q; J5 B else{
" ^" ]& I2 F. Q' \& r if (upp_dmai_int_cut > 0){
2 k0 u+ Y: o2 k( l+ K/ r% L r4 M& e DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);# L) _; |2 b, s- u' h6 m4 u. B
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);5 w- X+ u( j \$ y
* V% B5 q6 [% L6 |1 C
o( R+ C% Z( y: K1 _ //copy data to upp_recv_list_busy$ K# A) e; J$ u" U7 ^" S: I' T
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
! }( p6 ~; {7 Y
. ?) h* _: m2 q% C //
- ]! g! X D* J; v ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);$ F1 C6 Q+ Z" R4 V
* b1 D) s( ]9 |' O! ^7 L
//
3 V9 ~! E( Y; V7 _0 ^ server->upp_channel_a_recv = false;//5 q s( m+ M9 l6 f/ W0 S/ c
8 ?: ?: ?; d5 b) D) u4 I, \7 x server_msg_send(server, APP_CMD_LOG, "upp recv: success");
' g+ [( q8 S& k5 r# K# T6 i }
% J8 P' m3 W A5 e }
1 i# r' D+ K" e
: r* F; n& G0 B
1 Z6 X; d& y6 Q: g return true;. [' ~. F) V9 y1 H1 p
}, M7 Q* J5 m# H1 x# L& h: W
0 _- y+ X' H! |. B8 t$ Qstatic bool server_upp_data_send(Server *server)5 e0 x/ @1 _4 m8 R- H$ O
{) n+ z# ?5 L3 _+ S- R8 k8 p6 t
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
! M% R' l" s7 j( I$ }# f# } \ DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
8 c0 O& U& U! \3 R unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
+ ^3 B0 E# Z" c- ~" b2 ]/ x char tmp[128] ={0};+ C% l4 |4 f; p# j
5 }4 H+ P0 S- w% U' q6 w! e
server_msg_send(server, APP_CMD_LOG, "upp send: start");( O5 T7 I1 Y( \5 _4 m
print_log(server, data, 64);
2 P. U2 ^" L" A! Q) b3 Q% z3 ]# r
5 K; y [4 q0 S' i$ Z( h //
6 f" C" K) m6 X8 |- I/ W! }/ d memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);* r) y8 O; S9 p' ]9 t4 J
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);/ O6 n' i- j6 I
print_log(server, upp_buffer_b, 64);/ V( U; _2 o3 M0 t9 U
6 F' `6 S, P w0 O }% A% i
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);) b$ A9 X3 A D3 G; S/ j5 a
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
4 m1 x8 J$ e9 x4 x' X server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
( Y/ `. s9 X) T4 a server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;- e2 z& j, r( C! S
/ L! E, a- c, f* l memset(tmp, 0, sizeof(tmp));( S' P4 a/ m# ?5 m% \6 I7 y
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", * Z4 n! q8 u- V6 _6 k
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);/ C0 @9 z R1 ]! ~/ v/ P
server_msg_send(server, APP_CMD_LOG, tmp);
. O' s2 c) q+ d2 ]6 M+ s3 D) j' z6 a$ O: Q
upp_error_count = 0;2 a7 v5 f+ W+ q* @( C
upp_dmaq_int_cut = 0;' F% q, e4 q. a" |, L8 V2 {2 }
// fill in data & t0 N$ E) _, _2 x( y
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 0 x( y [# O5 n0 l' m
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
7 w$ ~( i8 g. [4 d2 V+ u$ J2 @! q) |: H0 y3 D4 v
// wait send success
1 K2 k& t0 p' D while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
) I7 `: k! \7 L. I c1 {# g/ d v# [
// make data node in free list
* A! k0 c4 \" z" G& M' p A( P ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
/ ~) l z) }5 I8 x, ` server_msg_send(server, APP_CMD_LOG, "upp send: success");7 t; X. Q7 V1 j% [! P Q! i0 k
}% r# `6 }( ?( ^6 ]* g. C3 V& U% x
return true;) x: r9 Q1 J3 |
}$ ]% ]: ~9 a, `3 s4 c
/ S# k& x" o, Q# ]7 ]* m3 }) |
9 _* `% N$ }9 _6 [5 ^/ ]2 |$ x5 l/ R( F2 I: d, N# V% w
- X% C% j3 R& E" @7 I* H8 v
: f& [1 M/ g4 ~! F" ^2 @# O |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|