|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
: e$ a8 m. e( a4 o! j/ g6 m1 V4 V E* K- S. U. m1 y
问题描述:
( Z7 j. ^, S* M# h# b在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:* n9 L4 Z! m. S
7 e6 L2 x( @. |% }" ~& U z
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
8 U5 W C0 M2 p# k0 ?9 K% ~
4 `; s5 T- Q( S, n' m% b D. f测试结果如下:, D i+ K# Q4 u1 h T7 e
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
! h7 g# S! w. ]- N: u& u
( d" H' \2 c0 \, c8 }4 f3 M) x' x2 |8 a- q
备注:; s7 |, g5 h5 t' P
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?7 m, {6 Y' F: `4 ?
2、相关代码如下:
4 i) s! O6 w& m' e8 ]0 g% E& O& P//UPP DMA缓冲大小512字节5 g9 V9 g- u" E4 r
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
1 e: H! [3 [5 v* m' B#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
( x. Q3 @* _+ W3 Z. p: y# e#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
" i# C* d; ?2 |0 _
& a; A1 B( C# S& L! h, @+ @
4 m" v% K8 L, Y5 w//upp接收、发送buffer
2 A: u( y. e6 Y; o: P" ~! ?% J/ d: ~1 I#pragma DATA_ALIGN(upp_buffer_a, 8)0 ?5 Z1 n7 _* f
#pragma DATA_ALIGN(upp_buffer_b, 8)
8 Z+ g+ ?6 \5 x! `) U! ]5 I- {% P5 u
2 e5 ?: q; F% Bunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
6 s- @; ^. H$ n1 d" T: Q: {( h6 e; {unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];* x, q6 |- _: v* V7 c* j) I
: G% B7 e1 }; D8 ~( [, L* M. J- s2 T
1 `+ h* @6 m& o7 [static bool server_upp_data_recv(Server *server)
3 Z( [2 u9 N, a' K" A% t- o{( C: x; }/ R* s+ K
if(server->upp_channel_a_recv == false) {; W2 A0 I% q% W6 w' m' i) @
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
1 R, U2 u8 u5 N+ X/ v G if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
4 v0 ^8 _( w& [( |$ n server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");$ z7 B" H# U! J
^: L: e) {) r4 G& f! W: H, S- Y
6 Y) x& N' O. V8 Q memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
6 H9 c1 {9 I' U9 [/ _- j: g1 \. J' D3 \' h4 c9 X6 l1 @4 ^
server->upp_channel_a_recv = true;//
+ |# S U2 w$ l( e server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
) E: t8 E# P% D1 `2 h server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;! G& s. E6 n& s9 q' b6 j3 B
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;& o& q6 }" Z4 P! S' U
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
! u) v k) c" ^' n0 s6 N
, q' \2 o6 }& C3 w& n. M4 \ upp_error_count = 0;
& X$ ~4 L1 }$ E1 } upp_dmai_int_cut = 0;
) T7 v) h! e# o6 b
* w6 i) \6 I) T) P% Q) F, n // fill in data
9 c u6 D' E4 q4 h/ U uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
/ F; l1 d4 G$ N: J* ~" Q1 U server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");9 K$ G2 w+ B, V/ h7 k+ ]% H' N
}4 C1 g% W8 Z! P. n7 @
}
2 W% Z9 Z6 w$ |, A* p else{
; m) ]. e) J& K$ D if (upp_dmai_int_cut > 0){1 {3 W" ^% v. B% g2 [
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);$ j. ~/ R1 K/ A% F2 O2 R- q0 e
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
p& f/ i8 }) N9 ^) ]* z: \: u3 v
9 S9 g7 d3 ]/ a& x) E5 A2 q5 Z: j% G9 Y( M' b6 T) {
//copy data to upp_recv_list_busy1 K, N0 \! |6 b. Z
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);6 Q, x' [1 v9 v) i4 Y
% W' c3 p8 {; i' H$ m8 t. `
//5 B6 z9 l6 ^1 b
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
j* \1 ^* X% v3 C2 N v4 Z) n. F% q5 i/ `. f
//
& U0 _6 x8 ^- R0 X0 h server->upp_channel_a_recv = false;//( |0 N% a8 f0 W
8 _7 z* @# W* ?, Y+ Z
server_msg_send(server, APP_CMD_LOG, "upp recv: success");" }; V' Y3 ?& n6 |* z
}
8 n9 P% u* z) J4 u- `) t6 d( C4 w }
5 x" a( ~% U& g; X4 g- E2 z8 {- D* X, O6 T
5 @# L. L( s+ Q; |0 P, n
return true;( B( r3 i8 y: h7 x
}
' f1 [5 Q" \, K1 D$ }/ i
' q- G2 s; p, K" B) P. ]& X! R( ustatic bool server_upp_data_send(Server *server)
$ S" ?' _* _3 m: ?+ T{/ Y: y9 j6 W! R1 i$ B H6 A
if(ListMP_empty(server->upp_send_list_busy) == FALSE){# C* i; z, b, {. m
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
' V$ u" D- H9 m" k3 e unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);7 F# M4 F& o5 S" r) ~) q7 r |' }
char tmp[128] ={0};
* G1 i( }! p; @/ e
" {9 s4 }3 X( W/ l server_msg_send(server, APP_CMD_LOG, "upp send: start");/ e8 @* n2 ?2 n* M9 t3 M Z
print_log(server, data, 64);) Y% c y) p' A% W9 [
1 `8 H2 ^/ O" }4 T9 o( G; l
//
; N8 Y& k& Q4 F& w, ?" j memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
/ r0 N; ^, w& }5 ? memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);& ]# H8 U+ F* Q: ^" B
print_log(server, upp_buffer_b, 64);
# e* q3 w1 R9 H+ I4 T6 A! U1 N9 T5 A# n1 U
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);/ R" W( Z. [1 j4 L# W
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ! e1 J9 x e6 z8 X/ ]" K- a; h
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
( e" ~5 P+ j* {4 c server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
8 Z8 m- T0 F' ]4 a7 M8 ^3 m. k5 `: j/ q
memset(tmp, 0, sizeof(tmp));
# Y$ |( X# A, g+ ^& U. l b sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 8 ]1 O! K( x0 I
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);1 e% i& {# e T
server_msg_send(server, APP_CMD_LOG, tmp);
* p2 q5 P" q: F8 w+ F; y4 p. Y/ N& j; j' d% P" D! W
upp_error_count = 0;
1 b3 X2 j. P6 M F" k# D" k& U. m# V' Y. C upp_dmaq_int_cut = 0;
$ T4 G0 s& `" [6 O' Y5 { // fill in data 9 @9 l0 E- X: Y* i
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
* T& R3 ?8 B" u server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
4 E" E3 Q4 d& E( J# X; y$ y
; Z9 s: i' G0 z, l5 _7 H) N0 ^ // wait send success
9 b- J) ~: C' [5 C while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
4 R: z# |" R1 z! N* ~: _$ ^' l$ l& m- V( Y0 J, J, l1 A
// make data node in free list
9 R2 N) |) C/ f# k ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
) L+ c' r5 d# O5 Q; B9 o server_msg_send(server, APP_CMD_LOG, "upp send: success");
7 G! z9 ?8 b8 d* ^$ H }
, h$ f% X1 P; f4 m/ g3 o5 B# V* @ return true;2 d0 U$ R. G# j
}. O+ @( A6 ^8 {5 d# S% o% Z5 A
" a! p$ Y' m8 D0 W- [% s
" o$ T/ \5 g0 U. U7 _8 R% h: C
. v+ I8 x! z3 e9 x, p$ Y9 }! h
0 r4 z- s) l k3 z$ y& W2 W# ?
% e; ^! R3 M: \: C6 d |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|