|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ) Y% |5 _9 h& u W4 `5 L
! S, O2 E5 Y) R0 Z! K
问题描述:8 b% T' ^) e2 \ A& P
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:" U0 y/ F( Y M
! I6 C% G* E/ x图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
% y# w9 H! f2 @/ V4 b. b; P2 c9 j3 F9 I. c
测试结果如下:2 F' Q; A3 y# N5 L
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
, g4 y7 v) Q) Y- r+ _% `2 ]9 S# _1 B3 ]# i# j8 ^" d
2 m' U# T5 C5 ~3 g% T4 n+ v9 G备注:% K# |# L3 V+ {4 o6 _7 F$ l ~
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?" E* L: G7 A: g$ ]* I. o
2、相关代码如下:
$ R. B0 N7 X3 l% P, O7 s//UPP DMA缓冲大小512字节( A' O5 H" ^! e7 E' W7 ^
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍6 s8 G5 d1 a& s2 t& J9 w3 f
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
: W3 B! ?) v f0 ^: Q% I* O#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)! G* R$ I: V/ A' A7 s _
) c0 A4 x9 H4 _+ C7 @
: z- g% i& K f% Q9 i `//upp接收、发送buffer8 l- }; U8 ?5 N0 ` f5 u
#pragma DATA_ALIGN(upp_buffer_a, 8)
% U4 d/ w0 j# F6 z$ N#pragma DATA_ALIGN(upp_buffer_b, 8)
: C4 p6 B7 w, b0 I. m3 g/ W! m6 s; W3 M4 n
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
+ [7 i1 _9 O% b" Zunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
+ J+ h+ ?( q0 I' m6 F
6 B$ s% u) L5 ^) i! \$ U7 `% W' P) H. w' r* l) w! n
static bool server_upp_data_recv(Server *server)
2 H7 H0 e9 ]; B+ w9 r- n{
6 A) t6 ^! \1 h* [/ N4 F if(server->upp_channel_a_recv == false) {
4 V9 r+ o4 y+ R0 S% E$ W1 s( Q server_msg_send(server, APP_CMD_LOG, "upp recv: start");
5 m3 g6 S4 Q q if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
& c+ A$ F! }$ b, v2 g4 U server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
# }1 E/ U# \; _; m5 X! `2 j# I0 w- m$ Q" D+ p* M
1 K& `. i9 b9 y5 ^2 w; [$ ~ memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);9 `! A: l+ ~7 h5 S4 q) q
1 B& j: i A" @! s5 o4 l/ ^* ^1 V/ G
server->upp_channel_a_recv = true;//7 I; p9 L7 o) [+ @% d$ e) X n
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
: i% U8 \ w) u server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
( }3 D* g+ m" O% ]$ m5 q server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
, @+ `( i! D9 m' @9 S% i server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
" p/ L+ Y' Y$ l8 @/ t4 m
0 |; @4 ?" X' c7 r$ G upp_error_count = 0;, x/ c% h' A; N1 W. \7 ^
upp_dmai_int_cut = 0;
p: Z( g3 ^( g8 B* ]. {
% V1 P& J# k9 g5 t" K // fill in data
; S" B( N- z4 v( _ uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
, u' S/ L6 ^. Y2 [( ?# ^% n7 Y server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");" \6 ~; H6 o' t+ B
}
, p2 w6 ^/ f$ p; |: n2 n1 D4 w( ?* ~ }% ?/ [4 x, p. J% B
else{3 N* k9 }" p* o, [0 h6 g
if (upp_dmai_int_cut > 0){# D/ c3 o; a- _% P# k$ u/ P0 f
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);" P# z/ m! |: H7 l7 D
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);( a: e M' F# J! _7 R: j
/ M. ?, k1 f& \& p! Q. j1 x
; E9 A, k; J- N9 f* k //copy data to upp_recv_list_busy
: {4 d; o. _- T memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);) `6 I( i2 M' g9 n' @. S* @4 Y! ~# j+ w
; N2 J3 e# j2 @* C6 E* h% A
//6 t% z: l) `5 X! I+ c2 H, ^" V
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
" w/ s9 E1 I, U( W% j5 g4 }6 M" x* \' _, }5 ^
// a" Y1 ]- O) m8 h6 u7 X
server->upp_channel_a_recv = false;//& f _9 Z) P- ]1 }0 J5 {
2 Q; w4 w3 D7 ?5 S/ K/ f4 L
server_msg_send(server, APP_CMD_LOG, "upp recv: success");& \4 {! L+ y8 y. E( i
}8 J8 }- M! H3 O: X/ N
}; ?( b. E: H5 P+ h* Y
7 V: E$ a) _5 W" `- |
9 ~) G& U! h# ?6 w$ D+ m z return true;: _* n9 G5 |" V/ X5 B! V, f4 j: Y) h
}8 k) O' F# ~. h/ y& w
' t @ G4 d" N
static bool server_upp_data_send(Server *server)
/ t1 S* f( q; N: s+ L, k0 T{" r' Y* u9 b* c1 p b% A
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
0 h+ I1 m* m7 N+ ~3 @ D6 z, J( P# L8 f DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);3 c- a, r9 u2 z
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
3 J! T+ M0 [% S2 }* m5 j char tmp[128] ={0};. r/ k7 v, o1 t
( M( m0 X8 S' [0 C B6 Z" n+ }0 f server_msg_send(server, APP_CMD_LOG, "upp send: start");% U6 H- o" T- @, Y3 e& B1 J
print_log(server, data, 64);6 I/ n3 j' s& @/ J. }5 ^
. ?5 L' }0 K" ]2 K2 q /// s( E% D' m9 `1 ?; A: `
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);% w8 I! ~! l0 s9 \
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
% `8 a4 Q- B' \ print_log(server, upp_buffer_b, 64);
. e3 `$ q$ k% R' {7 H7 C" ?5 J, R' P! b
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);) W d3 E$ m: e' U
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; : `9 M, v( I; i8 @/ q' W- \
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;( y: w1 Z% L6 ?# `1 i$ R7 J# z
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
% v: ?0 m, D8 c; ~ m. J* J( |. ` U0 e& D% G1 z
memset(tmp, 0, sizeof(tmp));) e* c2 S: w+ J- I
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", " _# o7 j9 g: ?1 h/ Q
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
3 Y! J9 |" o- @: ~6 Y server_msg_send(server, APP_CMD_LOG, tmp);: x% M" z p( ?& l3 j: ^" D1 T( ^
: V5 f/ t" Z' n' E upp_error_count = 0;
h4 ~' S: V% l* ` upp_dmaq_int_cut = 0;: l# J$ O! ]( p: {6 P, i- _% I
// fill in data
- {8 D/ W, I8 j! g uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ) |. s i7 V8 A
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");) W; H$ f" D/ R# H3 |
( Q- F5 o1 o- U' X# n // wait send success
) p! l" U& z! I1 r C& g; C while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
/ \+ g! ?, {* w6 ^- V" R8 o' J! ^; ]
, O3 }* ?8 e) x' [% [% N& d2 ` // make data node in free list
8 k# X. h* A5 q9 x$ l( J ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);2 a: ?2 k# k* @7 k+ N3 k! O
server_msg_send(server, APP_CMD_LOG, "upp send: success");* J' t/ V! R9 _% N* Z
}4 ]& n) Z, }( ^ E8 q+ C( a+ y. t
return true;
# E- s4 R8 j5 B g6 S1 @( s9 w1 ]! M}, A" B- z4 R3 ` p `3 h3 f
& O! h m. ~: G0 u- |$ ^" W4 n
0 {+ K2 W! P* C: j5 e C
8 ?; d" b5 l( n2 ^- ]. C; w1 e
6 B Y: J" \$ i+ @$ R- t2 X% X6 s
9 Q* l1 {9 A1 [
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|