|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 " w g3 y6 v2 ^4 |; @4 p# j4 g
" Y/ {3 Q. v* J0 ]8 b问题描述:
7 C5 r4 K9 ?9 X& l8 ~在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:- o* J4 U& x: S' r* j d
! U0 O4 K0 l( a8 z4 I4 c, h
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。7 V! x9 \) O1 l5 ]
9 V9 f8 g/ i7 B5 C+ u% ]测试结果如下:& @/ ?! \* d6 u8 v, O
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?( m) M. D6 N- X3 J1 R3 j4 o
$ w. j p0 Q$ y) ?. C4 x
8 t3 e+ [7 V* u8 J& i备注:
/ d( }" a" d+ o$ q) z5 C" }1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
: J7 {6 k1 V4 h" T2、相关代码如下:
$ P2 I: B: S. q. O4 L( q//UPP DMA缓冲大小512字节$ {: f. j1 u0 [5 q3 _) ?
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍% z2 y" ]1 X/ X% [3 I
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT: M$ L9 M$ A' ?* W; T l- p ]
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
. {$ A6 q; ~+ V; S
0 E9 G- e2 {+ l! [' R8 j
% s$ O+ X0 ?3 l5 ~& C2 d% |+ |/ T2 z//upp接收、发送buffer9 a* A9 l8 m! l
#pragma DATA_ALIGN(upp_buffer_a, 8)- |; i/ {" J- h* E
#pragma DATA_ALIGN(upp_buffer_b, 8)0 L7 T1 G4 f. u1 S( \+ c: E2 q8 ~
) u' I5 ^! I3 y( I# _unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
8 w6 d. I+ h2 Runsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];- o) R' n1 K7 n; g7 s* j, [
/ \( i4 C4 X! j) E# f- ]! O
( f# P) B% a! ?( ustatic bool server_upp_data_recv(Server *server) & q; x/ r+ B6 j
{9 C$ i8 k( Y$ b% \# W! G
if(server->upp_channel_a_recv == false) {4 |$ X6 ^9 ^- Y' ]6 K
server_msg_send(server, APP_CMD_LOG, "upp recv: start");* r0 \( Y: r1 @
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
) g- O0 p+ }2 X' f. @. ^9 Y server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
- Z9 t3 S: k% I& H* j# Y+ y- n, n2 s: T2 l
S4 r, V2 P/ o' b# C. M memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);6 i) k/ R. x2 ^& I# k- S
1 r1 P# r& S: p0 i0 g$ Y
server->upp_channel_a_recv = true;//! E5 B9 R8 M: B @1 ~. B
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);# d! o8 }' R5 |/ L9 F _4 m5 K
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;3 U T0 _$ K2 {; C+ b" z
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
9 h0 R/ ^; ^# o server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//+ i% v' p( q4 Z& c- @1 {
) q! v$ |' |; d
upp_error_count = 0;
/ A- m% T/ B/ X4 `4 L upp_dmai_int_cut = 0;
+ l; p5 M& q- d) y7 E$ Y
# W4 K9 _2 b- |' s // fill in data - |( S3 z% D3 y# E) K+ y
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);1 o: ]# ^' T( w: } J
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");9 }% p6 C% L9 W% f: x
}/ c& {. I! L- {: _
}
* h5 I/ I9 r4 H; a1 h2 ?2 G$ o2 i else{& `* x+ t1 N8 O& k4 f
if (upp_dmai_int_cut > 0){
9 s5 T; ^4 A8 B& i DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
& M8 S f( Q" F5 `+ ^0 g Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);8 t& v, } A3 S+ v6 h
+ z$ I; V0 U4 Z# T2 N) U( \" g) h* a: z" U) F% w, u4 e; K
//copy data to upp_recv_list_busy, o2 H4 c. ]5 U% j/ t
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
! o0 j$ m2 ^. ]' U" |& t$ M& |5 V- j
//
- v7 h: V$ g6 y4 a- R ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
. d! O' O3 c6 s7 ~# J6 c' y8 X2 P
//( M& J0 Z/ M% y1 S9 D `% C
server->upp_channel_a_recv = false;//! }/ B/ W- C" N
; \! W& d {: r# N4 K7 s server_msg_send(server, APP_CMD_LOG, "upp recv: success");
: f9 [2 I5 x% k- W7 i- g, L8 r6 K$ i }/ V, x7 @2 M$ G) `
}% O, s1 c9 [# \1 A \5 f/ ~! p
, K0 T* _! m$ V0 _% o1 v& H
" e. P4 f/ X4 V7 X return true;8 t; I4 J) v& d" K" t* ]
}
" ?) f( t! v) x0 C
. T1 T& p, x' f/ B/ ^static bool server_upp_data_send(Server *server)
. `: K& f- q, e( F5 o: @{9 U ]+ \6 W& ?1 Z- E v
if(ListMP_empty(server->upp_send_list_busy) == FALSE){% h0 T1 G. R3 j( F
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
! w* r$ O# h2 |. S unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);. `( a: T j3 x
char tmp[128] ={0};
* w( T6 d' [- e1 K, u) W& w# } E6 |7 V8 ^. E
server_msg_send(server, APP_CMD_LOG, "upp send: start");- O( g% o, V. Q) c! ?
print_log(server, data, 64);
+ I1 B- f+ ]7 t
4 s7 D- r& G, m7 G7 T //( ^' K% ]) @8 L; H" \ r4 {
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);- b: E1 W7 S7 N$ b% V
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
$ T& e. s q A+ w( G [* w5 i print_log(server, upp_buffer_b, 64);! U) \ _+ n: ] ^/ D. O0 A# e
2 k g3 t( K8 Z1 e$ H0 H" g1 x
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
! x6 a) n/ u1 e$ Z3 g- G( I server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
9 C' v1 `& h5 j L7 C' p& a2 ` server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
1 @5 s& N0 ~' G" I# J- y server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
3 I5 P) d4 h) _) F6 L/ U1 ?/ S: [' A' F4 d
memset(tmp, 0, sizeof(tmp));1 H0 C" S2 c% @; t' c O
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
$ j, l0 X1 t9 H) C' @, B sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
: H/ A2 g' ~& N& j4 w! c server_msg_send(server, APP_CMD_LOG, tmp);/ `1 o! S" c$ E) U0 k* q! X6 a
& w6 u0 b2 [4 |8 I+ e) V3 E upp_error_count = 0;2 V' R& I; Y& e; W# c0 r, G \
upp_dmaq_int_cut = 0;
" \9 L% g4 R3 ?" P! s; [# p // fill in data L5 c/ c3 N c @
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
; E8 A+ F4 c1 G% |' k server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");+ V! Q1 x0 L' f- F( V7 {
[. R @4 }. p, b# S2 ]: s // wait send success
2 p" n# {8 q- \9 B# }0 o2 _ while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
: A8 m; F: b& _( {9 d) n2 R
" x# K4 u- S" c9 w+ X( S // make data node in free list ' R0 S1 ~, b# S8 B' {2 W
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
. X+ }3 k- E+ }7 e$ i0 G8 M server_msg_send(server, APP_CMD_LOG, "upp send: success");- f/ h0 o7 K* y5 i4 t3 L
}
G! X, n7 a, I4 O+ C# N/ { return true;! X' t6 a' ^4 [! O) G c" {) ~( f- l4 F
}
/ U9 t2 I7 \' t9 C- n
% e* ]% B' Q5 A8 ^- M+ m
3 I3 q/ P7 N) ?) V7 \
) J" M( W0 p8 T
2 w! E- g* m+ | C* ]6 \; r
9 ]: L! e O$ W. m) F |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|