|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
5 c( R- E) \0 ?* }0 S. z8 F! u
! R/ x, ^' i$ ]1 m6 e问题描述:2 Y- v4 o6 n0 e
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
- c2 }# D5 |9 v+ s% C& v+ R5 }- D. ?; r! n4 Z y/ z* O! N P# b3 g* _& j+ g" d
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。* @- T8 ^/ W$ u5 W+ L* ^
+ U$ R+ f. W5 a8 s9 ^测试结果如下:: D& K. ?4 J5 e: C; \9 [7 ]9 s
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
2 \/ E6 p+ G( b# t! B8 S$ a1 [$ W2 y; \1 C* R" r! S! y! y
2 s4 q1 q, c- o2 y
备注:1 C7 m4 l7 ^3 q' ]9 ?4 e
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
9 @4 t9 i7 N# u I2 c2、相关代码如下:
7 E& {* O, M) u' f//UPP DMA缓冲大小512字节+ W0 c# V" H; n6 ^8 o. y
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍" N" W% V7 k' l d9 _
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT$ y! d/ M, E4 O& U
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)4 B1 k* r' Q( i
5 i+ j1 P' X% R4 l1 A: j
" Q8 ~! [: b1 H/ r& Q//upp接收、发送buffer
& n; ^( k" t: f4 Y7 l. H% ]#pragma DATA_ALIGN(upp_buffer_a, 8)
6 R' f( g6 J8 m% A# A! O#pragma DATA_ALIGN(upp_buffer_b, 8)
" L% T1 J# z( e; @
9 Q" W! {9 i( E F/ c- kunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
/ `3 K* h# g: Z, P* e1 ?unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
O+ K! s0 q; B+ [: H5 U& @& M2 _
* ~, Z( o) T: Ustatic bool server_upp_data_recv(Server *server) 4 s ^! y0 q/ s9 i
{
/ g9 w- [! Q0 V; g5 P8 }, u if(server->upp_channel_a_recv == false) {. B$ d9 q9 D" m8 r- G5 h
server_msg_send(server, APP_CMD_LOG, "upp recv: start");8 B2 f' x; k8 e) U
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {2 o. W6 h6 c: y, `
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
S& R6 ], p# e+ \2 m
& }. }, n; ^. _& c8 o
3 c* f/ Q ~2 M5 E% p2 T memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);7 G* a8 q$ F# ~2 ?( S) g/ H/ a$ \
* d+ h9 Q& F- g+ V3 o% g" G server->upp_channel_a_recv = true;// _) V6 I/ {2 n) ?
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);3 {8 M" U0 k1 {) E( q( O6 P7 w
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;+ ^, Z0 |3 L8 r8 K
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;! [( A( j j( L; N S, o
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
5 @2 g) N- r i2 K6 _
, I6 m# H$ o- s- E) M9 x4 q upp_error_count = 0; |' m& h3 m4 t# t; a% A$ ~
upp_dmai_int_cut = 0;
' a: X$ |5 K2 Z- `& ~5 |# r2 o! s7 P1 C# y3 a" Z
// fill in data
. w$ J8 Y/ I; R0 K( z& U uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
/ [0 f' K# x* C1 ~9 {% Y server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");$ o8 _, G/ s" J# q& F5 T @
}
6 {9 T+ r4 V8 }; q1 |; i }
% Q: h8 v& u* `4 U. z8 k0 K else{7 l7 \9 y2 R, n0 t$ X* G
if (upp_dmai_int_cut > 0){
6 `- `/ h: d7 B3 z DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
( c" l3 ~8 b* r5 U0 i5 d: C Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);/ `4 U+ m2 P5 j [! ^$ c
, r, J) P T( D" g8 M$ \
; c3 j# M& U. l/ M //copy data to upp_recv_list_busy/ l3 W$ o7 A' G* ~* t; u
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);: F! `2 n% w; ^: b
; w8 t" M2 N7 D //
6 C8 D7 s# H2 j# `& ? ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
# K% ~$ u- [; \ Z3 P- a
! e6 o( }8 J P* P, p/ e$ u //
4 K- m1 s1 {/ t/ |' f) ] server->upp_channel_a_recv = false;//
& w! P% }; a" t, l3 E8 ]: t p" H6 }3 y: i2 `& w) c& E/ U2 \+ i
server_msg_send(server, APP_CMD_LOG, "upp recv: success");, H+ ?( U* b) o9 W6 D( n
}
( S0 P9 X# T' B- g. R }
; {, b! x) Q4 e: `4 W5 P9 S+ p3 ~6 m8 |. j$ R! m
. B' I$ h+ j: g f5 D2 S+ [! ~ return true;
: o3 E3 H% \4 s" v0 \: \$ P# G}
0 M! E y) p- }5 i% ]( k B- z- x5 I. R7 B! ~
static bool server_upp_data_send(Server *server)
" C8 P: E) X( [6 A* a{
2 v9 |7 J3 S; b5 w* a: C5 f4 H if(ListMP_empty(server->upp_send_list_busy) == FALSE){
7 m/ i6 `; o; P DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
) }) @- U3 r/ ~: N5 P. |- {) E unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);" s5 m3 [) V2 O1 t
char tmp[128] ={0};( W" P) ^7 y) J6 v3 g
) ?/ a% z) E2 V0 U& c( W+ G- l server_msg_send(server, APP_CMD_LOG, "upp send: start");- N E L) P5 n9 i5 @/ {9 j
print_log(server, data, 64);7 p$ g4 [" \0 F. @
2 G o5 T" G+ _* E; n6 ? //
) |% v8 B i, f memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);4 H/ ` w g* ]8 U6 o/ P+ e4 L I
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);( i9 Z7 y' C2 ^3 b
print_log(server, upp_buffer_b, 64); N- J+ ?& M( b1 ^
: g& T( a" X3 ^" B! C( [4 j server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);5 ?) U* w+ H3 b# S! }
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
, Q0 x& Z; ]2 c5 D server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;; r) T! Z; y4 l
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;- s0 m) S7 U" v7 _$ q
* o4 M7 i t5 _0 m
memset(tmp, 0, sizeof(tmp));
- y1 v/ b+ ]6 _+ h sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", , ]6 a. c) @* {& y3 H- G/ F
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
& L8 x& o2 }* R" g% c6 c9 f' x server_msg_send(server, APP_CMD_LOG, tmp);
0 a; a4 X! g1 ~" h1 k. Q5 ?! q2 e+ Z" n( T/ \9 C8 G
upp_error_count = 0;& e, f& Y# s4 q* L7 \' ^8 ?$ ^2 R
upp_dmaq_int_cut = 0;/ C: c7 q, w# O' i
// fill in data
4 C" ^& ?& y3 N4 ] uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ) H. M: H7 X* k; v+ s# C$ R
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
B0 Z! T5 @; t* Z, L. q! ]9 a( ^! _9 x- D& Z+ I1 I
// wait send success
2 B- c; }0 I; M- D while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 6 Z& `: e+ u+ X8 J
! Q1 r( f6 p9 w6 U# A6 O
// make data node in free list $ n" a5 d! m' r3 h
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
3 w/ E0 g2 g/ x) Y1 ~ server_msg_send(server, APP_CMD_LOG, "upp send: success");$ H& `9 r0 p3 G0 `
}4 ^! l) c* O3 F2 a4 p
return true;! z' ?, R5 i# N) _
}0 A0 P$ Q; [0 E' f$ U
( E+ ~; p6 O$ r3 [6 _% K+ k
3 V, f& k i+ ^% G5 ^
8 L7 N2 b) U9 ]3 s! e
5 ^& B+ P1 B8 U4 S# ]
9 [* b4 f% B% D! C
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|