|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
% W3 J* q8 L# I7 S& ~
% x1 A9 _& L. M问题描述:5 r. h; ]6 p3 C! N- r% C2 A
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:3 s( I) Y4 W! U; d
7 X; L7 P* I: F$ F H( d图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。$ x( |1 Z `: r8 d% q
1 X5 L4 L- R. F) Q9 b" h测试结果如下:" j/ j( ~1 ~9 C* J" l) L" o
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?; o1 B/ S2 V9 h* `6 I) k. `( M
! \; P& Z1 @) }" _# Q4 E
3 s0 V: D( a* f备注:
( b- d$ `+ ?, n' f1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
% S" l3 a+ S3 l( _$ N2、相关代码如下:$ ~/ P4 G; o- X6 v' |3 B
//UPP DMA缓冲大小512字节+ d) B, l, N+ n# |3 V0 u/ l
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
: Q& J7 i2 h6 a, h#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
5 t$ r" J/ b: j1 a#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)& ]1 }& z2 J1 x' {8 ?) J9 ?& S
# ~5 l' F$ p! M) s4 q6 V
2 q+ g' p; \: }6 H. a( [
//upp接收、发送buffer- `! V7 O. @' r: H- t
#pragma DATA_ALIGN(upp_buffer_a, 8)2 W [* Y5 T2 T
#pragma DATA_ALIGN(upp_buffer_b, 8)
6 h: B! d2 J; P/ _ \: H) _0 G9 K9 D! u# l8 A0 ~6 s9 y
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];/ S; h: z' l6 y n
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
W( k( |7 V% M8 G6 O' Y. }
* V- p2 q8 H: n6 `1 N- z# d
5 b' h7 ~, B$ z' kstatic bool server_upp_data_recv(Server *server) 6 |! O: Z; J- z9 n& ]6 V- p
{
6 ^5 H- x! p+ R# r" N- K/ ~ if(server->upp_channel_a_recv == false) {
% a+ l; W( t: H4 @ server_msg_send(server, APP_CMD_LOG, "upp recv: start");+ ~" A a) U* Z, V
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
6 t$ X! E6 n& k8 }" n" T server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
& H2 B0 c) N, ]& ?" U9 O5 N, ~) j
M2 n; A. G+ |' O) F! U
8 ]) g9 |+ G( y; c' ]+ g memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);4 J/ c8 S4 D9 K2 w; Q
4 }; S! p& `! @" n3 d/ S' r
server->upp_channel_a_recv = true;//# i3 p& Y6 ]& j I. `$ b
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
" g) z! i: D, D+ X# G server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
1 T# B c. K0 ]9 Z server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;/ [( d# t0 U( g* T" E; M1 [
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
; z0 I0 J2 M# @7 X! J: B" }9 `$ X7 N6 N; n
upp_error_count = 0;
& W/ r3 O6 A% |9 Q upp_dmai_int_cut = 0;
! F" w5 S* B) |" x0 [6 R1 H6 N5 `) E4 I" f0 _
// fill in data 2 B; G4 d1 P) j$ j& q: q
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);" j* r: g# k1 x; ?* R5 b: f- O
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
" p) `0 l9 c; R, V; _4 i: [6 k3 s, S }% j1 n$ n$ y# Q# m
}
. T; b- b2 R4 B) e- r else{
1 g7 p( ^- z" c- ?8 c; [ if (upp_dmai_int_cut > 0){/ r& P, i2 E* A0 n6 _, V
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);& Z- ^7 _# q+ T" x/ [8 o
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);7 \ U9 d3 ?1 N! E, e& |
& y5 ]$ `* i; S' A
$ G' [) p: I: x' s) p, D0 f( }7 l
//copy data to upp_recv_list_busy$ ^- @$ @) F6 N, ^' Z
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
! ~* x, W' v5 v* `$ W" n3 G- K f0 R: U1 P3 ^
//
$ N* U. `5 w& u6 s5 L8 s, o ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);' z0 P( M/ X) Q o& n# [9 X
5 h# X( T: t; ]' _7 C& V# J
//- N, a: l+ V; V% Q5 A- a) Z7 f
server->upp_channel_a_recv = false;//' ]0 V: Q, a) i4 ^3 Y% h! T4 h
: w, e+ A( d6 ~; j7 ~ server_msg_send(server, APP_CMD_LOG, "upp recv: success");
3 m' N5 ~ b4 l( I }
" n; v/ S/ ^( j9 Z2 D2 M }
* H9 L# o, ~6 s9 |/ [2 w/ z' ^7 j7 B) `2 @# H: o
7 f5 x8 q/ H. K( A' i return true;
. z0 U9 d! i! D2 r$ g5 w}4 q+ V2 f) M7 F) Y2 ^& A
7 d: l& {* ?! ^$ q6 e5 ?- N' qstatic bool server_upp_data_send(Server *server)# ?+ }- p" o) `5 {+ E- B P
{
$ @# U4 V$ I5 ?& ^$ L% a5 M if(ListMP_empty(server->upp_send_list_busy) == FALSE){
0 o5 Y& a, X$ @& J8 B. S% S2 i2 s DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
7 |3 G, A5 M3 C2 G; ? unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
& s: \2 K/ }0 p9 J0 w char tmp[128] ={0};
8 d* `1 C$ H, ]5 H; G" |+ J2 ]! p
4 F) P2 t) x# | server_msg_send(server, APP_CMD_LOG, "upp send: start");
D P! \; a+ ?: _ print_log(server, data, 64);
# V: M+ l+ \' b
* n) M: S0 H" X% R //" Z- f6 K' x* S6 S3 `" X) C
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
8 x% c1 `9 E$ D memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);9 c( B# v7 z5 N+ o1 C% o1 O9 E u
print_log(server, upp_buffer_b, 64);+ a% E) n5 B# X8 |# }
$ X4 f& v) m3 s+ q' k* _& o
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);/ j+ p3 j3 @# \6 b4 |% F
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
/ n$ R. F! ^6 {* ~# _# J) M6 g server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;; @8 y/ h% f8 q4 v# ^: R+ O
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
6 A+ T3 B! `" ~2 j3 A* u0 L4 s) K' Z0 e, ~0 x% h) I
memset(tmp, 0, sizeof(tmp));& s6 d8 H- E* e, G% S& ^0 A# x
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 5 a: F8 g$ P/ U4 ~: l1 q
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
9 Z! b- W( C# r server_msg_send(server, APP_CMD_LOG, tmp);
h. N1 u9 V8 ~2 p
- |* |! m( _( `4 l upp_error_count = 0;2 w0 H$ S. E6 T( j. K
upp_dmaq_int_cut = 0; L- z1 a5 A/ p% k. u# t
// fill in data
+ _/ L6 P7 R1 k5 Q7 o0 v uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
% a# L& [' o) E8 M2 ^+ U7 ` server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
5 Q0 c1 X, I9 w) r v: O5 z. \( b- T5 f6 J' J( B' t: G
// wait send success
8 f; v4 H4 W. \# }" Z while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
0 L# c" R! x! h0 d; G
0 k* I+ o/ ?' p# z4 }/ n) K! f // make data node in free list
5 D' s* ^; s' l* Q7 G ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);5 Y/ e! o, u# {/ w& m
server_msg_send(server, APP_CMD_LOG, "upp send: success");% n6 ?; ^% T C( ]& t
}
- r7 `) r' a3 A, @$ X% |6 w return true;3 w+ R; k; L: y# Y( r2 f4 q
} K+ U3 [! k [9 `
, U. i9 ^ X' B! x5 L0 |
& e$ W0 D& v8 n4 G: M
0 @5 x! Z! {3 g
5 a: t" Y. J; t* @/ T; x p. m# e4 K4 S) C
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|