|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 $ J! T+ I+ c5 L3 e6 s" F
3 z) k4 Y: U7 O
问题描述:
9 Z, R! @$ m$ d6 l9 @在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
( d) C; @# l% N0 N4 h- E _5 e, k
! l+ i4 c9 {% ~% f图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。; U$ r# |6 ^0 Q4 E+ I% _3 m
: _. I6 ?" ?2 M测试结果如下:5 f7 H/ L3 S% N# E, Y% W
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?5 o' J. t1 \! x' _, N4 @
' U% A- y4 U8 g4 U% {
* j. W+ U; O3 z+ _, N备注:
9 t' X8 u' e ^+ X5 k1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?) E5 Y3 n7 G8 x# \
2、相关代码如下:# C; E* q; R z
//UPP DMA缓冲大小512字节 @6 v' W8 f! P" o" m& v0 L0 t
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍0 x v) g+ S# Y3 B4 e9 Q$ u
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
# X& A. W& K* o& h5 I* w; N& @#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)( t( y1 S% G3 l5 t3 z
9 `$ e+ A- |* u" Z
0 Q0 A/ t7 d3 T; @: j2 O4 ~, @//upp接收、发送buffer& h" V0 |. j/ A& [
#pragma DATA_ALIGN(upp_buffer_a, 8), U3 e X7 ?' }
#pragma DATA_ALIGN(upp_buffer_b, 8)" X& ?4 d% l* H3 s5 K5 x& u
, w1 M3 w) G5 ]
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
, {. p# L" M% [) T5 Bunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];+ r, p7 N6 x0 V+ L2 ^, M
1 a& J& C+ Y# G% s' F) b3 ] _& f/ z# Z( o. N; ~8 W
static bool server_upp_data_recv(Server *server)
+ S6 a. F, t. f& G2 n9 \, Y& E{
0 m) b+ g7 s5 `8 \ if(server->upp_channel_a_recv == false) {
( W9 U% S% D: d) X* m server_msg_send(server, APP_CMD_LOG, "upp recv: start");- z4 e( s; u- ?( b
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {2 z# c& O5 u9 F$ A( Q, h
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
' l4 @4 I W" \/ ^
: D5 J9 V- y; f0 s: b
: Y* \* Q1 A9 n) N- r( G" N2 q memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
/ ]5 c. `! g/ g, w
J; Q* w; Z4 I. p1 K! e! ] server->upp_channel_a_recv = true;//
* \8 c* h5 E" g0 x! {) I" u server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
# V x& }9 V5 p server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
& w/ j7 m6 Y. y/ w0 t5 a) g: _ server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
% H0 ~2 F7 u) ]1 y/ P& B! t server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//$ n' w( D; [, O0 y' N
; X* x, D) i3 E upp_error_count = 0;
K) C W0 W7 q# D4 c, c: V upp_dmai_int_cut = 0;
/ E' M$ k4 i! d4 M+ b; {
" F5 w, }; v9 l* t // fill in data
- g- ~9 L. n) J9 {9 G" ^+ y, D uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
' f- |- _ a! X" g+ o: q server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");9 J/ c) L# M+ j0 R6 b' |1 S
}
6 ~7 m) [, E W& ]2 G }
& M" i3 b# r% N% T& Q else{
0 T$ Y; ]& O+ ^2 A/ Z2 ? if (upp_dmai_int_cut > 0){3 B: o" R" n2 q6 w) z
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
, ?- a) P7 ?, E6 J Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
) |1 r. T {- q+ B! {" d
3 D. v* N6 r6 Q% |' r. I5 l) L; G
//copy data to upp_recv_list_busy/ w0 U! s' i2 k3 `
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
? c1 P8 |" O4 g/ R' ^3 D, I0 A# m/ I5 o2 o. f
//
/ a/ i9 n0 f8 P! e3 A; M" ]1 i/ k- m ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
: i4 O4 G6 Z- ~
0 s# r( m0 H4 ] w //
9 a( m6 ~* [0 Z- A1 |( ^3 C server->upp_channel_a_recv = false;//
! M/ ~5 T$ Y) P% @/ i9 n3 @5 e) p- z5 u
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
+ B% z' H7 N E2 S8 k }
+ ~/ p. x- R+ D l3 e8 c/ J } l! j+ v c& b5 e0 ?+ |
8 [ s; f- n2 m! A; H0 n
4 r: w0 [. Q5 n9 }$ ]" a% H return true;; O: [; @% d8 \+ t3 B# z( |
}
6 v' r2 |& ^0 r! V6 |$ F3 w2 N7 L! _7 a4 z9 j
static bool server_upp_data_send(Server *server)1 U, O: F/ d2 l ], i
{0 y& B P, B" K1 D" U/ X. C
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
) j* o) l" f) l! |2 i DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);6 V' B& q8 y# F2 _( ?
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
* j) u% O/ h' W& E# p3 V char tmp[128] ={0};
$ z2 I a2 p9 k7 S) D, s' O8 v
' \% M, g M' o' v7 q server_msg_send(server, APP_CMD_LOG, "upp send: start");% }" n8 b$ X0 s- A D8 _
print_log(server, data, 64);7 h: `5 r+ r) W) ?7 M
^ I" d: f' i4 a& ?' s, o //
& B, W A, Z s! g9 H5 @ memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
6 N: J, k/ z* R7 [' M4 o, G6 v G memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
" ]' @* a) R$ J$ _- V print_log(server, upp_buffer_b, 64);
% i) m3 D3 {+ M6 X, [! a! v: E4 R) ^' d
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);5 i z! {" v8 s' V* X
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
% l1 }/ l) D: Y9 M server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;) k3 f/ `7 L) Z, F0 e8 U
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;# R$ g/ j" y& {% k/ I
' F& Z" Q. j; u( {4 h memset(tmp, 0, sizeof(tmp));
, ^4 I! ?; Y5 m9 @( j sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
3 h# }% I: ^5 b3 T" j3 c' z$ U' F$ |, e sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
+ \ A! `9 d- G server_msg_send(server, APP_CMD_LOG, tmp);1 F S8 p2 t! u+ ?( t& T
/ ?+ G7 k+ L. B( X3 L- ]
upp_error_count = 0;
; X5 S, `1 f, }3 k7 z upp_dmaq_int_cut = 0;
2 M: b7 Q( `+ u8 {, h' h7 D" ^) R. g1 H // fill in data
/ m5 F, W/ s* l* {8 c7 C+ R( k2 o uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 2 Z) _- i/ j* y3 ]0 H/ ^& j, I
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");! k) E2 v: ^) b2 X7 Q1 [
/ q3 W# J6 H% U$ O1 R0 T
// wait send success
2 q3 G& O2 I" i1 h0 a; X# l while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
$ |7 a, g- \$ l: U% P4 w
& E; r, z5 B* M7 t) |5 @2 [" y // make data node in free list + X `, f% C! T. w
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);6 J5 s: Z9 f. m
server_msg_send(server, APP_CMD_LOG, "upp send: success");. M) G/ h& T' b) k& m
}
+ x2 v8 V* ?& ]$ a return true;) F* B+ I8 u, m# j
}
; ?# y+ R+ [# O# y7 r
, i# Y' ~. N6 L* ^
5 d8 b' ^! F7 \% _5 v( ?0 g: P' |# o
. W& e1 D, w# M5 ?& P" O2 Y9 N* m2 S: V7 g% A
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|