|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
8 B9 p9 w; ~2 B5 b8 C2 A0 F$ z- S: i: ^5 T
问题描述:( I8 u1 I0 g0 v: F6 `% w
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:* f4 P) w! l: q# Q
" U2 x% `6 }: R% v" O. o
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。9 S6 c! ?/ R/ @7 _5 v, Y: R, V
4 _& N) P* a# `. N- O' M
测试结果如下:/ t$ s# [/ i" I- g
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
' T0 X# [3 a0 D) N- E, I
4 C: H2 y/ o1 N( N
3 O7 S& b$ y, s) J) M备注:
E: I- p h/ l+ S; V5 U1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
$ H3 T4 W8 ~' k7 @2、相关代码如下:
) C6 z9 [2 m9 y* c, i; W7 ]//UPP DMA缓冲大小512字节
$ ?$ `; u0 ~' z2 y# v! ]4 R#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
! T; r# i) r. s9 h/ C#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
* _* O- M3 ~' G6 ]" ?$ ?#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
1 Y( s( l$ M a+ [, ]
: |: M) o* ^% g8 f" h+ o3 H" d F* t3 I1 K
//upp接收、发送buffer
- c: y$ A4 G# c0 X$ `, D#pragma DATA_ALIGN(upp_buffer_a, 8)0 e# W- }! o5 w' ^
#pragma DATA_ALIGN(upp_buffer_b, 8)6 ~+ c& V! p2 }. v
* U, h7 h# T( @ l
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];, t$ l5 J a# Y: d% |' w, ]0 a
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE]; {2 G& q, R( ~' x) W
, ^4 [5 {. X' S5 e- D
( m4 U$ @; Y: @5 o2 @+ A; {+ L! e2 w
static bool server_upp_data_recv(Server *server)
( D5 C8 J( ^# |. e5 o{
; @8 V1 l! J+ I: n if(server->upp_channel_a_recv == false) {2 G @% C, ]3 Z! {- G" }
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
! J- B9 R1 n2 J! _ if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
) C. v6 \1 w9 q0 S, s server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");! i% O* d5 ~" x0 e/ {. K/ b5 g8 g
* Z' v5 j8 b/ z+ \
" V4 H( q) x8 c3 R1 w2 b4 Y
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
6 l5 z! m1 l: |, M. s* t8 q6 B5 g* q( U% t# }$ c
server->upp_channel_a_recv = true;//
3 m+ F f t( ?7 v server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
( F/ h5 j$ f) Z2 i3 q server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;3 x: A J' t" X$ x
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT; D3 Z0 g7 _$ S3 \( z' S) l
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
. R8 _7 y b: G6 {
1 y- X' k& |' h5 Z+ e upp_error_count = 0;
. G3 @% C/ P; {7 F upp_dmai_int_cut = 0;' ]2 E# {' ?+ i) _, ]' j( Q
" n, o+ q5 p5 l0 [1 j+ T' q
// fill in data * V+ i# n2 b/ s# l; s+ p( e4 M
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
8 F8 s5 u& \: f {3 Z& _+ z server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
/ Q. l) j6 C/ [+ i' I) W; f }9 Q6 G' K+ R" O' v$ t; t6 Z' h7 j
}: V3 E6 [. e, z2 \( w% e: }
else{& U2 R$ J. V6 l) Z$ |2 v; s
if (upp_dmai_int_cut > 0){) P* z$ h) W- l _. U6 q; U
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);1 W r- S) A4 t1 n* D s
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
" f9 X5 e! ~, ?2 }$ t8 L+ b+ Z' `7 v: v. \" Y+ [/ o* d5 s0 `
4 o3 ~7 s" H3 ^0 Z# E! L% | //copy data to upp_recv_list_busy7 k. ]( U/ T: P6 M2 a+ T& s
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
4 P! q) l+ A! B& l3 s
, R0 v$ {: F% L1 C- x- u //- M, o2 m( A( U7 }
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
7 E8 Q) c8 s1 E1 L: k/ ~# Q \2 K* }* h. b' R0 a
//# U E% E. D; z! I4 |7 n
server->upp_channel_a_recv = false;//
2 [. ^$ j# o1 h! v
8 `( ^4 |# x0 i2 ]7 W$ _ server_msg_send(server, APP_CMD_LOG, "upp recv: success"); s5 B2 Q7 I8 `2 N0 {
}, m/ r6 Z* _0 o5 i }, ]
}+ L1 w( v9 @% m1 {
! C/ U! [" p* e* E& A% O6 R
" G- I% c4 ?0 G# D# G g* l return true;
/ A6 k$ C* z" h1 M$ e+ u) a}
& \: h# c8 T, c! k2 k% E6 _# M B9 K; B9 u
static bool server_upp_data_send(Server *server)
, J( ^. @* s' \% n{
: J: h3 b( p* o+ C: c! l+ n if(ListMP_empty(server->upp_send_list_busy) == FALSE){! }7 M, K+ b3 h2 g, I
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
9 C. h" m/ U* ^% | r/ I; X unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);. f) _1 S' ~7 B2 V
char tmp[128] ={0};+ F8 K9 R6 \# b/ i" I: Z
1 q2 W6 c* s9 t4 H! i server_msg_send(server, APP_CMD_LOG, "upp send: start");8 q/ x2 ]* K$ N+ O
print_log(server, data, 64);4 ^, z0 d1 g, V2 t2 G$ J2 y
+ m: r2 d2 ~2 D$ j //% a: }( e) X4 Z4 k- t+ H5 Q
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);/ U) P0 v5 [* y* i( N8 y
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);% {1 @9 i! I7 r( y% D
print_log(server, upp_buffer_b, 64);
/ v# U% S' C/ y8 {( F( b/ j5 k' W6 N' t- m, h8 G9 [. M+ y" r. c$ a
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);2 n0 j \# y: x& e6 O+ l' d2 u
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
" @# F% ^# |) W: Y& i server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;1 Z2 ` M: \; `3 o
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;1 R! N0 m5 b0 g* o/ y: I+ ^8 A! n0 j
: z4 ^) o& r2 k: v# V5 \
memset(tmp, 0, sizeof(tmp));
/ [/ Z9 m" C; F& o sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", : i( [+ c4 N, f, r* f9 F
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
3 g: J- [2 }$ \- P server_msg_send(server, APP_CMD_LOG, tmp);
5 Z* T }2 G2 `# ]# b. U# @
7 u& W# t! ~! J& _- _ upp_error_count = 0;
+ B$ x& n- v4 G5 T4 ^. ] upp_dmaq_int_cut = 0;& I1 ~3 M: R) W$ ?9 S
// fill in data
t' U4 q9 d1 J9 g3 Q3 K uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
% }; [- Q* x$ p: ]4 P! S server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");& R$ B/ O# B/ j& |. [6 k
% P, t# M+ h* L2 O" ? // wait send success
4 U% t% R5 o# X( M! m while (upp_dmaq_int_cut < 1 && upp_error_count == 0); / w. c" h" W% O" x9 y
& [# P+ M: P0 V, Z
// make data node in free list
/ T* w. a& S5 m9 ~5 W3 |9 X* {. O" P ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node); W+ J8 A$ P: Y5 F# f' J5 B* v
server_msg_send(server, APP_CMD_LOG, "upp send: success");
" K; K: P# _4 I }
$ z9 H/ D6 [, n0 Z return true;
2 x; I5 {% f9 t# \6 H; z7 |- C}
1 c A3 k" b8 U4 }- W! n, x$ f' ]# v2 w4 k
; P y4 R( `( n
* n% e5 R6 u' t, \4 {) [1 _
( B- \" i0 d+ N6 g' N
3 n! T, F+ ~# D) N" z |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|