|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 Y1 r. d3 h5 J! o, M1 Z* y) X' m6 O
& X. B( y8 ~$ p) r$ Z问题描述:0 _( E7 q. l( S# q
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:" O8 s9 S- ^* B- U$ N2 `
( b* n' ~0 o1 C& _
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
, z' g$ Y- u! h. ^ @# R: ~# F) V5 q, {% Q t1 S
测试结果如下:
l3 a$ i& Y" q& \( [8 R4 D138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?/ q) L4 f3 S/ W+ H( v" I" ~
& B6 `0 S5 m: J9 l$ u
2 `( P7 e- `5 N5 L" D3 i3 T5 q备注:
' T9 g* N7 m# p6 Q3 e1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
& J* I& c' ^" q5 Y- a2、相关代码如下:
$ Q- s; A2 o, _0 d0 Z7 P- ?( d//UPP DMA缓冲大小512字节/ f) B4 P) ]. n& h! G+ t
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
& N. [- d! m& W; c% t. y# }#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
' P" C. {& }) a/ q" C' g' C, w#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
& o& F) |1 K2 d0 [# [9 }% j, r4 _5 s9 G& O. M6 l, R& K
A$ x2 U+ l, ^/ {1 P
//upp接收、发送buffer
8 B2 n. K1 R- m#pragma DATA_ALIGN(upp_buffer_a, 8)
3 t* B/ v$ k( d+ @+ v#pragma DATA_ALIGN(upp_buffer_b, 8)- z) S- w2 U9 a" k
5 l* f- j4 C0 T% M3 O
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
( u& m4 l# u/ z, w" B2 g6 h& Funsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
% \; \* S1 @' M% {& L4 c( b& S8 M
8 r8 ^& _6 \1 u! e" F; A# y1 s
; \) q4 @: t# m- Ostatic bool server_upp_data_recv(Server *server) 5 t, i( S! F6 N" Q# o" ], ~ p: D
{$ ]5 }% Z# C2 j/ I$ i) f
if(server->upp_channel_a_recv == false) {
. _1 m( z8 \ s+ g0 \; c, c. J9 l2 T server_msg_send(server, APP_CMD_LOG, "upp recv: start");$ J- |; h* Z& C- X d Q/ p3 X( E
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
" p" s! u% T& g# q+ D! x' {1 R, Y0 _ server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
; `' w c. I( d/ ^! T7 P
( V1 G5 j/ ?( M1 x7 {5 h
^9 p( A% A) [) T memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
* K5 B `* K- s% ]
) S5 g& }5 D( I2 h server->upp_channel_a_recv = true;//" J6 W, P E+ }( }8 N* M3 }1 D
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);( I0 b, P0 y, Y$ x
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
2 c7 F6 f U0 ^4 n server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
4 U% D* P$ n( o& Y+ [ server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
4 T1 ^. n0 z+ K5 c' L
0 z3 ]3 p0 M) {3 P6 `' { upp_error_count = 0;5 l, T0 f) i9 p' d8 @, {
upp_dmai_int_cut = 0;
. [5 f# S! K8 v6 J& t
; i% W5 t( s% |! u1 e // fill in data / j" ]) n$ q+ t: N7 h( D
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);) J. ~5 @( t" G3 f: ^
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");1 u3 O6 _, ` p) q/ u' R
}
" N/ L- O2 F ^& N: k4 { }6 v( \: ^- ]0 F+ Q1 h, w$ @$ f: z
else{
$ M/ l( S* D9 b if (upp_dmai_int_cut > 0){" n' P: S3 {+ [
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);% C o8 Z7 X9 _, T
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);4 B8 Z3 q! J/ T3 A$ d% _$ }
( [/ m; V: V) z8 k# D' I- \4 ?7 ]
( P" A% I5 v3 y7 E //copy data to upp_recv_list_busy
; i; K' x! S* o' B7 r. s memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);" g) J) w$ O% N; j* ?0 R) q
7 l+ \& b5 T" z1 B3 o& Q //! _/ D& Z' X6 [# P( {
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
9 U8 y7 I: T& t/ x
% R7 x7 ~0 H1 w. c( [ //) I4 O+ d( b; t! Y+ p* m
server->upp_channel_a_recv = false;/// g1 w* {0 D7 U8 @ ?' C
' [# c# z( H/ [% D$ p! q! h
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
. G. M; p; o+ c8 ^- s# W }: y& U+ X: {' B6 \3 ~8 P1 t6 C
}" s3 ^; ^2 ?2 S( `: E9 S& r
) r# p' h" b) z( j2 s, N
/ z3 k0 r& W( q6 Q% S
return true;/ n4 { ?5 c, z+ |: l# n7 w( W
}2 s# i, R+ i" c0 o1 I. H. `: b) R
a6 ~5 J" P+ V( X8 X( V) y
static bool server_upp_data_send(Server *server)
q* U" m/ I7 e: B{
' b! j3 k5 H4 z( p if(ListMP_empty(server->upp_send_list_busy) == FALSE){2 G( N4 u9 ?, [1 Z8 R4 P" c5 p
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);2 _, r2 \* T$ J [5 K
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
" |: z+ ~' }) M8 }' u char tmp[128] ={0};
3 U3 Z' |6 N7 Z( E2 ^1 Y0 g4 |1 k: X" s ~9 q
server_msg_send(server, APP_CMD_LOG, "upp send: start");
2 L6 S8 J9 M$ D4 ]. c2 ]- w print_log(server, data, 64);5 E8 |( v" {- h1 b3 A+ @ W
" C3 p% O' i. J, }5 J/ ^ W //8 J2 M; e; m3 m# C2 k$ `
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);) S' U" [. z+ M* x/ L+ ?
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);! b& x& _/ m2 [- t6 t8 E) n. H
print_log(server, upp_buffer_b, 64);7 o6 I. \" {% |& D; `
2 ~9 I9 b! C3 ^) @/ e& s server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
; m" I7 ]0 r* q z server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
2 m6 X: l+ h; |& L7 C3 f server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
4 T: F5 \5 D0 k k1 v4 H server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
) o- I7 N0 J1 F# W4 `% C
8 \# a+ A0 G4 M* s: n* T9 g memset(tmp, 0, sizeof(tmp));/ N) R- l# R* L6 t- t1 b
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
" g% _ Y; c6 K$ Q sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
8 n* k9 Z: `) r5 b2 L2 v server_msg_send(server, APP_CMD_LOG, tmp);5 b$ f0 G* }, k7 w4 r
8 H; ?! s# f! Q, w, r8 q7 U upp_error_count = 0;
. |' m) d+ n! I5 W* I; k upp_dmaq_int_cut = 0;$ h$ w' D' ~1 r3 M
// fill in data 4 Z* m% c% L! t2 e9 S
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
1 Y, o' |9 \; ^8 [3 u$ a# x; z& w server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");& N& s5 O" [1 A: \
% O7 j2 s& D* z' u) O# ], I! b8 q; ~
// wait send success* B! A/ {- J/ {, b5 Z
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); p' _4 a" J0 D/ m+ O' |
: r$ |9 @# i# A$ L6 B5 C, ~ // make data node in free list
) F1 t0 B2 U' }. p ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);( {1 [7 P3 b% U, f2 E# z' ]8 z
server_msg_send(server, APP_CMD_LOG, "upp send: success");
7 w* B: D5 _0 m' M } h+ b, H. m* d
return true;1 i1 q7 b1 K- u
}3 g7 y1 y4 t( D" w" ^% h$ D
2 Z& _5 p( y) @2 _5 g
( y7 a& Z8 a _5 |* H( W5 w# ^ t% _- B; H1 T3 J |* e: D4 q
9 X' L+ t2 x) e3 ~4 P
- g" g3 w5 F3 R4 F; t; L. f% D
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|