|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 5 H% a& e# U! m* z* J5 n, y" J' \2 \7 w
/ b( `) F7 H! \: X, Y) r$ G问题描述:
. J; Y/ W$ W; q# Y2 D* \: j在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:4 S7 B9 Z8 ]* }
3 ^5 i, _ t* `% d M4 b3 I/ E图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。9 f, P- S* y+ ^7 K9 _
% G4 b3 D% V' t4 F5 z9 q- @测试结果如下:
4 e6 G# A! I' ]9 @/ o138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
+ x$ @/ O: d( h% j: l. x
/ B8 v& h7 i( ~$ j t& E( P
0 J) J$ p$ J" t6 X6 o$ }" p/ k$ T" q备注:- n- t% K1 r6 ]. C9 d0 ?1 X+ u
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
Z! A8 ~! u( @, p, T5 X/ t2、相关代码如下:
7 a- z( y9 v* _7 J( S0 e \5 @, g//UPP DMA缓冲大小512字节
% c4 D4 o, ]% w% ~7 d#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍1 l9 A) Y$ p) ~; n; S
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
( C- c" _8 ?# L. d6 l8 z#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
; c- s6 O# Q/ x- J, V {5 R+ m+ y" }
( M& h2 L- F+ q1 C8 f% w& v* C- j8 j: B7 v
//upp接收、发送buffer
, N/ @: i$ m( @# [& ]- o& B' c5 ~#pragma DATA_ALIGN(upp_buffer_a, 8)9 B+ C$ S0 P2 c* C! D# |
#pragma DATA_ALIGN(upp_buffer_b, 8)8 d+ J9 O, @9 [2 X1 f
, {5 A5 c, T$ R2 {4 D0 ~! B: kunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];, s) N+ P$ N D* v
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];# b/ M6 W" W3 Z" I% [* @2 R
$ S% t& C, \/ s" v" y l( s
, U7 h _& I k0 `) P7 [- g, _7 _static bool server_upp_data_recv(Server *server)
; P% P% c2 ~( S$ [{5 Y2 j- l% s+ v2 m+ C* @0 H
if(server->upp_channel_a_recv == false) {
1 G( u. l/ H7 {5 X server_msg_send(server, APP_CMD_LOG, "upp recv: start");
/ ~* }8 l$ |" y, _8 l! k if(ListMP_empty(server->upp_recv_list_free) == FALSE) {! q/ v0 c2 C" B: k3 V2 r
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
# _# T0 m9 n: H) g- A. \$ C. {" d" j% ^! @1 D& }
- Q( L5 g, x+ o, O% E+ A memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);& Z3 m' d; r# o
. a6 v/ p' w; R* u8 B5 S- O! `, n server->upp_channel_a_recv = true;//4 k8 W; V. `% m; c+ ?
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);8 V$ J# e5 X9 K! m# m+ w
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;) Y( N+ m- h. {* `
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
: s3 A! |! H% p+ j6 | server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//$ J; `7 J9 C; d; N) A8 N# ~
! @& H& e& m9 X* x
upp_error_count = 0;
3 _4 J: N/ _( o1 z4 W$ L6 Q upp_dmai_int_cut = 0;
4 B# @# H) M* W0 n+ m% p. g2 O+ p
// fill in data
0 a/ ~: ?2 U0 s' Y uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
0 P# s5 |1 t& J& l server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");7 W% \ f( Q7 K1 ^# a# w. i
}& t9 F" s4 w9 U
}7 ~, I ?+ Q n8 l, Q& n) r8 _& }3 f4 Q
else{
4 \& d& P! c9 m4 C if (upp_dmai_int_cut > 0){7 ?0 d5 y5 |8 k. W
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
6 b3 r3 D) P# J) z% M/ j Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
6 Q1 a3 i! C: `! W/ {8 }& E6 p: u4 A2 Q$ O. u3 f$ Z; I
, G/ y, _$ |* h
//copy data to upp_recv_list_busy
- I; ?% d1 _ \: q memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
+ ~! w2 F2 q5 m% M s- ]' L ?
//, H* q1 x. o' |. W# o) a, [
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);( {/ }, x$ z, D/ k/ t7 c9 x
' `7 p( {3 \* {7 \- Q
//
( c3 W) e9 r- K) } server->upp_channel_a_recv = false;//) \2 K& N6 [5 J9 o1 F4 p
: [' _$ U' p% ^/ L& a& q; h" {4 d
server_msg_send(server, APP_CMD_LOG, "upp recv: success");/ E/ E" \3 Y5 ?' c5 i2 f* h/ b
}' d4 L/ z" t6 W0 q
}
: l& {0 _" l7 Q, I- m+ o
2 @$ j& J# C& H/ ~: M" g% t1 a
, y! M3 G: i" d8 d2 C; o3 G/ Z return true;
9 j) C: N# K2 _3 T}/ h ]4 d6 G$ M: U4 w
1 R+ i6 r/ X o5 fstatic bool server_upp_data_send(Server *server)5 d$ Z- M [. A
{
( v8 {2 T; `8 b5 E2 y1 g( I- b if(ListMP_empty(server->upp_send_list_busy) == FALSE){
% j8 ]3 E$ w: J" t1 o. a DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);# x4 _/ f: t& L# u$ ~( w5 X
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);- ]+ f5 Z* ~0 O) w0 r
char tmp[128] ={0};
2 D+ `* e# f4 [9 f
! t X$ f9 K2 L" R9 N9 H$ _ server_msg_send(server, APP_CMD_LOG, "upp send: start");. t2 u, p0 n7 L" L, V' B
print_log(server, data, 64);3 R. d. w: B; T
0 D% Y" W* B8 O+ Z; F //
5 |7 r& H; I) O memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
" W; D X7 R5 y6 A: c2 v* f Q memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);4 b! n- v) `4 S" H/ N) Z
print_log(server, upp_buffer_b, 64);
' a) ~+ {. J" D6 M4 r' B6 X) k! N" Y% s7 @% e8 P o
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
* c: c* p% D8 }4 H$ | server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 5 O) e i8 s$ z- D' n% E2 [
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
- o. q4 V$ I/ Y( a: |6 E server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
( O5 P4 b9 ?" W# `; {4 \
5 q0 q; i% h- A memset(tmp, 0, sizeof(tmp));
8 H" c/ T1 }8 T6 } k k sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ; h/ ]6 r* x9 W$ G0 h z1 Q: K
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);0 d4 J9 E# C* X0 h" S. e% q9 [
server_msg_send(server, APP_CMD_LOG, tmp);
- B! P, M* v" G' P% s1 ~
( P# p( B& n8 I6 _) v upp_error_count = 0;
% B) g; l2 A0 @' @. {( | upp_dmaq_int_cut = 0;5 C, a) E- K8 u) i
// fill in data
% G) m6 z% [6 \1 r8 R, C0 V uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); & A4 X* s+ U7 t- ]" w
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");$ T3 _$ P4 I, y6 |- |+ H' X7 Y
, S5 t3 ~6 s3 i: }' ]+ E$ w
// wait send success
7 \8 Z% x/ _! G/ W0 R$ \ while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
0 K7 U3 p; T `/ l
2 Z# w# B1 v# [ // make data node in free list
6 W4 {( o7 z9 m' x$ y ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);6 C. O4 Q' b9 l) f, |1 `* e+ x
server_msg_send(server, APP_CMD_LOG, "upp send: success");
S4 ?3 W. y5 B# k }
# P- B$ T6 H8 n) h! m return true;2 W( }* G" j! J; L
}
, ^6 {' j- A+ G, d# |. w
- n6 N0 }; {& l* M! r2 n$ X0 [; T; ^! G( M3 d) Y% B9 p/ M. @
! o% b# o0 [2 R5 ^; Q5 U" F0 `$ E9 f K" @9 f v
" b+ S* V# t! j2 O9 L
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|