|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
3 [. x+ \0 h" w% q" r8 X0 ?* z" W: d% d8 X
问题描述:
1 j6 C' K+ G9 `! }在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:% l ]; [2 Z! z2 ~# V2 `* o
/ W7 y. \4 l3 D( O3 y) a% C: \# i
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。 V' M9 M2 |& S8 B
' S/ P8 M: s- i$ D/ L测试结果如下:
/ |2 h$ A% N2 v* F' N" V138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
5 K1 \, J+ t; v0 f! c' P% s' w- ?* ~5 D9 n9 F9 W
+ K* b7 I: t2 H# S
备注:0 `! H2 ~6 \# y. h' e/ U' D3 O" g7 r6 S
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?7 E. D1 d- s2 Z" k
2、相关代码如下:
/ Z( A: x& x( E# \% k: k# h//UPP DMA缓冲大小512字节% c5 l* G7 e* n
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍 b" h3 ?8 L# m0 J
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT9 B. Q4 R/ q( s: e* g( z
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
% j! d; Q4 d3 P( U& a n2 z- f5 w: S" p1 T% F0 H2 m9 }8 c
" n1 K- n; S- V, ?9 W5 x# m* U//upp接收、发送buffer" y% C4 V |- j3 F! n" B# Q! R" y
#pragma DATA_ALIGN(upp_buffer_a, 8)
* r$ g. S& d% |5 K- P#pragma DATA_ALIGN(upp_buffer_b, 8)
3 L0 Y" v% B$ ?/ X+ Q8 m. @* e' s
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
- Y2 q* F9 y5 G' S' Kunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];1 g5 d$ p6 H2 o% X0 Y* s" z
3 m1 w# D9 m, B" J* ]
3 V+ O- ^7 T$ t' w+ tstatic bool server_upp_data_recv(Server *server) . F* p$ K: S3 V
{& e s/ z. }& Y
if(server->upp_channel_a_recv == false) {4 \ ]& f& c! g4 T3 }) c% n
server_msg_send(server, APP_CMD_LOG, "upp recv: start");9 z- J: g; P4 k3 w
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {0 ]( q1 _" R0 d1 \9 m; P
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
# s: {8 k0 l& Q( P) q) A0 g
C; C! N- H* A" i/ o; h0 f
0 }; B" S6 V( ^1 P& D memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);1 X5 ]) [8 o, i. z6 C. z b
3 F1 ~! j1 n E/ n: P6 G5 F8 W" H# S5 a
server->upp_channel_a_recv = true;//
: T" ^3 B [" p- x$ Y/ I' M server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);6 Y% `6 F; X5 R/ n
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;( \2 @- G' h2 g8 l
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
, U6 T0 c! |0 X/ [ server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
9 R0 H! Q c6 ?. l i6 P. o Y8 Y$ c$ P- c4 q( I0 `
upp_error_count = 0;2 z( {+ w$ p$ j& z* F3 F# q, |$ T
upp_dmai_int_cut = 0;1 \0 }" p. N) K
( I9 _) d, r8 }2 S+ k
// fill in data ' ?! J$ p$ U/ D( a, C3 G$ P/ _1 T6 j
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);1 f, B2 I. e/ ?; c2 U+ I4 S( r1 F
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");" @8 h' {. p1 k
}
$ N8 R- M( K2 O. A% k( a4 h1 t5 R }
1 T4 O+ h4 M: _! i3 \ else{3 ^* p- k) m2 l3 O
if (upp_dmai_int_cut > 0){
' N( L# w& }# F* [* b$ G# }" o DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
% {& n6 d, z! T Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
4 W# n8 {# v% `3 t1 [* o8 g$ g1 ~4 \7 m4 o3 {1 e- l
, H) u& a& M* v //copy data to upp_recv_list_busy
: n0 \& f0 \8 ?( k' M5 ^ ] memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);, R$ X! A8 i& M0 O7 {% ^
: H! }$ V- r @2 T. w8 m4 X; U. l1 p //. i2 h) S) c- d k3 [+ q
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);9 ?' i. r; N4 ^2 G! s* b: T
: S" o( q W. S3 h2 g
//% h0 F3 v: L2 |" z, |) ~
server->upp_channel_a_recv = false;//( ?0 G2 U: F* Z3 K
7 ]1 R( |4 i7 a- r0 E& b
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
3 q; s' t5 c/ D& e* ^ }2 }2 E$ a' O/ c$ a9 R
}( n+ r6 F) t4 b/ e% M* @4 e3 U
" l. b' t0 S! l- {0 J7 y6 w& d/ G- I5 y; L
return true;4 s. H1 w5 G0 x+ f7 ?2 R
}2 Z Q: R3 m2 s1 V2 h3 W# Q
t+ o# S! D/ ?+ C7 h! {/ ostatic bool server_upp_data_send(Server *server)5 M& v0 ~5 {* ]' g6 ]2 y
{- I; V9 K) o8 h. P& T% G9 b
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
t2 U3 e! c& ^% H6 p DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
2 K' S0 @. `6 k2 O& ^* R unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
0 y5 j$ A& ]: w5 X- n8 \) n char tmp[128] ={0};
1 ^( n$ U! H1 a/ Q" }7 G9 g8 \- W" ^, N
server_msg_send(server, APP_CMD_LOG, "upp send: start");, g( S7 R) ?) @, d+ y2 n
print_log(server, data, 64);" E C% o4 `. k E2 K
& _9 T3 `9 m2 V //
* ~- {! b" l1 [ memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
( J& [9 Y" ]' q memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);1 f3 f/ w# |7 X9 a
print_log(server, upp_buffer_b, 64);
5 _1 c: v1 Q! K; g, G
- X8 _, ^ D) }8 n- h9 r server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
5 |$ U: L8 }8 m- z0 ]/ N, z server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
3 c; a' j. Y0 M2 \7 c5 ` server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;1 s: A% S7 l& T ?
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
4 ?, ~& g# P8 l% D* p
0 ?& I+ p8 V( C: @8 | memset(tmp, 0, sizeof(tmp));
7 ?% C* B, E0 _) ^, z" U sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 7 R+ Z' z2 u9 p2 n; z
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
K: t% r" d$ H2 R9 s" @ server_msg_send(server, APP_CMD_LOG, tmp);5 k9 e c6 u) t( [* T8 i8 o
. C9 V' Y+ F0 l5 l. N. X4 R+ }1 x
upp_error_count = 0;/ \. }/ W* M2 g- A4 P" E8 O
upp_dmaq_int_cut = 0;" z) I* z# r% ]' @
// fill in data
# U J2 w4 e% z uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
1 t7 s9 ^5 d2 W8 K server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");# D( Y. t$ z$ x
/ A3 q Z: \+ F! ?" |* c // wait send success4 `3 s9 r7 i/ w% z; a; l
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ( g/ K: T" g" X2 p1 f$ S9 g" R
/ V) R. {! s) j/ n* Y
// make data node in free list % F- [# C# u% X0 j. \1 W
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
! L& {3 B9 @8 X server_msg_send(server, APP_CMD_LOG, "upp send: success");# g/ C8 F7 J4 w% `. f
}
3 {% @ \- N5 M4 i/ o' k$ U" x u return true;5 d2 Y, a! F/ B6 S: `0 i0 `( | `! y
}
4 h! N+ U9 ?$ _+ _% w# x6 h8 X: \& e3 t4 j& m G: r
* K0 K7 @7 C3 T" L; J5 \, q( k1 h# E5 _5 S) I$ u8 W
" `* Q6 L4 ] ]4 @6 f! z; o8 W6 C' }( g1 \$ Y- t! n, i
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|