|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 : o J+ E" p7 m' H- n/ A: r- Z
7 `0 i3 V' g$ I! I" `0 q7 X问题描述:
0 C2 @ X, F6 t2 S在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:/ U# O) a( [0 U& m ^6 Q
" j5 o4 r2 X, L9 z# c
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
0 A5 [5 N" O% Q* a8 }, x
7 ^" g* N" t/ [/ J" V. l2 u1 N, X; Q测试结果如下:- |# I' j9 r+ C4 h7 u, r6 x- A
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
7 ]9 g% Q0 u1 G1 z8 Y
8 M# J) H2 V1 U1 t! n! t) N4 A( p
& [7 T! Y5 [; o% O; n备注:" d% k/ A2 W2 N* N
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?; j, E* g! ^# x% h
2、相关代码如下:
9 V2 s5 G# _1 n& n2 N) _* A//UPP DMA缓冲大小512字节
9 M: O/ O3 w+ \$ u( w9 |2 H#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍0 q0 X, A1 U. }4 |& t9 {! R
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
# u& ^; A1 x0 u. y* g0 P#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)# D1 ]5 x$ b' H0 O1 K" {( q, r. h
% Q! X5 z3 b5 Z5 i2 |6 ~& F
( b, b, b( g; e, T; D4 M8 N//upp接收、发送buffer
1 `8 ?$ X) D* f C( A% o#pragma DATA_ALIGN(upp_buffer_a, 8)( i* b/ {! z" h6 D7 X
#pragma DATA_ALIGN(upp_buffer_b, 8)
/ j D0 e8 }/ I) [, z0 `
! k! c2 r$ ^7 Cunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
$ D9 P; s0 b; \# T0 }- M- {0 u' Iunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
: a+ G7 [' t- V: ]- C2 @
0 V; F; D5 I; h0 F: r- g% t4 l; W/ i' N1 Y* U, c4 q4 c3 O. R; Y
static bool server_upp_data_recv(Server *server)
% u5 p0 O, e0 ]{1 |# y [2 p) t
if(server->upp_channel_a_recv == false) {5 Y, R7 R6 I% X, S
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
3 K$ s+ X9 B5 a3 o if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
6 a8 a4 t" [7 A2 t4 g, ]$ m& R% j( ?5 q server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");9 R( @7 {( Z. l$ T5 C7 B' \2 c; U9 x# c
5 s2 }2 o J" r( P7 v7 Z0 V
* N* g7 u5 d. s4 F memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
3 j7 ~$ S% f9 l5 T1 N% L: J* e, C. ]5 U3 I1 o
server->upp_channel_a_recv = true;//' a' V2 m4 l. p6 d& b. G) y
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
! U, R5 x5 h9 x! P' K' ]# c server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;1 \" Z/ d6 U+ G; P% P) x
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;( T0 f; [' j1 ?. u" D, f
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
7 ~! G' m( M# c4 p% {9 J! S8 W6 N7 \1 t* K6 c: O
upp_error_count = 0;, W" A( J$ N* {- U
upp_dmai_int_cut = 0;( J8 }9 Y) P" p7 o ]
& u/ x- g) ]! Y* t" h( h# D4 F // fill in data
3 R& Z; O4 \$ Q- H uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);, A8 T1 H( q7 i
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");6 I* e* D. l, v* x
}9 D7 D) i: D" ^ D* s: ^0 B4 y
}! ?8 u0 D- ~% c4 w, D
else{
. ^- G: \+ B# f' Z if (upp_dmai_int_cut > 0){
0 G- U: v( R" f2 \ @. L% F& | DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
3 X2 ]4 Z: D- y! z$ M$ ? Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);4 E, d, W8 q2 D5 ]" m6 @
' K3 R3 a+ L6 o' q! |2 r3 N- ?- \7 z7 E6 w& `, o
//copy data to upp_recv_list_busy# q: c. `8 ?# h6 L" K* L$ B
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);. v; y- U: R5 o# m, }& C
0 D' ~, U: S' c0 r( G" u6 W7 j
//
1 F. C9 R z |! K9 D! B ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
( v, X( z1 W) D+ V1 Z* D
* i0 W: F$ N/ M) E9 a0 Z //
+ ~+ E, Y6 J4 v! R9 n8 c server->upp_channel_a_recv = false;//& t6 C, B0 l( Q1 H+ `/ Y3 u
& g6 m9 r: l) [. d* U! n
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
/ q" c) p0 J0 x3 A, M+ J0 b }
" g6 \5 y, A9 E% h5 y( |! ` }, s9 C6 ? d1 x/ o- M! y: n
) q; q' [2 K) Z
$ T, Y) Y7 m1 e6 I# M3 v q6 R return true;4 L7 U8 d! W7 U) i7 ?2 K5 r1 v
}
, @% ^2 [' C* J+ i8 _# a5 w! z8 Q. l% a9 O
static bool server_upp_data_send(Server *server)" t1 k5 [0 w( H7 W6 D
{* c7 V- z7 ~$ n' Z6 q
if(ListMP_empty(server->upp_send_list_busy) == FALSE){- y0 R0 Z5 o4 A3 a) u
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);2 p+ X/ L# k* Z; g2 f* s" ~1 Q" F
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
% q; ^5 m) b9 U; H char tmp[128] ={0};' p! g* U! [7 O1 W1 i
4 X1 C9 H) l. ?) }* [7 U server_msg_send(server, APP_CMD_LOG, "upp send: start");
# z/ I7 X& e+ i print_log(server, data, 64);
6 k, X3 X' c2 H' \+ ]5 C+ [
9 ]6 r1 m8 S' ?% E //5 `' Q1 l8 k" ~; U$ h% g! }
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);2 I1 z0 F2 R, M2 O6 Y& ]
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
5 |3 P' ~4 c1 G/ s ?0 p/ A6 ~ print_log(server, upp_buffer_b, 64);
) C# G( I. {& r7 I' c5 s- W4 o, X
4 S3 L9 J% Y0 r) n# E4 h+ {' X4 c server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
1 ~. J b% s: W9 _4 W- M" G server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 5 H) G9 V4 p3 ?+ ]% i
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
( @! k9 O2 i" ~ i server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
1 C& j- i6 T& ?4 g! z- ]
, L* G6 ]- J9 M4 n; W! O memset(tmp, 0, sizeof(tmp));4 W! d. @* {% K2 K2 z3 C, s2 D" ^% _
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", . P& T5 Y. u4 o
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
" E% l ~8 ]% Q server_msg_send(server, APP_CMD_LOG, tmp);
& p$ R% p6 P2 o7 X* A
7 @: M" V! n0 t- ~8 O+ P3 J) [2 E upp_error_count = 0;
7 k. S, l# p# ~3 U. S1 N! b upp_dmaq_int_cut = 0;
$ G5 L# _* t9 x3 F7 ~ // fill in data ' S) e) g" x" }, R
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 2 l5 x# Q' F/ [) K8 p% \ ~
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
7 E& j2 u3 f/ D2 Z1 Q6 L% b# S v8 A4 m/ s0 H
// wait send success6 v1 M8 c% L" K/ H# l
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); " `, r0 v3 W3 J5 T5 J3 ^
/ b2 d5 z+ t3 Y // make data node in free list " ~( b; v2 g8 ^& c9 z: C, y: |
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
; g5 @8 U( D. R$ |- }" j1 q) Z server_msg_send(server, APP_CMD_LOG, "upp send: success");
; ?/ u" t8 E9 r1 U. Z* K }
* R* ^% Q% h7 t return true;
; D% U0 v. o: `' @* C* x7 T I}7 k' n; X: M9 p) ~' `
1 B8 Z! Y! j6 A H: e" i
; _- Y5 s4 n% |- H- U
7 ~( f7 k* Y5 v9 Z/ ]
/ ^# u# s, q0 u8 G7 y8 _; S2 W3 W$ |/ {- ^9 n. B q) K+ T
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|