|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 4 s3 g1 ?+ z, [1 o& t( r2 t
# s' s5 H7 S7 [问题描述:. |6 M0 L3 {' }
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:) K* j, _! a# `" h4 M U; A1 w k
/ N8 C( F3 R; g6 W! Z/ l# N n- {图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。, v( A5 o5 q& a' p6 m' ^! E+ e
1 e- u+ N5 R4 t) ?4 R# p测试结果如下:. b! K6 S+ L& e% k* Z9 Q0 p
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
: K! @5 g" l$ d) \5 f, h7 c
' o% i# T8 W' B Z. h: d9 u
. s9 G5 U, T E0 \) `; W* l, j备注:
: J: P; f, G5 \" a. Y1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
) s+ S' s& ^/ X& U, j2、相关代码如下:2 B) B3 e* `5 ]2 Z! W# o
//UPP DMA缓冲大小512字节, _* C% I* G2 T# D" X! ^
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
* q+ M; e- I! S1 Q: f' ^( y#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT% G3 Y i% W* `) U
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)( B F. `4 h1 p2 L
" ^+ m6 J6 w9 s' s, [# Z
9 u Z" Y8 Q4 t [! U" `//upp接收、发送buffer4 G+ b$ ?; h0 T+ @
#pragma DATA_ALIGN(upp_buffer_a, 8)
" o/ ? s3 O5 T n9 V. U#pragma DATA_ALIGN(upp_buffer_b, 8)
- Y: I. }; L3 I" N2 `8 V! x+ u# f$ Q& Q. |/ I! M* W
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];5 D. c: l( h6 x+ M6 y& G: x
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];) z' _' p3 c2 s- ~4 A- b$ u- L
$ [6 `" T8 n( n8 d7 l# l8 q9 \" L9 j/ z# \0 x9 \; |' M$ X- [. J
static bool server_upp_data_recv(Server *server)
: x8 i- O$ g; H- n{7 b8 Y* S2 b- Y% R
if(server->upp_channel_a_recv == false) {
2 F/ b% j# _+ k server_msg_send(server, APP_CMD_LOG, "upp recv: start");: q, J. N* Z0 _% n7 y; H: i
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {& Q" k- i5 }! D, p" `! e: O
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");) ~1 F3 J; r' h+ d$ @4 U) T
$ _, E3 J' ~; n$ ^# m; i% r/ H' X2 S
$ `- R( ?3 B4 H memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);0 Q3 P1 U) `# C/ ?
1 K) x* G' M0 }* C6 r
server->upp_channel_a_recv = true;//
2 C& `7 r- X; y6 {0 e server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);8 J8 Q6 x! n C. W) f( q' h) n/ |- q
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
4 |* }$ ~4 {& E/ ] server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;% X! l: S! p0 E6 l9 q- y
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
/ Y. w5 r# H2 ~5 X' b; ?; } D0 C8 @3 d* d9 }
upp_error_count = 0;
! y6 k6 d7 q9 Z/ o" f upp_dmai_int_cut = 0;! h8 z9 n5 ]8 R1 D% C; d
- D0 Z/ R( N9 l* X- Y
// fill in data
1 G8 u: o0 N' ^$ v uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);9 y2 v: y- c5 i. ^
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
% x+ b4 n+ Z3 j; L }
7 y1 x5 n; a4 m$ Q* B2 z! w }: Z$ P) A( J0 K( C. I/ t
else{
6 _1 g4 }5 b) T( T+ U1 o if (upp_dmai_int_cut > 0){/ F* d0 N3 A q' C6 @
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
; N0 q. n9 g$ G5 y/ P" H) l1 D5 H Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);/ @# r% \# [ g8 X; C. ^
* ]/ u: U) y" J( v0 m
+ W# @* q' y$ ?: G- A" F. O' n //copy data to upp_recv_list_busy
( M1 r7 i6 G, c. ~ M" n memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
# J) F0 C; c x" x/ h9 Q) b9 G! D& j0 c+ R r
//: s$ v5 g5 K: g# {. @8 z
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
9 o3 L$ H/ ^8 A/ z
! u4 C* x: Y9 f7 n/ L5 C //
1 p9 Q l, I" x' q! k server->upp_channel_a_recv = false;//3 u. v) H- [2 S, O$ B
6 }! k& i- B) `$ B$ U
server_msg_send(server, APP_CMD_LOG, "upp recv: success");3 t! N6 J* C' S- _' k0 t& f B
} R) I$ x. }' }2 q5 K/ |
} o N6 W' V) E$ q8 N
. @9 S: @& L, H2 k+ r8 m( R' h# J
" X' ~6 S: _0 `3 l) k return true;% Y3 g. ^& S! _6 g
}
' I4 i# b" h* @
& B) g% _5 z; E* sstatic bool server_upp_data_send(Server *server)
9 h( \6 ~. t! x{( z/ D6 |/ A3 c. |6 d) `: i
if(ListMP_empty(server->upp_send_list_busy) == FALSE){( V" j2 x8 c0 r9 N3 e
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
6 o: R! q" g' `2 L5 i8 H: N: P unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);0 ~, J* h* V7 s8 w/ T5 c' q
char tmp[128] ={0};
$ t# K* X9 X t( b6 ]* X# H! Q" a! ?% M3 x8 m; h8 o8 B. y: X5 ]7 @- C
server_msg_send(server, APP_CMD_LOG, "upp send: start");
" h/ W& L" k, }% D print_log(server, data, 64);
" t8 k/ S% [; Q' R% ^& R! x" a
; ~' X/ r8 g9 `- n- E) ` //
/ H; p. \; z" G% }% J# k2 P3 X memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
^* C8 W. M: b1 s7 \* _3 `# D memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
- w7 ^- A% p" p: O0 j print_log(server, upp_buffer_b, 64);
- j8 \7 y$ e& b! F$ k; H
. `+ ~' a* N! l server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);9 q# v7 O. M1 I* ~" W: ^
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
4 u6 r5 @) Y8 }5 _# w server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;' P, X" S6 [. P) M
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
1 r& X& P. W$ l% _& j
* M5 l) n/ S. |1 i: n) D memset(tmp, 0, sizeof(tmp));
" {8 z' [4 L. L6 O. D ] sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
/ T2 t" L; X4 c: L3 \% [9 Q sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
: k" h$ @* C4 q5 n6 v- g server_msg_send(server, APP_CMD_LOG, tmp);
( m K) A2 s; s( h! R# a. z2 h6 o N; w6 H
upp_error_count = 0;
- n o7 [, |8 _1 n upp_dmaq_int_cut = 0;9 l F1 H6 a. r; F
// fill in data F7 I8 i1 w# x
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
+ y( Q v2 b& ?/ r3 B {5 G% ^ server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");% ]+ l1 w1 I+ v( Q/ M
! u6 O1 z% Y' Z: ]. Z! }# R
// wait send success
3 K1 G+ u; C l7 ?: S# l while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 9 b7 K( o' g b) O5 [* H) c
$ t4 e# l8 ^: Y( f; [ // make data node in free list
+ H# L0 m8 S2 @5 v4 y ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);) }) o; L( p3 s a$ X
server_msg_send(server, APP_CMD_LOG, "upp send: success");
& t5 o5 \" z |$ c M2 w }$ B4 G4 B4 R' `; }( A% X. n# {4 Z6 p
return true;! D' ~- F+ Z( v4 D4 J$ v% m
}. `6 k5 _- A& ]- @* K
4 f) G+ y! g$ b7 ~/ O9 s1 o) W5 D% b0 @( d2 `/ \
1 ^' h# V. g* T' U( ]
3 h0 n* F% U! G+ ~# r" b$ G/ [& X' E, s1 b% h6 I. X1 M
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|