|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
! b9 A6 v+ Y W" k
# p% F4 ~& Q+ C) D4 W" `问题描述:; v/ z, r0 C- G, ^0 A, g. Y; O
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:7 {# f& D; H9 t, K
. u' x! l0 y4 t/ ?图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
6 n0 @( `* u; @. o' J! o6 t* U8 H1 C4 w: L6 n
测试结果如下:
n5 F- [. i' p0 v3 c# Z138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?' S+ i5 n' j$ W1 [0 G0 R/ C; B4 ?
) E) _( I7 C4 ^6 ~/ N( u: i( }3 F" [4 D S- [4 R; L
备注:7 Y9 b+ m7 f+ R
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
$ ~% D/ j2 U$ U, C2 e: X( ^4 ?2、相关代码如下:
- K8 h; S0 y! X% p//UPP DMA缓冲大小512字节; o! _ y. P, n f' h; j0 t
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
* W7 \/ v8 `) ^: X#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT0 `2 [) L3 R# ^$ ^
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
+ Q; t' N. M6 e& ~- v5 l% H! H! d7 O& y V2 T
( R* d8 e* E. @7 Q, a0 K/ z//upp接收、发送buffer; ~- n+ g4 t5 `% Q; r' i
#pragma DATA_ALIGN(upp_buffer_a, 8)9 C+ `5 I, |7 x: X+ Z7 E% S- {) \
#pragma DATA_ALIGN(upp_buffer_b, 8)' c! Y' ^9 H; d t% b) w: R
' X& x& m( h+ q# x9 w
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];+ D5 T' D1 O+ s+ H3 w& \* M9 Z
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
6 ]5 B* C$ _- K( |% n2 e
" P6 O7 l/ o7 k7 i5 r( T4 C) t7 d9 W, B
static bool server_upp_data_recv(Server *server)
' d3 C0 D- \; Y1 i9 O& A{$ }- \8 e9 H3 H: B ~
if(server->upp_channel_a_recv == false) {$ V) R4 a y/ F, K
server_msg_send(server, APP_CMD_LOG, "upp recv: start");! n% w0 r1 S) @% L# F. a
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {; Q) A2 Z! ~3 L$ v" G
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
# i0 t6 ?, i: f1 R) u6 N7 t0 k- s$ n0 ~0 ^% V5 V& f
( J- D, D; H, n4 ?- J' O- z
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);& q) s& y# o' n1 `4 c
1 a" d. l2 ^7 R. }# v5 C. e$ @# W server->upp_channel_a_recv = true;//3 Q! Y e* q$ F8 @3 g$ v5 f, E
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
4 N* F9 |; m7 a3 S1 C' ~ server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
( M6 `; f+ _: c( p- R. e& H server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
3 D7 T6 `5 Z% j z1 U server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//, l* @: q' Q/ u+ w
8 X/ n; Z3 @' n
upp_error_count = 0;( Z" n5 d1 u9 _
upp_dmai_int_cut = 0;5 \- ^. W0 C' L- i8 d! w) R! |
' T# q4 B5 \8 j+ b
// fill in data ( F& E2 ~7 Y( O+ E
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);( E) |1 ^9 H3 `* i
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");6 l" k6 }6 ?& z
}
6 E( ^+ O- ~3 o' Q5 C. Q& a }
( p' S7 K0 x7 [; K) F1 P. |4 x else{' N- G; H5 r5 F, w* n* t8 |0 R
if (upp_dmai_int_cut > 0){
; o8 A5 w2 u+ ]' n" ^& W( ` {7 T DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
8 e/ s* I+ T% g5 r' s3 e2 L* e/ R( {: Z Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);- }* O9 p- v$ w0 ~2 N/ s
6 h9 u( a& u5 b8 M, m( c
% [, x+ w) q; j Y$ L5 @) Y( s //copy data to upp_recv_list_busy0 z0 }+ M! ~% P& t4 d+ a
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
2 [. O* y+ L3 m6 v' n# m( m9 ], G) r; t7 T' Y& T9 [8 `$ i! ^6 K
//5 o& _! l. \" Z$ _. A# y1 k
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
+ |7 j: J3 P; o! y+ U! ~9 Y/ _# f- c$ ]) i* |) Z
//
7 h3 u0 R+ P7 ?% c server->upp_channel_a_recv = false;//
% z# Q( ~/ s8 f8 J$ y9 f5 P1 B- T, i9 y0 a3 w& g
server_msg_send(server, APP_CMD_LOG, "upp recv: success");* ^+ j1 M7 T4 e. U0 Z) B% P5 t9 {
}0 z' ?( P" V; X
}3 y$ x. z7 e: g! G. k# j" ]
; A0 E0 i% O: i+ E
# [2 @$ `5 U) |/ a9 Q, e return true;
9 m0 |- l% \& M9 k}* f2 G9 J1 \( Z; f
% I6 z. Y+ a& n% S* i) X. A; k/ bstatic bool server_upp_data_send(Server *server)
3 i$ a! N2 z( y- S7 }& ]{6 O' p1 D8 @ _" {( d* N
if(ListMP_empty(server->upp_send_list_busy) == FALSE){5 m, Q5 i: Q I* W& U
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);# M3 c$ W3 }9 C- V% s
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
6 @+ c1 m- T) y. q char tmp[128] ={0};
; k9 m, ^* k5 r$ ^# o, Y5 a$ M, `) ?, ^! V
server_msg_send(server, APP_CMD_LOG, "upp send: start");
4 {" z2 d- a+ ^ print_log(server, data, 64);$ I' v% Q6 O! k' {1 F
- a8 N. D, O+ [% J
//
2 b4 x% ~% {4 e# w memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);% S3 r/ g$ V& k6 M
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
7 x; U0 E/ J" Y3 V( @9 ^0 y print_log(server, upp_buffer_b, 64);
5 X# Z2 h: e0 m: P" `* p: n* Z. M- F
1 p% D9 U& q" z9 ^9 p server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);1 p6 J& a$ N8 P$ \4 g
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
3 D6 Q: A' R( U server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
- Z; J7 v, L+ j; T0 q0 _& e server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
|0 f. O$ W/ ]2 _% U l% M9 ^5 U* K6 s+ Q$ }
memset(tmp, 0, sizeof(tmp));+ p# k* d- g& M2 E
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
5 n2 P6 c) h; ^. E1 Q% A4 x# N' e sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
0 N/ m+ B/ K: Y$ q' S6 ~' q server_msg_send(server, APP_CMD_LOG, tmp);
; D4 R& v R0 v! Y3 f" c9 J5 N" U: v1 q3 }
upp_error_count = 0;
4 Q2 Z; T9 g/ s1 ^- ?) \0 Y5 H/ Z upp_dmaq_int_cut = 0;
' z, o6 o1 }& Y# {& P( T // fill in data & T5 H5 Q. t4 g7 S8 J
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
% I! y5 Z. K3 I& W! Z; u: q server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");! [) N O- a# @* ^% h( D# E5 Y* O/ w
% f. \, G# g9 y2 |$ h) L b$ q+ i8 m# f+ r
// wait send success
' b% k! [. U- n$ D' n while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
8 O* f% M6 g2 C+ e! P9 U# O) _+ T9 a4 G) ], D7 W9 Y {
// make data node in free list 5 a7 r% u6 j$ [* V4 A5 P. U
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
1 d o2 p4 o6 i- ] server_msg_send(server, APP_CMD_LOG, "upp send: success");
o- {% o7 Z! G5 M' t }
" j& m& t6 n0 T+ i1 b `2 Y% o return true;) g5 W* l, E; U8 N8 Z& \
}
5 f3 @ i+ O" |0 W
5 [# E3 H3 r: g- V' {5 e( F3 i* r: O! s1 D: Y/ C
/ F" g2 q+ v; \6 {8 v2 i. E% h) ~& ]! _: I# ^6 i
" O1 G4 r" j/ A) ^
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|