|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
/ c4 a, l/ n3 H- W& S: _
' f" H# s. {+ M3 @2 M问题描述:7 v+ N9 h5 @) L% [( v6 [1 v* U
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:) M8 J& f" o, P* t, E
5 q* Q# W# r( j" z+ m2 l& A
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。. `/ T1 w. M. u$ ?! i8 k C2 T
* a6 y6 e9 q8 b h& i" s7 U# w
测试结果如下:
4 n' K6 P, { X3 N138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
$ l/ @5 F4 e4 z+ {7 f7 l% ]# A4 T5 k# @4 i
3 V( l, {1 y4 ?* r5 J备注:
" G8 ?1 {* [* Y. `; b1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?: o! \+ _4 N" X$ W- C d
2、相关代码如下:- ?, e/ U# F; }# O
//UPP DMA缓冲大小512字节
9 Y# j" H0 l7 i+ F- [' p( ~# V#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍 Y# q1 U9 B4 E# [( G3 K
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT+ M2 b% l& j" B& L
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
% \3 x; h. s9 V+ k( B7 f" h$ m# ~
/ ^% E8 @5 `/ W/ @" `2 [, U//upp接收、发送buffer
8 p" Y: Q! P8 Q- I#pragma DATA_ALIGN(upp_buffer_a, 8)
3 U/ i4 Y* H& X. f6 b1 F M#pragma DATA_ALIGN(upp_buffer_b, 8)* {' K) K" h( U/ ?9 r+ R
" d4 D4 B/ [7 w" L7 L
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];/ {! x `0 b0 Y) v! B0 F' N
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
7 ~( W# [* q3 s9 ]: S
7 i: A3 P1 e& c+ b$ p% @
2 p' m6 E' C' K3 t$ e! C# A: @7 wstatic bool server_upp_data_recv(Server *server) & D5 U2 \2 e- ?) }5 N7 n
{3 F" x) ^+ c' |+ F+ }/ u: f7 p1 S
if(server->upp_channel_a_recv == false) {& s# x. n' A3 _/ E1 H7 m& ]5 i" X
server_msg_send(server, APP_CMD_LOG, "upp recv: start"); e4 ^' G3 k/ [0 O* w
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
0 M, Z* A; ?. m server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");8 \0 O2 M5 S/ Y7 W4 J) G. p# o
( F$ ] q' `+ f* \- o
, g( Q5 o, I B& _. @ memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);% f5 V6 L. f+ _' K! J
0 e5 l3 X! z$ d2 L, w server->upp_channel_a_recv = true;//7 a% X7 D; F, |. j N
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
! r9 r1 }: R: h8 j |1 N server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
7 l2 R7 ]8 A: `. e, w- } server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
8 r9 F6 I4 S+ P2 G' e server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//8 v' q- \! W+ s% C4 Q" d, P
' _/ G* w4 _9 ]0 M! w
upp_error_count = 0;
% o3 O U* D; m1 [ upp_dmai_int_cut = 0;
1 [* O4 a; J/ w' _4 H: h6 O: O* u3 X. ?% G6 E& C
// fill in data
2 n# F( j7 i! w% m2 i4 Z uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
4 k( e% W3 H* B; D: r* K server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");' C' h0 u0 E8 G/ j6 k+ h3 \& L
}7 z- S2 N4 M& R5 Q& L5 h
}
' o! [* [ H" ` else{/ U0 `( z) \) r
if (upp_dmai_int_cut > 0){ \/ X; y. T# l0 i
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);. `+ W4 }' B! _9 f) E* s8 `
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);1 S" _2 w/ k9 P' M
7 c1 M: L# c5 h" y$ d, T5 _* z- w9 u/ q, Q; n. I4 u
//copy data to upp_recv_list_busy
" Y( }$ P& ], `4 z7 B- `- r0 _( \ memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
7 y+ m \( B, x3 O5 x+ r( i$ r# p3 J& X. t: ~
//
- L2 a% X- b4 q: v4 Z' L ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);1 M. h$ Y$ r5 b) W+ u
) s& Q' m0 |) s5 |& O; k5 \; E# n
//# j( t6 h: o& ?2 k! G) ~8 D; t, V
server->upp_channel_a_recv = false;//
+ C! }6 l, `& o" o& |6 i- P
0 s; V5 t6 K+ Y H/ T, I server_msg_send(server, APP_CMD_LOG, "upp recv: success");3 S! r* ?5 w8 S
}
5 g( g7 N& |* j# ^2 k }
* f! {) F' B- R/ O/ U3 r3 K
8 N) [. ]7 Y P/ J/ N2 q) @7 [
* k/ @! {7 v# z% _: W v; Z return true;6 x& c/ ~8 S, }* J* T' \* ~% L T
}
) y" p- v! l% ~. T1 g. V( r
]: C$ F; D' O J: m5 z8 E$ @) A6 @static bool server_upp_data_send(Server *server)
5 ~4 r0 B( f+ V" h' t1 U/ ^{
+ D, \- y! o5 X7 }5 m( e/ h/ M6 N if(ListMP_empty(server->upp_send_list_busy) == FALSE){) p6 T; g( _% ?* p* g3 s
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);0 K5 t# i8 a" q) a3 A. ]( K
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
% w3 H* k) k/ k7 E; o char tmp[128] ={0};
9 t ?' n) E9 r1 U- t) T8 F5 M
, p6 `3 {" l/ |$ \& b% X, B server_msg_send(server, APP_CMD_LOG, "upp send: start");0 y6 E. |% W% t0 b$ D2 n
print_log(server, data, 64);
$ z7 n+ @ P5 Q5 Y6 c+ R
- _8 W. F1 ~: w5 y& {' m: W9 g //
2 W% J7 J$ h6 R( s0 G memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);. r4 u/ i3 v% h' W3 M0 J+ f
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
\2 V* H( J% j0 A: ]% h print_log(server, upp_buffer_b, 64);
: G8 T& H2 T5 q& x/ D0 v+ d
( \/ ^9 K' u$ u server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);6 f. I4 @. T5 V! }4 k
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
R7 F! f6 B l7 p. S0 { server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;& u4 T5 O! A. I. B9 ?% ~0 G* q" v
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
. K U* w% f+ |0 ^6 N! _# w
t0 v: U* h5 P9 T3 P. u1 ] memset(tmp, 0, sizeof(tmp));0 N9 I/ l$ H7 |# ]( m1 p7 R4 a) f
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
1 C' E& o- g) n+ z4 u! W! r sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);: C" U9 r7 I/ O& r
server_msg_send(server, APP_CMD_LOG, tmp);
, c! w6 U& D5 o) X1 h, h* A$ h) ^" d4 m! p
upp_error_count = 0;
3 P( f' J4 X& P2 _9 u& j upp_dmaq_int_cut = 0;
5 p# U" S. K, [* X6 o& \. w // fill in data
) x' s Q8 U. f uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
5 ~4 T6 F7 `+ n% k1 T$ c" H/ j$ U O server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");: ~/ ^) g; a3 Q' k
& v; U3 R& v) K // wait send success+ C7 K f `& C% `7 B% O# ~
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
7 |% B0 P7 \ Z: S& C3 R8 `% v7 F% Q( \; T0 S k9 L: v
// make data node in free list
9 n& c' W; m7 N) z$ A: A4 d, k ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
) {! ~+ O. U O4 L& t6 c server_msg_send(server, APP_CMD_LOG, "upp send: success");3 ?& N0 V: k/ t: P" l$ P2 }4 V
}- z' _; ^: @# Q* p# L
return true;7 e( U% D9 D' p* o$ y8 P6 Y
}
3 W. a" ~ p8 W r: n% ?9 q1 D S: t5 p: |
2 H4 N# U( i1 f; o
V! V' H* o* ]) c0 V; i( O! }2 g" E( T
6 s- U- S3 B; ^# {" ? ? |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|