|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 1 O# O+ p% W) ?8 s. J1 u
8 e7 M: B3 i* x) \
问题描述:
' z) z8 P$ B2 h/ l; J6 f4 E$ H在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:0 V7 H2 \. G: Z
/ h1 E. g% K! D$ W. D- q( Z# N {
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。7 }& z2 h9 Y' Y- d2 T- h
4 @- I: W! a, K2 Y5 z测试结果如下:
' f6 D) l( R$ Z5 f# j* X: m138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
2 O4 J& O1 m, p& |( d, P- c: a2 y, y5 k! e
- k( e, H) ~9 {& m1 K' S备注:
' ~5 h2 ^/ O9 h1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
! f4 j" k* h9 \4 O( H8 S) J, Y% I2、相关代码如下:0 N" l% ]/ O' [
//UPP DMA缓冲大小512字节
( g" J7 f) [+ {- _) J7 R#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
. {# L/ m7 N8 j4 k#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT: H$ Z+ n* h+ s5 s/ o. W
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
* z' R$ D5 R" n
; O$ e" }! H- P! m( s
' m& H# Z; c. X& V8 g$ t/ y//upp接收、发送buffer
4 `& E% G0 p8 k$ g4 Z4 t# a#pragma DATA_ALIGN(upp_buffer_a, 8)! U. T$ C5 C [: G( w3 L- E
#pragma DATA_ALIGN(upp_buffer_b, 8)
, X1 G7 B9 n* [$ ~- p1 K7 p
. A$ Z& O8 h+ U! @) Z+ O7 s* f) g0 Hunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
: y% }& j/ Z6 |* ~+ t, punsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];" f" h' f3 O! N' @9 R7 _0 w6 i; S
3 ?! j0 ]& W8 E( t: f# Q5 T/ V
3 w$ n2 B* G Ustatic bool server_upp_data_recv(Server *server) 5 Y, u$ E2 @6 J, _( _7 ?
{
' ?: `0 m7 z) o9 n if(server->upp_channel_a_recv == false) {/ z: s7 p: y( k$ n, L0 Q7 P/ f
server_msg_send(server, APP_CMD_LOG, "upp recv: start");9 M) ?+ s! H3 u2 V5 H# U: ]
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {+ b% K3 x3 S1 g9 X" V2 [4 P5 J* J
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");- j7 Q' Y- [9 f- Z+ ~5 z
3 F/ X c- I5 `" N8 R$ `; p' a* }' c" \
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
8 B5 i4 T: P3 D. R: c+ ?( ^& _$ v; S$ S: Q0 \! ], f' S/ Q" I
server->upp_channel_a_recv = true;//7 S7 y) |8 m( O; ]8 U" U
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
* Z3 g8 l* k( O5 s% G( @0 X server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;6 T. o( x _7 a/ `" y) _4 p# X" p
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;3 {, R& C. e/ M
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//- n% B& {- E: N8 l- A
v8 l' p5 d4 _5 l: E: K1 @( P9 M
upp_error_count = 0;3 P J( J% C+ v/ i7 H7 Y$ O) x
upp_dmai_int_cut = 0;
, \, t! x0 [/ q3 N- K d* j3 w9 c" Q: L, A- j- Z' O6 B
// fill in data
% E4 d% B- T* k% \( U; | z5 c4 A uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);8 X+ z+ C) d+ e9 g! ?+ X r9 C
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");/ b! @& P+ u" X% p$ A4 w
}2 ]( K' C2 [+ n+ U4 q2 X/ U8 _
}
[. X& n J7 \2 n s else{+ L4 s0 O# |8 h, `+ x+ w
if (upp_dmai_int_cut > 0){
' h3 M7 R- D) {8 G DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
% s; e" d M- N% n' h Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
4 S7 l# w$ l9 y9 R0 H8 h9 V7 Z: T5 |4 |' y- f9 D. l
. ~# [' B3 n) A) F7 h
//copy data to upp_recv_list_busy# ?9 n) s7 u& ^7 M& }1 y
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);8 O" P7 O, v) q4 M8 G* o( H
( L- b) @7 U4 b4 h
//
& ~" ?$ T+ e3 x3 S" F/ Y+ {; f ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);; ]# U y, |& N# ?9 x
2 f9 ?! r2 f0 o- a+ ~/ C& `9 ^ //
1 \. I7 b% A L+ O& `) o server->upp_channel_a_recv = false;//
' u6 P u6 H" V g. ^: y8 D& W) u
! n2 `" w- }3 I' a) I+ I- U server_msg_send(server, APP_CMD_LOG, "upp recv: success");
$ o a D3 J K+ q. V, [ }
) e* g: s3 J* W0 G! X, |3 d7 N6 ^! Y- D }
8 X6 i1 f6 r. t* c/ K2 `5 Q# \2 Z- S3 G2 F) D8 X% Y
3 j# p( F7 s4 Q
return true;
" R2 }6 J* T9 O0 k- L* P$ ?; T9 h, w}2 y1 `/ u' }) \1 n# t
- ~4 ]' }6 F4 S6 [9 Qstatic bool server_upp_data_send(Server *server)
: ~1 U$ z3 G1 Q6 g- U+ E" E{( V: K0 U# {- d
if(ListMP_empty(server->upp_send_list_busy) == FALSE){ |! ]0 A# k+ D1 [2 \: i
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy); ~* T( Z; d/ }0 s
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
) S$ i5 b# b7 l6 H. H1 t char tmp[128] ={0};
9 x8 r" t. V7 L5 P& H+ y$ f
/ ^& | b* A3 v server_msg_send(server, APP_CMD_LOG, "upp send: start");9 Z, u2 c1 i+ x/ d
print_log(server, data, 64);" z- Y1 L5 F" @+ w ?/ h$ C
8 [, y- c7 P* m3 ~3 k; [* `0 | //
1 a- P3 G3 L/ D2 @! }! m: p+ u/ f memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
) U! Z3 i- v3 h) z( f: ^ memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);9 G7 j2 g, o1 H
print_log(server, upp_buffer_b, 64);* [. U# `+ x" h% G! ^9 O
9 M% a5 O% `% K2 t server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
6 K5 s+ q$ B+ ]+ N2 y server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ( t% L- J; B: E7 `. f8 }
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
$ X) S n& C3 O4 s$ F& ]% C4 W: O server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
: h: B; |6 Y" k# z( \( z5 c c6 @* B1 }% q: G' o5 T
memset(tmp, 0, sizeof(tmp));# Z! ~: a3 S3 H3 Z, R' s
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 6 H/ e) K4 r8 `& B
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
! P ^# N; h' h9 y' M! T) d server_msg_send(server, APP_CMD_LOG, tmp);
9 w% W" P7 B. u5 g% _4 a E) `, y* p/ |2 u; N3 S
upp_error_count = 0;# O! `4 V8 w! L G; M% o
upp_dmaq_int_cut = 0;
8 Z, [1 W% G! X! j. L // fill in data 1 g* l1 C2 Q: [
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
+ U7 M8 d( B5 H% B0 L1 s! z4 t" j) H server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
' w5 [6 {: T' _1 H" B, h) q! q8 n8 a3 Y" Y7 j2 n+ ?7 k
// wait send success- F# P* r8 N# D( i: f
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); - t( e" o" {0 f8 T3 ?' o% h N# r
$ { Q* g" m. E% [% g! I/ L // make data node in free list
3 z* m: m6 J; v% Y' r ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
% P" I/ Z) q, i; R% S3 t! | server_msg_send(server, APP_CMD_LOG, "upp send: success");. ?# m2 a5 @# }( @ f; H6 W' G$ @9 J
}
0 V) ]+ h$ G d v5 ?6 z return true;' c1 G, ^& p1 \2 h) T0 `" z' h
}- C' O- _! u0 ]+ K
# C- n) {! l% r3 Z! k& s7 b
i' t, }% j% i& N
' v. {# }$ f! k5 K# Z9 ]7 @2 _' u, v
- s, u2 z* D+ s# `! h! q& ~! e; n) z# ]: [) {4 s- w, D& \
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|