|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
) y$ l) |: k; H/ h p* Z5 Y3 _; t4 z
问题描述:) J7 N: J! H# b
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
; z, r' h/ a ^/ f* h
/ p6 S: L6 O% Q1 J) U ?图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。) C$ v" n# l$ ~, f+ C
" I7 a& q, j0 v5 c测试结果如下:# _) P. b& v6 i
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
+ W0 k$ y8 c8 x; x" }8 _
1 Y7 T/ l6 z5 s& V* l9 x+ n
3 {( Q E3 ?! w* z. o% p( h- S1 I: `备注:
( [2 p7 X9 T2 C+ Z( z1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
7 j) e, Z: g; R- I2、相关代码如下:
4 z4 P; N! c5 p% @ y1 [" V' Z//UPP DMA缓冲大小512字节
9 ?7 P6 J2 A: e6 e: M& Q% j#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍$ w1 x4 `' Y s7 p2 R
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT% e6 D8 ]! f( Y" U5 A9 z- t
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
t) Q2 g: h: k; k0 j! h/ B2 E( {) U+ ]9 W. T2 f$ t6 S/ u
% y1 t8 o, U: t//upp接收、发送buffer
( E" I% p1 q% t4 j) B1 _#pragma DATA_ALIGN(upp_buffer_a, 8)
8 W4 t! }; W& [( q#pragma DATA_ALIGN(upp_buffer_b, 8); l; P! @) f: f7 d) r) v
+ _4 ?* [; Z* S" K0 S; ~3 Sunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
6 ^2 C, ]/ X) \2 \4 I yunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
& G5 u' v' v( g9 V% Z0 T
' T6 W' l, z/ a$ C- _3 S
, `& W5 U; \; |* c8 ystatic bool server_upp_data_recv(Server *server) / I, y1 |- c1 ^$ J- l
{& \! o+ {: c! h1 z& w
if(server->upp_channel_a_recv == false) {8 H9 U" j) d# R! s
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
: C( P1 ^& w* B' G7 ` if(ListMP_empty(server->upp_recv_list_free) == FALSE) {. j, f! z! C2 u' X' x% l
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
# u( |: D6 d; H; N/ Z# L1 H
7 a5 _4 h5 M% a) k' |
& N# a4 y1 x8 Y& d' n memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);/ I4 S p4 K; I4 J: S, H) {
& p4 f A$ d1 P- e
server->upp_channel_a_recv = true;//
; ~3 W3 B- J3 n, M server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);, v7 s3 ]/ Q4 [$ N& \8 v
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
. W% L; B, `* g* L/ o- {1 ] server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;% l8 J* w; v# d: k# o6 O7 V, N
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//' _) Q# y& Q/ L
2 w0 R; A L4 p+ r* A8 U- h. L upp_error_count = 0;
+ X: @% F) @8 |# `+ R1 Y& y upp_dmai_int_cut = 0;1 h6 a4 {( w o
- |; A% l1 @% l4 C0 n
// fill in data + _: w, F5 W k* |; |8 H' |7 x
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);0 r Z1 X/ \" _6 L% w6 |
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
% x- a, n+ _/ P. t }) @3 z2 G1 U7 M2 h% D2 p
}* c% N$ k6 P) `# m
else{4 \: m9 X S- I( N2 |
if (upp_dmai_int_cut > 0){* r. b( t+ U, ~7 B' @0 }
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
# ?2 u* c `- G Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
" H4 o4 Q# W+ o' T$ \$ ^' B( w; e5 G( l8 ]( C# j
7 m9 |2 @; f% {# k5 ?& D //copy data to upp_recv_list_busy- H+ o' X5 P" e
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);) y7 [ Z4 D1 c6 Z- z
* m7 }7 P8 R* E5 n% e" Y //% a; Z3 x3 C. e7 o* C) l1 Y, J
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);4 \ h" c0 c0 ^: e
; ~% E, ` e$ _& K& l# _$ s
//5 z: k5 Y- L# K0 z, Z' O4 j
server->upp_channel_a_recv = false;//7 A# H# S. W) }3 _
- I, W% P4 }) I' f server_msg_send(server, APP_CMD_LOG, "upp recv: success");
1 ^; S* W. x& @8 v* ~1 i4 Z }$ [+ D4 ^" b0 a4 M1 f
}% B4 l! a; U& s+ ]- E% W
3 M B5 a. F; r& ^$ R ?
& w0 _- Y6 ], r( N. g return true;
5 [4 c2 }- T' X: _( v, y' ]) c9 {}
, ?: c# }, @1 e+ f ~1 Q C4 u* {" n7 t+ p
static bool server_upp_data_send(Server *server)
?- t1 N5 D# \6 V0 w" R4 s- K{
, y, q9 f* x9 W$ O, x N. p2 Z if(ListMP_empty(server->upp_send_list_busy) == FALSE){7 v5 T) j, @8 }# F3 f. @
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
2 o @" M# W4 P unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);) J) ~; S: N' U# C& |9 a6 ]
char tmp[128] ={0};' C S- `5 S A% u% \
, F( ?2 p$ G) t5 m9 ~9 d server_msg_send(server, APP_CMD_LOG, "upp send: start");. I; K3 z8 z% A" m; O) v; p
print_log(server, data, 64);* f3 ~# f# ]: P4 w- ]
$ g" {% b8 t2 y X m* M5 v/ x4 q //
- n" D# |9 k% z' _ memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);( c: R9 s5 X0 i# y0 C
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);7 i# o/ h$ H$ z. c
print_log(server, upp_buffer_b, 64);
2 T6 u, K& |0 F8 m5 d$ r% q% }9 j
7 K# a. U" C, o8 P' K6 S8 R r server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);& A6 `6 X7 T: B+ V3 O6 ^( }
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 6 q. t" c' [, u! ~, _- }$ ^. `
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;! M% t. D$ I' i$ E+ H' r
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
# u/ V) C- c% e7 U# _+ j+ s. U. m. ^8 h: Y; p
memset(tmp, 0, sizeof(tmp));6 R0 z' l6 ]7 ~: w
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", + W" I; E) R0 K# R/ i
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
9 Q* K! A& J+ U! F! Y: q% z9 H8 L* N server_msg_send(server, APP_CMD_LOG, tmp);1 A3 w4 {4 N! d$ O) C6 D/ ^
* B8 p) Y6 u, r8 Y; h6 j
upp_error_count = 0;
4 Q8 T# W' J a5 w7 \ upp_dmaq_int_cut = 0; J' Q3 [$ I( ~# }
// fill in data " |% T4 @- ?( ]% F. N
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ; k R, F) `, A
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
; _9 a, ^% z6 T0 f _ j" k
4 G. [" V+ S0 e% z3 V // wait send success1 W1 f* b) w" ^+ {. @& x
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
# n. Q, B% |3 F6 G v
. Q9 _- G) G% e" r' P/ s$ w0 e // make data node in free list ) a& W8 V6 R1 V9 c& a# X+ X# Y: h) K
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);. K$ K- b: S' k
server_msg_send(server, APP_CMD_LOG, "upp send: success");
4 b' Z% l: p9 i0 Q B }1 u) a2 N8 z. K X
return true;# P: T. K$ q, R$ u+ M
}
& L0 B \7 \5 g5 Z: l0 t
7 X6 X- [; f5 L7 x9 Q8 j# w6 g* |6 s1 T' _/ m4 l4 C* K
+ W" N8 t7 C E4 v6 c
$ c7 c# R( q n" S$ l) ^; P$ ^( T k
2 X3 \5 @- p( m9 h |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|