|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 - }. E: g# u: n" f, d4 q n
. v) E# ~/ J d2 F9 I, [% ~2 a3 a4 q问题描述:4 h0 j- C- L- e: n' _# i
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:- X5 _- R8 K" g- B* @
1 ?: q$ c/ K2 l1 h& y: }图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。 T) _0 i& y/ \) m4 R# h' Y
6 _5 e' h+ K- J% j. J( V' f7 l
测试结果如下:' U" d! a: N& `$ U
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?0 }! I+ h5 U {) K/ r9 \( g3 |- G3 U$ `
. ]$ a4 d8 w3 K+ |; k' N% `8 a
2 i5 o; }9 M' M# ?, Q" I
备注:
6 y! o7 l( W7 t' B) N1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
; D- @1 h ?$ @( b; u# U+ @9 L2、相关代码如下:
' D9 @7 z+ H, W( x//UPP DMA缓冲大小512字节2 _ d8 r `1 f- `! P8 r& x [7 `
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
' j: z2 M& H0 g: X# J0 h#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT" O' N; [# x: w7 K" h/ Y! m& Q8 ^; V
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)$ W' z7 G3 T4 l% A% J
0 H8 Y& K( V( O
" ^2 @$ y# N3 B# R f7 ^; `) L//upp接收、发送buffer8 ]4 C7 v3 \( W6 s) n! p
#pragma DATA_ALIGN(upp_buffer_a, 8), Y9 @4 q/ k9 p
#pragma DATA_ALIGN(upp_buffer_b, 8)
; Y6 f2 `; d$ z: _% t' f D- R& W6 n
% t k# @ p/ Sunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];" X7 s# g! N- o. M, @" i) ~: q
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
6 W. Q; r6 _) G& m( `0 C
5 _! Z! s! g H, @# V$ ^# z$ ? m$ u$ Y9 `2 a5 J
static bool server_upp_data_recv(Server *server) 7 v8 A" p* U! Z4 G4 G& p
{0 M: s5 z% `7 g' \5 R
if(server->upp_channel_a_recv == false) {! n. E! |7 q- F$ Z
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
* V1 m) c4 C/ J4 Q4 {0 [) q( x if(ListMP_empty(server->upp_recv_list_free) == FALSE) {! A c$ P4 v' N& D
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");1 c: t b \! R( v6 K
& P8 x( j- h; P- t5 A$ E
+ @' \$ W7 S% x+ T6 x' @7 N
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
7 S$ I. U$ w4 s. k) C
0 ~+ f3 B8 D( `7 j; `% T4 q server->upp_channel_a_recv = true;// J9 g2 f( Y# P* d
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
" P2 I# |6 y$ w. ~" {! I server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
6 c/ ~7 q4 ]* @9 ~ server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
# k. w1 y8 ]3 E" T server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
' d, e, @" y: B, p Y: C c: \2 K: K
upp_error_count = 0;1 c/ Q6 K, R) G. f' z8 |$ F5 F
upp_dmai_int_cut = 0;
# N+ r. ^+ c7 h0 E. [6 J! f6 G
! f" T" P( e l: R% W& n // fill in data ! f/ p. f% X A5 Y1 `4 e
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);( ~+ s# i" r, F& z
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");* Y9 Q( J8 U6 @( M$ i: T P) L8 W
}( ]: `' H) Z3 b* m6 X
}
. M0 |* G6 {: E else{
/ `# _3 `& @! n) K if (upp_dmai_int_cut > 0){
/ V( j* i8 t$ o6 R) E: G DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
9 x1 z9 N* L: a6 a$ b Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);. l8 G g1 b9 m- Z4 z
" N, y0 E/ D3 e8 d0 n, O: i3 j. ?/ a, p/ _( B i
//copy data to upp_recv_list_busy; O, ?1 R$ x$ {, W [
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
; k! I2 V5 ^8 K. x
& d4 A9 {' s' X0 `3 n) e //
& R0 @! x6 {+ B3 M) ? ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
0 J* d) b7 X7 q" A) M& H6 u
# c* a* o8 k c5 s9 x //
! m! q& J8 Q' x. ` t, f K server->upp_channel_a_recv = false;//; b& s5 i6 R" \$ m$ V
( F/ u6 n# V- r2 r5 d8 z/ G server_msg_send(server, APP_CMD_LOG, "upp recv: success");
: x+ m( X" \* O' q" \ }6 N7 Z5 [, ]& h5 k% @3 p+ D
}% @2 u" K$ h" b# U9 @$ H
- |* S+ Q/ \: E, \9 u8 L4 ~4 \
% p7 b/ J6 P! D+ U# ? return true;
' ~+ \" _2 t; T7 g! X( G& y}
9 |7 `$ u$ G' u. t. U" U/ S
8 D2 l) ^" D' T( H( L+ L6 rstatic bool server_upp_data_send(Server *server)9 Q- ^& M( e6 P1 A( X; M+ G8 s8 N
{+ k4 M- O1 Z7 U
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
( w$ \. E6 ~/ u3 _ DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);/ s$ c" z9 x. _0 |! u6 y8 C1 B
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);1 H# r6 S3 b3 P; l& s
char tmp[128] ={0};, B6 [( W( y8 t0 E& o2 w
% c6 m W! E) N4 |+ i3 ]
server_msg_send(server, APP_CMD_LOG, "upp send: start");
# ?1 O. R7 R$ e, m8 Z print_log(server, data, 64);
7 N5 }( q' u) o/ g0 E( X' q! N) o, t& R* ^1 E1 H$ k; T
//, ~/ ?, X+ l# h* h; ]$ u0 [
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
! g9 K1 v$ b* D2 g+ D3 J- u- E memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);" E( b V% q2 \. Z1 {* d+ r( l! y
print_log(server, upp_buffer_b, 64);
. Y; L6 Y% B+ ~ [5 |2 a6 I* W% ?$ Q, [
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);; F4 Z3 u, g" o% j* \* X. s( k2 s
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; $ y0 @7 I. G; G& u2 b2 z: a5 ]
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;9 }* F. B7 y0 X( v j3 `0 ?& C$ }2 ]
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
0 K% b; ~8 u4 }/ Y+ Y) f. V* e! T% ]+ U3 t( I
memset(tmp, 0, sizeof(tmp));: P K! b6 u5 U
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
9 u6 @& ]/ ~8 y sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);" Z* |5 V8 X% }* {$ D
server_msg_send(server, APP_CMD_LOG, tmp);
- F: z; [4 i4 n8 r y9 S; Y5 [( {6 E4 H: U6 U: X
upp_error_count = 0;
* w* }8 t$ }; W7 k upp_dmaq_int_cut = 0;
8 K6 B4 c6 e* t! d, h5 L // fill in data
0 L# _" H- H! `, f: R4 n# r k. x uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
; |' \8 u' v+ b' m$ i; I server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");+ {. s i2 J% c1 n3 |8 Z0 U) D+ ?3 K
: E* O# o. ]7 ]; v // wait send success
6 ?; O9 s$ |8 i% Y9 R while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
7 T4 `/ D& x4 @# u1 f% Q9 o
+ F g8 N" f+ U% [$ I6 D // make data node in free list , M8 W% q0 t8 s
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
! F/ I# L: q0 j% O server_msg_send(server, APP_CMD_LOG, "upp send: success");
& _# N! u7 B5 u1 ?: b; P }
0 u: H* c* i1 p return true;
8 z( m0 U; R4 B! |$ x, A- N/ ]}% M* t; a$ _6 \' e
% u" ]- c6 U9 ^- i6 p4 t: H. F: @0 m2 q& s$ [
[4 S, \4 w$ D9 n; L' Q" L' W- e! W a" N" y! k
8 @$ p) U0 Y9 b. P |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|