|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 : c3 X: o7 Y: T! v/ v6 }
5 ^% V( J5 f& K8 R* c0 T问题描述:& @0 k0 ~: l1 m
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:) u! s4 N r% M( E: J+ I
% f b Q* E$ C
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
. Q0 a" V; x. x) @# }2 B
1 R% j8 S9 _$ w; _- D2 k2 T测试结果如下:
7 {0 a" z, |+ n& r138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?, F; y0 Z9 e% Z, x, _
# g: y6 @9 J3 {! D, q1 ]' `( x9 K' H9 m/ I% b0 J/ _! |" k
备注:
' v* ^0 z& B! ]1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
5 Q, O9 U2 {" S8 i2、相关代码如下:4 t" W* @, s; i
//UPP DMA缓冲大小512字节
% q8 W3 g, M* e3 U( ^( J* @. o#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍9 ^' H$ b, q0 l, W1 O
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
8 @8 z! S: w! J3 d#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)( G; Q! e" d" |1 ^$ k( L9 f7 \; u
# w5 p9 v& o' M1 g
$ ?. }9 D8 Q4 e# k/ |! f; Z//upp接收、发送buffer
) A" Z! w M: ]. q g; g ?#pragma DATA_ALIGN(upp_buffer_a, 8)
+ I5 Z/ X. Y4 h. e5 V#pragma DATA_ALIGN(upp_buffer_b, 8)
- s0 k8 S' K; T" m% i% p( V1 i
o9 o0 b" E5 n* v( v) Junsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];) s+ X4 m2 {9 x& ^" ]6 W0 {' k( ^
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
/ w: W! w/ S; Q! Q$ p/ n' N* b+ s& {# J; [& ?
9 B6 I# R. f0 _& ystatic bool server_upp_data_recv(Server *server) z- V: M- H3 r: @& _
{
4 C$ ], Z" F' j, P/ c; I6 \5 K if(server->upp_channel_a_recv == false) {
+ j# o' M. s3 A6 t/ x# s server_msg_send(server, APP_CMD_LOG, "upp recv: start");
/ i0 X5 H4 `# q [$ Z if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
. s6 V7 W3 P# o1 g0 y" ^# h server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");: ]7 a) P% R V9 J
4 J/ @5 q$ P7 {1 o1 E# v B8 g. p. t* u# G) l# o
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
3 a" y& A ?& r
9 A3 g1 C. l" N. v8 G t' S9 x server->upp_channel_a_recv = true;//
( B+ w1 N, d4 [5 |8 V, _ server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);7 ~6 k6 l' j- _* n& C/ h
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
$ h! f$ M( _* _" @" D( G- k4 G server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
5 O |' U# ?: f5 x2 C$ Q server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
4 T) n' l* @! `. n1 t1 Q
7 Y! o- u1 s! n! u upp_error_count = 0;
) K0 ~2 Q: M1 T/ y% y5 O+ b1 c7 L upp_dmai_int_cut = 0;7 ~( O4 S. b# v8 x! Y* T' _
5 A3 A' }! b! o# s
// fill in data 3 d% ~9 P2 e X5 ~
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA); \5 P" O2 J2 v ^5 N
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
* V0 z4 ~+ U5 U }
5 G1 s7 l6 d( i' _ }
- K: Z; B2 H6 e( v7 j" ? else{; _6 I' \4 v: q' I( X& {
if (upp_dmai_int_cut > 0){
1 O- m! Y( n# }3 } DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
$ C5 ~$ w; o* {5 b Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
1 ]( e+ ~" ?; F6 M9 |1 y+ T: ]& `* p; M/ ?) Y. [! q- A8 D
; Y$ k( @5 o4 d( S. R& v //copy data to upp_recv_list_busy' I+ F. \3 C/ l4 a9 d: K
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);: z+ U7 C) w# N$ _
! ?6 S" G. ]8 r$ n //
9 k; u9 k1 w7 U9 I ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
_* v9 k2 x( l: W2 y7 ^) ^
# k, V3 E: A8 _ P# S T' o+ I6 U# } //3 F7 P% R. R+ n v- {* Y. J
server->upp_channel_a_recv = false;//) u' z8 l7 V: Q H( ?4 Y
0 G4 v+ p: H) U @$ d" {/ C server_msg_send(server, APP_CMD_LOG, "upp recv: success");& |' l' V* D7 ]* j/ O. s# y: ~
}1 o3 n- e. u7 k4 Z3 p/ w& e+ X/ t
}! d8 F6 m3 }( y4 G6 U
. }, N" c" M* ]% d' v, x7 Y; k+ A) P( }
return true;0 x/ e e# {, d" `0 w
}
* d9 u! B. L2 Z2 ]: R+ k) R `5 r# h5 W
static bool server_upp_data_send(Server *server)
/ }* q% j3 j5 ?, s{& z) Z2 X9 ~* f9 \ o
if(ListMP_empty(server->upp_send_list_busy) == FALSE){7 ~0 e/ E) r' q0 m7 o
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
. @6 J% v/ n/ M+ N unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);3 N `" t' S( J3 f4 N2 b- o
char tmp[128] ={0}; T) L/ v7 c2 D* f" S
4 Z& Q! k- l* f2 z5 ]' d- h server_msg_send(server, APP_CMD_LOG, "upp send: start");6 k) V' x: k# e! Z8 b
print_log(server, data, 64);1 F) e7 B6 [8 L/ U( ~
. B6 z w P. A% c1 q* ^5 n) q
//; K- _) Z* D6 d4 k+ L
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
, V* Q0 M4 x' a: W' A memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);0 z) @$ s; T0 y7 T+ c/ }8 W
print_log(server, upp_buffer_b, 64);
, R% M1 s- r+ I6 G9 n/ x1 R/ O
7 G' B$ _; [3 j3 v server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);' q0 l5 Y& F8 ~9 d E
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
( N9 T2 h/ K: D/ _' f! |2 @* z" y) \+ P server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;, Z% _+ {0 U% S' X( P- M
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
. ]/ i6 C$ }- C2 t# F! ^% P, Y
! s! N T. O$ f3 y! P memset(tmp, 0, sizeof(tmp));9 z0 H4 z2 `4 ~! E& O* R! C
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
$ a( c. Z7 x) M- ^: H7 o sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
8 X; U0 C ?4 l7 H3 n' S+ X% l4 s server_msg_send(server, APP_CMD_LOG, tmp);
l+ a c1 m/ @* z$ B+ P7 R
0 I" e, ^; f% ^! G upp_error_count = 0;
8 |2 n/ z8 {7 i9 h upp_dmaq_int_cut = 0;
- F6 T5 N) U. b; ~' [ // fill in data
- M8 `5 Q1 @, U6 I1 f uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
8 H2 n6 l! X! r* M$ C server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");; t; F7 l5 n/ P- j. H7 }
- k% |# `7 z, P: p' T3 V
// wait send success# A+ a- G2 G- X$ N, l
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
, B* d7 h2 o/ e" X1 a; Q$ Q6 ^2 @) R! `9 O3 S' K! Z; j
// make data node in free list
# p1 I6 ^0 ~6 K8 q+ w' H2 x# [ ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
3 V, J6 Z% }- i9 j. N& l, d server_msg_send(server, APP_CMD_LOG, "upp send: success");
( \6 ], g0 K: _* N$ d0 j' J* s5 K, { }8 t1 T6 o+ N0 T# d5 z7 X
return true;8 C* x s' z9 ~1 m; c; n4 D/ {
}: t# R, a0 p |2 k: y+ k: Q0 W
9 s& @' x/ m {" }1 ]( ^) Q3 J& k$ b) n5 s9 b
5 v! j# w; @3 d4 M9 c
+ ^0 t' w- D. [+ |7 r
4 b9 U% y( Q5 g! q
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|