|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
8 j! q I9 R- W2 A3 H8 {; N+ J3 ?1 U! V0 a ]/ b$ _+ y1 R3 L
问题描述:
% y0 \/ U) @' K( g在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:- v: A7 g) z* d2 I/ C3 s3 V
) E5 `( m6 F$ T& c1 Z7 G, z+ U
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。- m# ^* O l. a0 }/ P' N) C7 a" v
: M6 t3 a* [0 Z" ^2 @
测试结果如下:
0 \4 D0 H/ |) d- U1 ~9 s138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
' q, _! K8 C2 f5 d: g: y; U: v. K% w$ r, X6 m" v& @8 M5 T
3 w/ H$ D8 V0 R5 p9 j# m2 Q备注:0 K( D# V! D4 _ N, K, i
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?( S' X+ ]8 w3 D/ o8 ^' U6 N
2、相关代码如下:
6 i* y. b3 H$ Q3 c//UPP DMA缓冲大小512字节' `0 M0 T' q* v4 a$ t7 S3 z) [) B
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
5 h5 h, P7 x$ o: N0 x7 q#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT. V! L7 X6 ? C; n& m9 }# j
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
1 Z9 E; N+ s$ ~; o2 U+ d) X& Z7 O* }2 f5 z+ ]* }3 i6 A
: o9 h% I, P! {' D9 p
//upp接收、发送buffer( C- K. T, {6 n6 Q# [; Q- h: L
#pragma DATA_ALIGN(upp_buffer_a, 8)
e1 b% ]+ {, C#pragma DATA_ALIGN(upp_buffer_b, 8)# [3 v* T5 w0 i. v8 C8 i
' i. ^3 v( e$ p5 p/ e# p0 |
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];0 z+ s% i+ W$ c0 B/ V
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];: U' ^" [ c k! r" I$ [( o7 L* h
7 [7 u3 c, W( g' Z* s) z
4 r1 u% z# U2 s8 J5 F- H# K0 L. I
static bool server_upp_data_recv(Server *server)
3 a" }: K& r* f& m. A/ L{/ F, X* T4 M F* r8 ~/ M; Y
if(server->upp_channel_a_recv == false) {( s; y* \, |- N7 u* J$ ]! D& a
server_msg_send(server, APP_CMD_LOG, "upp recv: start");! H/ [ I7 K4 c& ]& @
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
0 [0 f; d: f, g server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
; U# i8 T. ]/ a t
$ t- R# h; \ L% y" a* K$ c
, L- C( A( W* S( | memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
( C4 ~ W# u- z/ P) ^3 |; G& A5 G* K: n: B8 o6 X
server->upp_channel_a_recv = true;//
" N7 j# [$ H9 ^ H9 F. o, F server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);* t) ?! J! m* ?/ o6 C
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
9 H6 u( x, d2 p3 ?/ y' ?. ~' m server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;/ W w0 y9 M9 s B) f
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
2 p% E8 ]! v2 L0 K% `: M3 M0 Z
i: |" E7 h& _% T6 {' ]& t+ g upp_error_count = 0;
7 m+ l# ?# L" N1 [2 p, e: Q! u upp_dmai_int_cut = 0;4 D6 Q) e6 y3 c- S
. q$ |9 r) K, s // fill in data
& Q; b* `6 m8 P& I uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
6 o* V/ U q! a, Y server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
8 m- `5 E! ~1 D1 u1 L }
. U- w) F' D+ y9 l$ Z }/ a, g2 @. |3 ?7 f' G/ b1 A
else{
" |. h" S }9 |- Z: R if (upp_dmai_int_cut > 0){
7 E# }! p5 `1 g ~: b DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
) S7 H. s. X2 {; H+ e Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
6 ~4 b9 U) `( q2 ]! ]5 \ P7 P- @% z! C
* i& J" \, D* r# ?! J //copy data to upp_recv_list_busy, {; O. D' T% G
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
* d) J% H( X- o; s+ l$ P0 z8 H) {( e' l1 _6 @$ K4 D- M
//
9 a' m1 u2 e$ o ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
. d v6 A% `! @" Z9 l/ Y5 o4 R0 ~! c6 g5 `; Y* Z* q+ }
//; B5 z1 t& J; E# r% P B
server->upp_channel_a_recv = false;//
/ H3 m, v7 ~! z, T
, \9 x3 J7 _1 ^1 U" b }' N6 u server_msg_send(server, APP_CMD_LOG, "upp recv: success");
# ?9 e4 f$ b! P' E! ~4 K }
& Q% T% [" G/ j9 ~: u" L }
1 \9 y, c8 x* [5 I* y( q
2 ?! V% s7 ~; t8 Y2 ^3 Y4 l: E6 b$ L9 u T) k% B f7 I, l1 S
return true;. z4 ~0 E& n M5 ] T- a
}+ \2 I! O3 q$ f9 @2 Z8 Z
) E# n$ x/ ?2 Q. F- R
static bool server_upp_data_send(Server *server)
i7 q' G# w7 z( W1 r* o* I{7 _3 a% ~" |) y9 o7 t. e. a {2 q% h# @, v
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
# |( s5 j6 s3 N' F9 z" z1 E7 _ DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);8 O# n: C7 ^1 S
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
, i6 t; n$ v) i0 c2 ]" E7 k7 d char tmp[128] ={0};0 }5 f) T& U: I; M' a
9 V8 C0 t4 \/ E1 e. K8 { server_msg_send(server, APP_CMD_LOG, "upp send: start");
4 q% \ @% P1 V5 x( k4 U print_log(server, data, 64);& p2 Q. {1 G$ ]4 p
6 U/ Y7 e* m& }; h6 F //
/ l S1 ?7 f6 S f$ ` memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
`: @! f, h4 |7 m2 {) ` memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
{9 S* @+ u; P: U+ l9 y print_log(server, upp_buffer_b, 64); l" E: s5 ~9 g3 |
: {$ _0 ^& c/ A6 h, v+ [ server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);4 V2 Q) ~. n: L4 G* A7 r
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; , m( L3 t' h+ E: P# k
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
; k9 C+ V; u& o2 o7 O server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;' H9 s1 U) x! X
9 x3 e, x2 ]. ~ y S memset(tmp, 0, sizeof(tmp));
& o7 l- @$ d: U1 W7 A* o% _* o sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
6 J2 s* w- j( H. R" Z5 W sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
/ s: u3 @- [+ V' Z* r1 e server_msg_send(server, APP_CMD_LOG, tmp);! V, x6 E9 G; Q5 @1 F7 J
( o: p; y. U5 P) s" V
upp_error_count = 0;6 {0 e# B- h. J( D. P! Q/ g
upp_dmaq_int_cut = 0;
. V+ f* Z- ^5 x& p* I3 { // fill in data & k( C6 }6 ]4 {3 Y% T
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); . r% |/ G) D# ^8 W0 V1 N' z9 w1 `
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
% x+ R# l$ r: J9 B2 l& s6 _' F, s# \- z! K4 `4 t
// wait send success( c# X' d( K# q) D7 M4 e/ z
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); & L% ?' C5 E4 o: h' A5 s
" e9 V% }( M. m$ R1 x0 }2 Z6 n" L // make data node in free list 5 Y# ?* I: ? f+ y, M* w, ?5 _
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);: [; ~' ?& N5 z& q" b, x9 O
server_msg_send(server, APP_CMD_LOG, "upp send: success");* T2 n$ c% A7 z C9 }3 Q
}1 I3 g' G; x( h8 T
return true;
0 k/ p ? l2 r0 V$ P}* u ^6 n5 l0 p2 e9 i6 v `9 X
* s( g U" [, q3 m/ y3 z7 R! x ?6 [( A) o
; e9 n' v D6 V6 ^
8 z0 ?+ g" N- C# }! s
4 m* J I( F8 q1 W" `3 } |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|