|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 9 Z( N2 I4 ]! W. A$ }- Y3 ^
1 Y+ a. n2 f$ u问题描述:/ @; n( F2 y0 x
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:, G7 ~$ ?: V7 p+ d1 w. M
4 I; j4 l: w; t6 z$ M- D# N
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。/ W4 g1 U. i( S, w# a7 B D* w) `
9 A. {: K- A+ z" P测试结果如下:
' d3 R. o3 `0 q _. D138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的? U/ d0 S) p, H" Y+ {7 q) n
; Z+ s0 g4 `. G% h# z- Y; {: O9 e9 H/ I6 M$ ?
备注:; C& ?. a$ a% F9 T2 g
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
6 G) G" K0 ?0 w4 C& q2 \! S; V# o2、相关代码如下:
: [) F/ v& @/ i3 e1 h5 l//UPP DMA缓冲大小512字节
& D# c _% H5 w5 Y u/ \, m#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
3 f8 y* O" M, I$ f#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
# f6 b, B _& o) v5 \#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)5 r) z$ J" M. G" g5 Y0 R7 C- O
. Y+ W0 L" [; k) G2 A
+ T' [7 g7 B- j! Z//upp接收、发送buffer
; \0 q8 C1 M6 k! R5 q- `0 O- f#pragma DATA_ALIGN(upp_buffer_a, 8)! V8 U( |( r* x& i, J
#pragma DATA_ALIGN(upp_buffer_b, 8)8 ]0 M& K0 r) \$ F1 b- ?
6 E0 w3 J2 N7 f9 Z# s3 }$ c4 j) \5 zunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
& z( W6 g4 U+ punsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
2 A; ^! I, v: ^4 I( _8 ~9 f+ M8 M, \1 f' M" f+ f" |0 s
1 _5 Z, m/ |( \) y4 |( ~1 v1 gstatic bool server_upp_data_recv(Server *server) % A8 V a& w# b; N* s/ Z0 k9 V
{
6 {5 a/ N) u' S) b" X2 i, w3 B if(server->upp_channel_a_recv == false) {7 b2 L" d7 q5 n: N$ X9 a6 ?3 G
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
( Q- f2 d& p% m9 O% A% ?0 n if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
7 M. h2 V8 S) c- H/ w3 V3 B server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");3 U+ j5 j5 U, x4 }$ M/ W
w, n8 {" j7 a* o ^, r- o
7 s" f: N; U' }, c4 o memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
* \# ?+ p8 `3 f2 T: F0 r! Q! ^ S0 Y4 M7 d; S
server->upp_channel_a_recv = true;//
. I) U! B( d* b; w& g server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
) X+ @! s' z4 u: N2 a server->transposeParA.LineCount = UPP_DMA_LINE_COUNT; N9 k9 r0 x% T! g- @7 I
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
2 f) u3 l8 [7 W7 g server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//5 E$ D. L+ M! d F+ ?9 F, n7 P
; l) w5 J( M7 A6 J' l
upp_error_count = 0;
: c, o/ m" f3 e: D upp_dmai_int_cut = 0;
o" ]3 q5 _* I& c _, d% y0 S" j& ^4 ^4 x5 y
// fill in data
. J. ]4 r1 U& R* v5 h2 k5 o uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
2 P! |4 M5 U( Y" i9 z e server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
/ p v5 s! }6 P. O7 t) j }% Q7 z, {$ J" M7 R8 ^/ H# D
}
& U8 c" ]8 \. E else{! n3 H, m* T' K- a
if (upp_dmai_int_cut > 0){
$ l# b/ O+ u( E+ p DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
2 b6 e- {' g: u Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);' p5 o/ E+ z) v6 c2 P$ I
2 N, ?4 p$ ]4 W' h
6 h4 K6 U9 X' x5 n7 G //copy data to upp_recv_list_busy
( L$ @( p, }8 V1 B& A" @ memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
9 f- u6 J9 w( o6 b" q
. o J: ?% C( S' v5 q //. r1 E* n; ~3 p3 v* m3 {
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);' b5 w7 z6 Q2 K2 A( L
8 X/ @4 f( y% N- l ^1 e( A9 n6 V2 f
//! {% [) b9 A8 ?$ B& @
server->upp_channel_a_recv = false;//
4 N& R6 `# t$ o* O" S& T/ y$ Y! \3 o3 o" E, I# Y
server_msg_send(server, APP_CMD_LOG, "upp recv: success");1 r6 U8 D% y! g) m% Y& a2 e" L
}
! H" {* J d% ?" d6 d2 J3 J) e+ e }
* F5 d, {. G3 E) W! t. R" i" y( K. k( R% N% P8 P3 f" ?2 M/ N
; h7 w z. X1 H$ c' J
return true;
1 r. b+ H5 g, h5 ]1 }2 |; K}; |! Y% B& h2 [# F$ s
% h- b% `! `& ]static bool server_upp_data_send(Server *server)
' t/ h& m+ j7 v( u. {{
% Q# z- F9 X. u4 T) ]' Z0 X if(ListMP_empty(server->upp_send_list_busy) == FALSE){: K" b( ?! a0 a5 W. u. w9 i4 H- [
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
" U5 E& b/ X4 W unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
0 u" W( g S) n! a9 E7 f" w3 U char tmp[128] ={0};
9 z4 Q' r* I, @! W5 E
1 J/ \7 u, N+ G2 h# B% v1 W6 q server_msg_send(server, APP_CMD_LOG, "upp send: start");4 b2 _" F+ M+ y0 D6 S
print_log(server, data, 64);
6 k" s+ E }$ c; }- {5 L& `
& q/ L; u9 ?0 m6 m, r- z2 E //
* K* c4 o3 v/ V& R5 n- L; X. [ memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);3 h+ M* A$ v2 j! }, @/ N
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);/ N [9 \! p$ f; |
print_log(server, upp_buffer_b, 64);
3 c& J: `" R8 s8 `, v! }
, _& ]$ ]1 t/ d( F: G! X3 g server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);3 {# l! m% N5 y3 C: Q/ Y7 ?
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ) S% e, e) }$ E" J" d2 O
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
8 V3 n+ ], Q/ w2 g& N) n! W server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
, N7 O* ]+ l- G5 R
7 {% D8 ]+ o% f' u8 I+ X. }: e memset(tmp, 0, sizeof(tmp));
6 O2 f; ]' a3 I& q. ^8 G sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", $ O. E) X# u; [# I f
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);4 N- k; Q+ }; W2 k
server_msg_send(server, APP_CMD_LOG, tmp);( k2 C# Y( d3 w$ J6 K% g5 M$ `
& L/ _/ e4 B% \2 V! y upp_error_count = 0;, `7 v2 C& w/ b0 F) c# P& b
upp_dmaq_int_cut = 0;
# e# L1 u! W4 a( j# o2 a1 |! d/ v // fill in data / I% E/ H6 P0 Q. v$ U4 k, E
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
2 \: x D( R1 x5 o7 k server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
4 n( L! t' ^+ \& w; _! W+ H
" |) h" n1 U% N i: B* d& W0 l: ? // wait send success
/ U; n. `. Y5 o while (upp_dmaq_int_cut < 1 && upp_error_count == 0); , v2 j& k1 J; l5 w- }$ F
- }/ T$ O% e4 V6 ^7 D. L. ?) h
// make data node in free list
3 `7 W+ ?8 _4 ^ L5 @+ P+ o ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
) h8 ?% u! r: {. k$ W) ~* j server_msg_send(server, APP_CMD_LOG, "upp send: success");) m' d: i& K6 i. W6 r, M u
}8 u+ @1 C- T, o9 Z; Y$ F, {5 d. T
return true;
# l" g- [1 J( l$ U; M/ L5 a/ }( V}
- g. b, S' F, e$ M& @- n c. N E9 ]5 y* x0 Z
# v4 o3 d5 Q: f- I! A
6 Q. M& P) F! f' ]9 ^# m2 w7 w/ r' B- y0 b! i
1 \4 U3 T& K& I* R0 d, X5 w4 w( o- [ |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|