|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
. a/ |2 w. s, @& O( {& h- |+ R, z( b0 ]
问题描述:2 a# Z0 N' H8 i1 g- a+ z
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:. E1 g7 V1 F$ P6 H3 z) _
% n' V: A9 l+ @8 u& i' C图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。 ^4 Q& N# M; X( Q' i, q! Q7 S) o) V
. |; @ P" Q* i, d: E" i
测试结果如下:
. r/ `3 {' k7 A1 H5 l8 t" M138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?) N1 u9 ^& n1 L5 J
- j+ w$ {$ s* v* F1 F; @
. x. G) Y7 H: n: i: M$ ]7 {备注:: P* W$ U) k& C0 [
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
' g5 ^+ ?( t+ y7 H3 s& P: m2、相关代码如下:& W8 Q- H( D! ^5 V5 v8 g' m
//UPP DMA缓冲大小512字节/ V+ q$ U7 u. A
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍. d; J" i& r( E( W4 k9 a
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT5 C \( r6 F% q
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)6 g# }; j/ d( z& y$ u+ C2 N1 j# n
) B2 Y0 t; `5 u/ h) u$ r
, D& G: {4 _$ B; m
//upp接收、发送buffer/ W# v; F+ R+ p; O$ l& }" F4 O
#pragma DATA_ALIGN(upp_buffer_a, 8)
! n4 i5 @2 g( A5 ~1 |1 W1 d#pragma DATA_ALIGN(upp_buffer_b, 8): @7 u; N0 [0 J7 c
4 y2 }& w! u) [
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];% e! j* Y# R# d7 Q4 `( U) g6 k
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
4 r' s8 C' D( _6 ~6 ]. W1 S- |- E9 P1 P0 \# s9 `# S' a
6 R0 l2 M! i* q1 U+ J$ R! s
static bool server_upp_data_recv(Server *server) % [, b# q2 ~6 Q" Q6 J
{
' g* X( m6 s: a if(server->upp_channel_a_recv == false) {
/ g3 Q8 g/ t& T, c6 I/ c server_msg_send(server, APP_CMD_LOG, "upp recv: start");/ Z1 l3 P4 F( S' Z+ I, j
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
, P6 U0 y9 G, S L server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");$ A# e+ M! `9 L
" X* Q' ]5 ], r# N: C' q
- R1 d4 y# t: v+ x/ t `: J memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);: X' ~0 H! l4 e( L2 C
2 k. l+ D9 f( b1 m7 D& [, I+ D server->upp_channel_a_recv = true;//) |, Z& ]7 f2 d. ^3 T8 s+ H( C
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);7 m. w- I' ^; ~2 G$ Q
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
' G/ C0 ]& m" \% l" j: u) T7 A server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;1 y, J* n( [" n* y% t
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//6 O0 f) S0 _1 Z& w+ X; A
/ H' |8 w4 E% B0 }" x# B
upp_error_count = 0;4 K1 X9 L" w& ]! T- ]+ P
upp_dmai_int_cut = 0;0 L4 C' d# ~3 v% L( ? a
$ z6 P8 A7 e b. v' O // fill in data
$ b9 {( P8 n/ ~2 A* b3 Q B- s2 P uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);( t1 x$ R. G9 D- W; h: ?" }
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");2 B2 U( |0 L) m1 A4 p
}
- O/ j. ^; y6 }6 |( ` }$ U8 ~+ ^, p! P+ w7 m/ O* E- t
else{% H- O0 T% F. w
if (upp_dmai_int_cut > 0){
1 M! ` C4 Z1 E/ j5 J( \% P, ]) f) { DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
3 c) q# p' _8 {2 b& n- J& f' M Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);6 J1 G% ]! G# Y8 N* {9 Y" T
$ H! I5 q" |$ |1 P: E$ E e
" C7 U2 A" R6 ^0 ^; M" X8 g( u- R //copy data to upp_recv_list_busy
; Z2 y6 a8 z& ~2 U: @' Y memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
- h2 b4 g4 h W! G- R
) w" N1 J% x6 I9 Y3 G% i //9 y$ K5 [ b/ d; O' H/ [
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);5 b9 a$ A; \, ]& Q0 v9 l
& ]: q6 a) i) y- ]6 z: x
//
9 J! Y3 G( o- O, c, h I2 |+ c server->upp_channel_a_recv = false;//& q% s7 ^8 k' H! ]
- N8 s9 z3 ^. Y( s& J' N$ R
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
3 }- N5 h1 J+ J }5 c, z( V! k |% O' e& {% j) y
}; u! z) E7 ^1 _& b9 [
, q r) _/ M8 A) Q: W0 h. |- Y8 f4 `4 I; l
return true;
( S k& c8 M" w. R/ _}
1 W# _) r0 D5 @0 Y) G# x8 C# x* W% i9 Y8 ]: R
static bool server_upp_data_send(Server *server)+ L9 Q& M5 z+ D; H1 i0 [
{1 N* F4 h' o: s
if(ListMP_empty(server->upp_send_list_busy) == FALSE){- f j0 U. R* `( W+ `5 ~+ B6 G* \
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);, X# j9 D+ m0 F% P4 X
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
4 F6 \$ S; x- q: D7 W" l char tmp[128] ={0};
" O7 J- }$ ?* z+ I, q$ u% T6 J+ N4 q) a" c; `# B
server_msg_send(server, APP_CMD_LOG, "upp send: start");
0 |( p$ I3 n% c' o, G+ d W) J) A print_log(server, data, 64); ~% `/ ~" i3 C! V. s# k' I
7 _1 `9 o2 F% F3 z" } //. ]3 v8 J5 p% B' h: U
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);! m8 V1 N8 T' s/ m0 t, j4 H
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
0 O1 X0 l( d/ \. ?# G1 T print_log(server, upp_buffer_b, 64);
2 E/ P4 I$ }0 N% e5 E7 |3 @' S- B) v- V' ?
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
& Q8 {% F+ ~3 b1 {" l r* Z server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
[7 \2 D+ e, `- U' f* l3 h3 f. y server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;3 d- B' Y5 V/ k @( P( `2 i
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;& D- M# a6 K; a. b' l' }
4 I ^. v6 [5 i- A8 C
memset(tmp, 0, sizeof(tmp)); \6 T, a1 r% X9 T1 [7 i+ Q7 E
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ' q1 t& E' l: q' v& y: h) m5 u
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);2 u9 ?4 K6 d; X; _# Z8 g: K9 ^
server_msg_send(server, APP_CMD_LOG, tmp);% z0 p* H# r0 w5 T/ d1 A' `
! E9 C' I) i# D+ L
upp_error_count = 0;" b5 B( C, M( K0 K3 `" ^
upp_dmaq_int_cut = 0;
6 h4 `( t" v5 T4 C // fill in data # O: p* D( y/ L/ Y) X5 i/ s
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ; {5 s" j- z! z* ]/ I7 l
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
# T. o* \! j2 a A# Z8 F
0 v% ]7 b6 t5 M // wait send success& ~7 {+ Z8 J1 c) Y" }: \: U
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
^% G* c1 t* X9 D5 x# p
, L3 _' d+ ?& ?! @5 r // make data node in free list
6 w# f: i( \, l$ b ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);4 _( S3 n3 a! E. ^! n
server_msg_send(server, APP_CMD_LOG, "upp send: success");
5 d- N0 X, Z) J- K: ] }4 z8 v3 \) I: ^) ^; c
return true;
/ Z8 G4 J3 F$ f; ~8 ~* Z0 P" T* f}7 q% @$ O) @0 n: N, K
4 Q+ g) E& i- e3 y8 W0 r0 L. n* T# S3 ?" `0 H- K# h; O
% g9 g+ i- S4 S; K; D6 [
$ z7 F+ }9 T3 m* X' Z& p. z4 e, f& Y s
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|