|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
( T7 h* V3 T+ M4 {% Y+ n1 l, s# U; d# u: @' L8 q9 `
问题描述:
! ~& q& g2 h/ m& [$ ?在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
) d5 B5 D" H* E" _, O2 ^* y; o: r# x- ]0 L
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。; B/ I% S* B ` W# l% H. x' r* P
8 z3 u3 c1 f' H/ ?( d
测试结果如下:
9 D: k, b! A% S8 p) d' O$ y+ U138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?9 Q2 q6 a6 n1 q1 [1 K% ]
- \+ Q6 r% L P" `5 ]$ \ B/ a5 T* A+ `3 }1 H, u: y
备注:: h' V# b. A% O' V* }& [7 b; n6 M* z
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?3 Q7 M" T! O r0 M1 P8 Q* k/ x/ F
2、相关代码如下:
/ V' y0 x, {# x2 x5 F//UPP DMA缓冲大小512字节
" p1 `: X' ?; l7 w( g#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
8 T2 Z6 b1 y8 f2 `7 K8 D#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT/ E" B0 F8 n. h- w# f5 H
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)9 V% G" C H( ?+ a' F# v5 }
6 i! {3 }. i2 L( w( c6 L' w' l: x6 Z0 w5 K
//upp接收、发送buffer( q; R/ X( ?7 X: j: L; w: y
#pragma DATA_ALIGN(upp_buffer_a, 8)
: Z8 u( H* M6 V) a& U& r3 y#pragma DATA_ALIGN(upp_buffer_b, 8)
6 q' |7 n0 ^/ K+ f: `6 D' o
2 w- s" p0 k* w! }" U" M) Xunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];( S$ l3 ?% ~8 [
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
! B d) ~5 J% _* m& r. u! R/ ^5 i
& s! K( D- r) w8 n, C5 k' M# R. n- V) H: ?9 f; @" O& m
static bool server_upp_data_recv(Server *server) 6 L& D- R7 c, G% F3 y) G/ T
{2 y' O. s ~, H6 {
if(server->upp_channel_a_recv == false) {" O E6 s' P; M; i: h4 s6 _
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
5 ^3 T& k/ ~1 X4 r if(ListMP_empty(server->upp_recv_list_free) == FALSE) {$ B& M; A' M9 h* n% [4 W& ~9 d
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
7 V- G: Y1 C, a; A' a/ w% g* h3 p7 k8 L3 o2 s& O/ B1 r
2 e; [. h' W- N3 q6 h( f: B) b
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);. |* p% @5 h% ~
1 ]) Q! }; u2 S. n! _1 r0 L: M
server->upp_channel_a_recv = true;//
1 w# b# [: v: Y server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
( h# P, i! g. \2 f8 O2 F server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
7 E+ ~0 o, e7 r& X! [& A2 m server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
. i& p! P3 V6 o5 j" S server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
! |# l/ u2 [% N; W" ^4 M" M$ _, T# S: U2 v e1 R! T3 ?
upp_error_count = 0;
- }3 D0 f$ c2 ?- x upp_dmai_int_cut = 0;+ e* n. B5 l3 Y8 F3 v5 j3 M
: c, k i0 N, ]; Q6 R* }4 N // fill in data / \3 S" @4 G0 a" x k2 o* L L
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);# E- u/ r, z3 D0 i$ i4 {0 w* m
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
. c6 _' X4 P" X+ O3 |% G: s. V( x }# a& b& Z# Q) u) C! Y
}! T- q8 N, F3 ?) z' E& {$ m; Q8 ]
else{
* B; l7 H6 c; i6 t6 C0 Q* Q if (upp_dmai_int_cut > 0){
. e6 S9 k; L+ F' @- S- N DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);- B: G4 m: ^; Q
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);* f8 ?' t' F( k
: v. {* Q" l1 x- f# O; n) A
0 W; x2 I( U, w
//copy data to upp_recv_list_busy
4 O# q5 G' c# P# |4 Z3 H6 s memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
* x9 A$ q% R$ [1 w9 f2 U1 o! Y. l/ R* l2 U1 _/ F# s) `) I; T
//
" S4 [% O: b' v! y ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);' l8 S) ]! `7 A% t% n
0 Y1 H& |: ~4 F" P4 J) J //
3 l0 a- q- y% n! g& q; `: W server->upp_channel_a_recv = false;//6 H, n: p9 L- c" a, O u4 m3 j
8 z0 O) \2 u' I. C/ | server_msg_send(server, APP_CMD_LOG, "upp recv: success");
6 l' K% n% C& p: y F }
+ N J m- K$ Q. d }
: s* R ?& f* b6 F2 ` P, `! T
5 m4 |- m- z7 V. z; n$ R6 x, x( W5 j1 W' f
return true;4 J7 h8 P& i+ S/ U
}7 j$ K. u1 N1 N% d' Z
2 J g0 f0 p3 h9 J. X, N' l# Gstatic bool server_upp_data_send(Server *server). j+ r& ~% K: Z- P# C
{
) Q/ J W: l6 ~3 \! K6 R& [5 i if(ListMP_empty(server->upp_send_list_busy) == FALSE){% Z9 P: @* ?2 f' a5 w" l( m# M9 |
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
$ [& s( P$ ?0 P) V7 W' k( w+ F unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);9 g# e& r. f1 x
char tmp[128] ={0};
) ~; {" V/ e' k" {6 [
( C& ^2 E, \- y* V9 D server_msg_send(server, APP_CMD_LOG, "upp send: start");
2 K& d2 O c1 y# a* Z print_log(server, data, 64);
% t! V% U2 E+ Q0 J
: ?# p0 V) ^! D. S8 |+ D //
- r/ `9 B) V1 o4 J o! C memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
2 `: M5 A* c3 O, K) r* b7 U, k; [ memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
. H; I; ?/ O. o( R3 _ print_log(server, upp_buffer_b, 64);; P5 h' l) X% t3 N" r) z7 }
8 L U |+ E0 y }& n3 n server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
z. m* N1 a0 Q+ Y7 j4 d2 C server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ! l7 P4 m9 @! S9 ~
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
. o' }, v7 h" i0 U4 L( i server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;7 A$ |) l+ V$ e. W- [) ~5 J
: s4 z( K3 O+ X memset(tmp, 0, sizeof(tmp));& d Y1 a2 n( f
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ; k$ ~4 @, F0 d, t
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
$ Z# E/ W) w# c6 R$ K! z server_msg_send(server, APP_CMD_LOG, tmp);
, p, N( m& I6 o& c& b7 y8 L) v' B
f7 E3 x; U6 l% \+ l! E3 { upp_error_count = 0;2 N% K. [8 B( a# b6 B
upp_dmaq_int_cut = 0;
5 f, p& `* A. P% k& ? // fill in data
8 v Y- s7 p4 G" u uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); % n' d( R+ m: c1 z% a9 Y) r
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
# Y" j' s, D0 ?
- e: X2 L5 J0 _. f2 ~8 w2 j // wait send success) X# f" s5 Z( x4 w& _" c. W2 a( }
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); " X+ w- T. \2 i
. S) M7 X8 M7 V6 h5 ~! ? // make data node in free list 1 d, _# H/ ?/ F& ?
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
1 o: o" S( A2 |; T/ K9 I server_msg_send(server, APP_CMD_LOG, "upp send: success");
' p. R3 j3 z. n }5 t6 t& S: E9 P! s4 x6 f, ^
return true;$ w( @8 M9 n4 D" i+ F" T& `+ I
}
/ W( S8 p4 {$ Z1 |: B$ ^
7 u1 n0 s' [5 Y1 y. M: C. o4 q: G: Z Y& M- U" r" }
; a h; \( h1 k' }. c' X" V" l
4 d% V4 m& U& ~( W! u
7 j$ x, @0 u" q6 M
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|