|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ; `9 [6 T" J+ D! k" N5 L. W
( S' Y' |+ A# p4 ?问题描述:
F8 J$ T7 A7 ^" t$ ~; D r在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
( V3 E, l) d/ r; Q2 b% T0 y' V0 x6 ]: T6 ]- ?2 D! N
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。; y5 c G, z5 A4 W; K0 K
R. B- s( n: A) m9 d. O
测试结果如下:
3 U. `* A6 h3 l! _% r4 k138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
4 G- \& g' u# `' c1 p. H& W: ?' @5 \6 k- O" e
; v/ ~8 H# X: i! e Z7 [备注:+ C+ Q/ s9 y" X2 ~3 z
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
$ x' Y" a9 X- r( b* V! O3 I2、相关代码如下:
8 b' M7 O3 S& _" L" M: T//UPP DMA缓冲大小512字节/ ^$ G. L( u8 R$ R" C" I
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍0 |/ R# I7 T) X3 X
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
* Z0 p7 `8 g0 \& W, {* [: B: V#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)/ x% j) O$ Y' L$ ]( U& c' }$ ]% w
. w* H; r/ v8 r8 }
! W7 H: H, a6 O( i v8 s//upp接收、发送buffer3 b, c/ ]( r: L. f B, q7 O! U
#pragma DATA_ALIGN(upp_buffer_a, 8)! d+ w: S, c1 w( |0 m$ l/ N
#pragma DATA_ALIGN(upp_buffer_b, 8)
" S6 L6 W3 p9 m4 Q0 o
) T3 D3 r2 I9 ?) h1 p/ nunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
' P1 V5 z. x. Q3 d6 }3 Xunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
4 U: l- U$ ^# w$ v
, m& ?! S T" }, V8 ]
3 O o3 r$ Z! E% S- i' k, t% v+ |static bool server_upp_data_recv(Server *server) + ?+ i- r9 M" j9 M5 i/ [' w1 b( z; V
{7 ]# o3 @. q1 }
if(server->upp_channel_a_recv == false) {
% J7 t r+ v- n server_msg_send(server, APP_CMD_LOG, "upp recv: start");, `: ~- K8 Z }; P6 `: }
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
1 c( ~) {* v, h' Q server_msg_send(server, APP_CMD_LOG, "upp recv: get node success"); h: N4 ?) t% D, p
( C3 i. G$ i$ t3 m+ i+ W8 C
- F* s% D) p! r4 d$ _( w1 o: T memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
: M6 _7 f J" d( U d! f" u3 s/ w# W; ^% v1 y' R
server->upp_channel_a_recv = true;//
) D6 y- X3 r. K5 F5 [# E- {- z5 I server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
' W- w" Q: L+ q" Y6 _ server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;" i1 X2 S( R) l
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
$ i: r. \8 Z; ~ server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
6 G2 \& B' f: p P" }( R5 m' Q( W o5 M
upp_error_count = 0;
4 x0 @) F) s$ S! _* L upp_dmai_int_cut = 0;
, ^3 \$ x8 Q! V. I1 e6 i4 {
" g4 A9 d( ?6 r2 @4 ? // fill in data % w7 k. |1 t l
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
4 K4 ^3 O! E# h" n server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");+ P" S- K3 M! K3 E4 M! d
}% f6 U) T6 i- @2 k* E$ i
}0 i( K9 z+ @5 _; O
else{, ]# m) @% y% R/ u! K$ s( w0 A
if (upp_dmai_int_cut > 0){$ F' t( _( V1 J! M
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
) A; w/ U3 s$ r' u: _9 m Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);# Y. @6 [) D( V! J8 `5 D
+ M4 L- m& ~ a9 c
! u) a# \3 h: z! u7 U( R3 y# I //copy data to upp_recv_list_busy2 a8 i* m; `* s5 P, ]6 V4 E
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE); o2 W5 k$ q( n% ?4 b
* f* x* F/ a" m5 s; c8 g( S //$ G4 S0 \" v6 D( g7 v: O, H
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);; T2 r+ X% c; `( O# F
: x$ L* i& Y9 r1 B0 e, g
//
3 Z/ z1 C6 p0 Z$ a+ R7 a* L server->upp_channel_a_recv = false;//. Y7 s5 w" Z" g
) S/ H6 B7 d% a server_msg_send(server, APP_CMD_LOG, "upp recv: success");
t3 B/ p) K& B6 b. l }! m0 o! c: U) _+ Y
}
8 u3 q! h* H2 `# a7 f) L/ F7 R
) D% h d3 {/ A2 ?- f0 O9 @ return true;
# Q( h5 D9 h0 C7 E# a" n1 T}8 |# h% ]( ?) D' R! L$ G
3 q9 M ]# j3 o+ f) s6 l2 nstatic bool server_upp_data_send(Server *server)
# W( Z8 Q& c) Y{
' Z, x4 l7 r& R+ {+ r# ~# A if(ListMP_empty(server->upp_send_list_busy) == FALSE){0 G4 K9 n6 S* x8 D
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);8 r0 }1 ? M* }6 W$ r
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
+ _" s6 ~. b# |- E# ? char tmp[128] ={0};
8 l3 D; Q& F" {! B* a" u; o' L& D+ v) v- a
server_msg_send(server, APP_CMD_LOG, "upp send: start");& o2 C; {/ n+ E7 r! c
print_log(server, data, 64);
( A1 l9 G) v; A, y
$ [6 A- N1 Q3 ^" [ //3 l( {$ W- P0 L ]0 B
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);3 B( ]. K; P" T8 B0 K- C4 |" w# X
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
2 w2 \) d/ ]% S+ W9 c, k/ L print_log(server, upp_buffer_b, 64);
1 S4 o8 e. E3 z4 r9 N1 S. e# U& k8 A4 [& P/ ^' S! i; |
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);" L1 K3 s$ n; t5 O
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; # ~2 M4 j: l4 Z: E
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
1 w( b0 U/ u' i, D7 ~ server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;% P9 \. w' b, H7 b, [# s
+ T3 N7 L+ A) A. x' ~/ ] memset(tmp, 0, sizeof(tmp));* n% M2 S5 M8 O5 N% n
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
8 R' W0 F8 O$ m9 L& _ sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);# _+ ?5 \+ B S
server_msg_send(server, APP_CMD_LOG, tmp);3 P6 O6 j1 a% Y0 f5 i
% H& ]9 t" d- \* I: |* `
upp_error_count = 0;; A, m. F% M) }+ M& G4 Q& f' X- }6 t
upp_dmaq_int_cut = 0;+ Z8 m7 e, g) \& n8 P: A
// fill in data
- ?3 e9 A8 C- Z" k+ S' Q2 X% s( |1 p uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
$ E. r% d* Y0 K" v# j server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");$ D% V* k* F6 r6 n
4 W. \1 K, W/ N T
// wait send success& d6 E( D" r& m+ W* I4 @
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
' L& V6 C+ ^/ t) _" c( L+ l; e6 p3 h9 b; m' j% s
// make data node in free list
: `2 x ?9 a3 f* H" L7 ] ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
5 ]' j/ Q9 j0 e# W0 @ server_msg_send(server, APP_CMD_LOG, "upp send: success");
2 \& c4 L i4 H7 `4 A8 }0 R }! J" }# S+ R y+ X2 n
return true;
) |: Z' g k! }& H/ r1 j}
e# [% u4 v9 l- E9 r3 r7 E. K: B9 I0 Z* j8 G1 d
; C) ^# h8 R% k, A
/ m) F$ J y! l1 ~: K9 Z3 {5 d- d5 l: ~
9 B0 o- A' Z" U2 m$ ]
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|