|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
7 r \; W) \8 h( j2 b9 h Y/ T% a+ x$ c4 c( v
问题描述:
; i; D6 k6 e, A6 r0 c' c+ \3 o0 Y. Y在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
; B- w! l/ ]: F' S1 D! C1 G& H; M9 Q+ e1 O
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。/ u/ U* a9 ~# B: c# c
/ `# U- U# P9 U' x- O' G测试结果如下:
4 s) l+ \' j2 t9 ]9 L3 t138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
1 x4 F5 W [* y$ x5 i
/ R, O: w2 Q( V' j( A
" f% I& ^/ t; }+ F8 G2 h* j% g4 S8 K备注:$ o* m$ l& P* c) g
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?* U( S3 B- x; t }$ o2 l& C
2、相关代码如下:
. X5 T; U0 t; e3 w//UPP DMA缓冲大小512字节7 I, C5 F/ P* h0 s) ]2 ^0 f( E7 m
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
6 K8 N6 B' {& I4 s, M. ^. u#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
2 Y) `. T) N, x! J#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
$ g$ J& Y0 Y& U" j2 R9 O) u; M3 |( u+ ~. D" r% O+ j& j( Y
# Z& T) E" h ~' R* `+ j//upp接收、发送buffer9 g8 P4 Z6 G- M3 {9 K; k5 J" V, L, K
#pragma DATA_ALIGN(upp_buffer_a, 8)
% h3 \, R# F1 B6 Y#pragma DATA_ALIGN(upp_buffer_b, 8)
# V( n* P5 c3 C0 H( c! d9 \( ]# n! t: o" J0 Q9 ~
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
8 Y3 O4 r T3 d% \unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
7 n& r& |% i8 H0 d
% T9 R4 Y+ @% C; ~& u: o5 H
/ s7 c! Z# E% E: c' |6 K/ \: gstatic bool server_upp_data_recv(Server *server) 8 h$ m- O' L) P6 R4 d; L. W
{4 L( A; K9 ^4 g! k4 b
if(server->upp_channel_a_recv == false) {: G9 V, `. n! f( q4 x) [3 E
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
- s U" Z: C0 A- [6 |, W3 Z if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
# |: c+ M4 E9 p- O2 n server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");2 h6 X. f, d. w+ d" w/ K w2 q
- v/ {4 o: _ L* z3 N" K0 V6 Y
s4 a9 _- g4 w memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);, O3 w1 h/ G9 k1 B
- R) Z& U! I3 |! |% U" M" l1 a server->upp_channel_a_recv = true;//" I, t( ^% f- [ c% I; L, G
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);1 q. P5 t5 q# ]3 k7 V1 }- d
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
0 g! l6 S' \; I8 s# h1 H server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
1 ^, n1 \: j$ j2 u! P& X1 A server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//* ^; p- }2 {! E% I- F: ~
R, K) E# {* \
upp_error_count = 0;
/ h* r# m0 f0 j( T1 G0 [8 Q7 a! ` upp_dmai_int_cut = 0;
d* d+ q, G4 u3 D( `# i. V# n" `; ~8 V D# B" q9 W0 _* f# f9 i3 [
// fill in data
L, r- {9 ]4 g, `9 A uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);1 i o: H. {/ M# ^( V5 w
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");! e( P: O" r& a' t$ }5 o* X. \
}1 |% |0 h$ e2 O3 h
}
/ Z8 W6 t. W3 q' h4 a4 {) ]! Z4 y else{+ h: f$ ^$ C+ ?! G$ r
if (upp_dmai_int_cut > 0){, U* a$ ]& s2 j/ L# m2 B
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
: J1 o3 k" F5 p1 b# | Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
& p3 B+ h: E2 C
) Z( o1 D# O( c2 d7 j: c1 B- o6 {3 E0 q7 [' q, `
//copy data to upp_recv_list_busy+ x2 k. r$ U6 y2 a7 i, E
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);" l* a. H3 ?: L C! w; z& M
: Q& ~1 n# p4 b' t' }! w* S9 y3 ?/ M //6 m' r$ T3 t6 i+ O$ k, ^
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);7 o, x% u( U9 O8 m9 j" g) y
* Q* j+ L1 @, P- l1 u2 L+ x //
' v$ P2 |7 ]' ~$ q7 g server->upp_channel_a_recv = false;// x6 |% K2 I! n* C( T* c! e3 U& U3 b
0 \. i$ f# m" {
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
+ N* n1 s. Q2 H( U }+ ~8 o2 _+ N' T
}% D6 x4 A- B. O7 d/ C N, i& {
" F& g, _. W, {& T9 u
) ?( p3 j. Y9 h1 W7 ~" k return true;
( @& |* `2 T! N6 E3 E: H) J4 N}- Q) H, B0 L& H/ T! j! H
* `) B; O, m8 M$ Hstatic bool server_upp_data_send(Server *server)0 Z3 l+ s' l1 ^" b, S& D( Y0 t
{% T! j6 z* R) v# Y* i; J
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
. g) N/ [/ l2 b% C: g DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
6 y' u' F0 s- L; g7 h. ]6 O unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);6 Z2 ?2 Z9 ?+ u; _, j, w
char tmp[128] ={0};5 x; j3 M" J! f$ ?6 ~7 m+ y
% F1 Y3 t1 j) q2 y( Z$ B server_msg_send(server, APP_CMD_LOG, "upp send: start");
5 v4 v" G6 t5 n+ Y3 ] print_log(server, data, 64);
4 W' O, B* I2 N, }! c3 V' i+ u R! m$ Z" ^7 F* J/ h
//
) k5 U; r, \ B/ k0 ^ memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);1 s' J/ t t2 x
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
* ~. m) m- O8 J2 X1 m0 |0 H print_log(server, upp_buffer_b, 64);
+ ?$ i/ o6 ]4 e- ^. ?6 T8 k* @1 \! a3 Z; @3 |6 h8 c% Q
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
, K& P# p x' e! [1 E6 L+ L% T3 }8 x server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
" A! W1 A1 \: } f7 h$ I server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;* l( C, L1 H R
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;0 v! B- E: ?# [( v
: ? u# ~0 [3 U/ N$ L8 y" @ memset(tmp, 0, sizeof(tmp));
; i, ^$ O" G \ sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 2 M4 Y0 `" J$ }
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);, g9 ?: t# S% [- F
server_msg_send(server, APP_CMD_LOG, tmp);0 T8 V3 D0 \1 K+ s( }1 B; S
] m# v: l6 }2 Q
upp_error_count = 0;
3 R! r' a3 P k: k6 t upp_dmaq_int_cut = 0; {( Y$ Q, N I, w1 d$ M+ h
// fill in data # z+ ~5 C+ H& |# p7 J& e* b" m: ^
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ; d7 i7 m1 Y3 k: I
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
8 ?+ ?! g0 h/ {: a
: U. Q$ _* u: V+ @ // wait send success
* ^$ d0 v: A3 y0 H* V# e5 i while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
, ]7 R1 \3 b1 U1 ~' V& J! |/ j. J6 Y$ I, J/ Q3 \
// make data node in free list
( l8 p, Z3 s4 ^, [! }& s, [: N+ B, P ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
4 A; ]8 p4 O$ F: o" L7 ^! ` server_msg_send(server, APP_CMD_LOG, "upp send: success");
/ @ ~' [- h& E; ?# ^ }; Q) w$ M& W. ]6 g0 l3 s
return true;
- W/ ?: e7 `- y: m}, R$ A( I& U, o6 i; Q8 `& B
- b! K2 _. X& [' d# w6 Y- {9 o
- B7 \, W1 J/ l- [3 v
; l2 y0 \+ j5 H0 z+ ]1 T. b
( f! O) A; P; G, _' J3 @
8 P+ @* j& B/ R' a9 V/ U3 W
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|