|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 1 ]' t5 Z6 r- \9 D& o& p
1 u* E: h4 J/ g e/ N问题描述:
9 c4 C1 ]0 d0 g$ a1 u9 M在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:4 [+ H: [+ G* M9 u, X5 J8 E
+ S$ g0 L, h1 S- t" ~; m7 f# v. W! ~图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
6 ]. |% P: u% T6 S) C
. W$ T- h: X; a) p测试结果如下:
( e4 D7 q' R0 c: `) k$ @7 U3 t138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
; v5 ?5 }6 N! W
5 \& P; z% S2 Q* Q! @0 l5 ]* Y' ]9 P' t) T( q
备注:, t/ X8 m P, R
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起? i' L+ ~( _, @( `9 B: ?, W8 V
2、相关代码如下:
. W+ Y. s5 Y+ M/ I3 C" q7 {//UPP DMA缓冲大小512字节0 J |' ?5 l* w) N
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍) L/ R; V" u* N, H. u" n+ w# v
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
; m/ U. \( l j3 S#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)1 G& t2 b4 k! ~# F0 v+ v; V
9 D+ ?. F& U) W! _ g# C) o; W
//upp接收、发送buffer
! S2 K: c! S: a& p#pragma DATA_ALIGN(upp_buffer_a, 8)( ~0 f- ]9 a0 }4 }- c$ S
#pragma DATA_ALIGN(upp_buffer_b, 8)
+ S( ~5 k- w* |5 a/ V& Z
$ q& r. n! r7 m; Munsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];) q- w6 |7 A" W
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];- Z/ r) V) d( q3 W& S4 P& i( n
8 Z9 n+ c, j/ L/ S& Z
- R7 k/ z; g& i& Lstatic bool server_upp_data_recv(Server *server)
+ I& ?. A5 t& v: z/ z- I% {( } r{
_4 h) N' L1 b& ]9 S if(server->upp_channel_a_recv == false) {% K5 w5 Y+ h/ y( H4 d
server_msg_send(server, APP_CMD_LOG, "upp recv: start");5 @" W2 k! i( p2 y; b) i
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {5 }3 C! d9 B* z0 c" T* H- G
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");3 j$ B+ U2 t: F6 H$ }" C8 A
" g# q' @/ I' w: _/ D: j. p
4 T0 k/ O w! h& S
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
* l( ]2 Q8 N' i# w& x2 O. A! @
' M2 y6 v$ { \% B5 L& | server->upp_channel_a_recv = true;//
5 J$ W+ x- [6 B% g8 P: _1 k( U server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);+ C$ N! w6 m. A% g3 T4 x5 O! f
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
: h6 D% ~1 s+ G8 ?7 |+ ^# P, H server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
$ p1 ^3 m/ Z: \) b2 { server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//" B t. ~& v: ^2 c* }* s
9 O) K0 ?0 `1 v# t! z5 ~ upp_error_count = 0;
# k4 h0 ~: `. j: K upp_dmai_int_cut = 0;
' G7 T; V( s' J( G' F+ [+ q+ W) h! h
// fill in data
" o! e4 x4 M* F9 j uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
, ^, x T+ i+ A0 p server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
* ?/ T9 F$ ~- X. m+ \ t }
8 O+ @8 Q3 p+ y7 m+ h. } }! t' \# Q; v, U
else{1 k' R! O7 w% N9 k% \
if (upp_dmai_int_cut > 0){% }+ o$ S3 h# C( @
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
& Y0 }( G" K, T3 ^4 Y6 c Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);. G Q5 d; Y, x5 o- U6 V7 H
l7 S) Z4 S2 Z; U x/ d( {
1 Z7 O4 A" v3 U0 X) m2 t8 I //copy data to upp_recv_list_busy
0 N% O3 j; g! _# A memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);3 o" @6 z) Z; D5 F* ]: q' m& s
7 [' i& ~. v: T( @3 p3 Q //
6 l+ F: ?3 H" N3 M0 ?8 ~ ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);( P4 Y: Z. ^4 U$ ~# c
- [; W, m/ ]. Z) I9 Q
//
* I/ v. U2 b. o& i2 |2 g0 f( N( I& K server->upp_channel_a_recv = false;//$ b( Y0 I8 Y" O& r
: ?0 c+ ~2 x Z9 Z server_msg_send(server, APP_CMD_LOG, "upp recv: success");6 v; N: m' a0 I- v# R
}1 m1 K* V; }, S
}+ H: ?2 W: v Y3 ]0 Z
2 J- [7 J7 S9 ~- }* v
. g) i, U1 U" \9 q7 H return true;
9 O: o9 C6 v" X6 C9 i5 ^}1 W" C3 b$ n4 g$ J$ n6 Q4 l! F
( n" P5 Z! }8 e. c7 a
static bool server_upp_data_send(Server *server)
. \- P1 u$ ^) N6 v5 e/ N/ t{
7 ^* }9 p: i3 O3 X if(ListMP_empty(server->upp_send_list_busy) == FALSE){
" q' l, x6 ~% P DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);5 y4 S& l' O0 u& J+ `
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);# a [2 @& A5 l+ r3 q
char tmp[128] ={0};- H! U& Y0 e: @
: E3 k7 K& M3 p* D/ n# S% y server_msg_send(server, APP_CMD_LOG, "upp send: start");+ F! o' ?) s# p5 S) e# y
print_log(server, data, 64);
1 O+ H; Y& z5 }/ H* ]) v! s
# Z% u$ r- L& s# m //
0 D3 N7 J4 e# X memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
- z2 I( M( d7 I$ N/ }. h% p5 }0 n5 R memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
( T! y+ R `' a) L$ `: k# l print_log(server, upp_buffer_b, 64);
( W* u1 D. U n: _& _% d% v
; Y& k) S/ v: o/ z5 z server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);8 h6 Z5 |3 p h8 Y- C! a8 j8 F
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
+ N6 T: u0 I7 g c server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
5 g% M8 H1 O9 F$ `: k$ I server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
2 f; P: V) q; O4 O6 K* @$ k' p" b
3 M; T4 \/ s' |0 E( b Z memset(tmp, 0, sizeof(tmp));; B# D* k# r! F6 b* O' L
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", " ^" E% ~+ V! E: E- n: e# d
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);' X' W9 g- [9 t+ F% F4 G
server_msg_send(server, APP_CMD_LOG, tmp);6 V/ ?( U+ ]8 `' W
* E* g* z* x O2 P9 f) b upp_error_count = 0;
3 v: [4 O0 w- I- D upp_dmaq_int_cut = 0;. N0 i/ @5 C, w/ J
// fill in data 9 v K8 R3 n7 Y4 \" \7 N4 W
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
- y' I5 r( B5 c server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
" Q/ T$ N3 B+ P4 L9 q5 ?9 E/ u& h0 U$ J/ S# H* e4 C
// wait send success' ?2 n- U6 m; c2 e& b" J+ J
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
6 d, S- N3 [1 M: e0 w$ D! N9 [/ L5 G; g6 Y( T; [
// make data node in free list 4 f9 w# ]2 e1 N, q& c+ n3 m, h
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);% d1 v& `/ c6 \% o- V4 q$ T% ^6 k
server_msg_send(server, APP_CMD_LOG, "upp send: success");( ]* x0 T0 t6 o4 p" H
} w+ T1 E9 C% _& N& Q4 ?
return true;
$ u# B. d1 c2 F: i$ o}
- G' @$ \' T9 U0 h. Z# ~( v' t- a7 H4 n: _9 `0 x! j3 R
: b/ ?, i/ j1 Y5 Q0 @6 M# Q3 s4 ]* v# D) I2 x# S" Q4 G2 ]8 h
. ~3 A1 S7 c9 B/ z) {) ^1 y1 s4 r. k: v- ~
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|