|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 9 e: v# k/ y3 t
4 ~$ e' u4 x! y3 `5 a问题描述:
; R$ q d9 j9 G4 D+ g: \在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:( z' T* ? T6 M% }
' T2 U' w; P& Q3 S! J; m1 f3 X图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。- ]( [0 k& }, ?1 c' f9 g
7 `2 |* b) p9 @* Z: n9 h% q测试结果如下:7 a6 W; d/ N( y5 r- l F" o
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
7 @0 W) ?) I; H1 ^2 {; L6 i( h7 |; C& J+ I8 F, j
1 W( `' n. C) I. V" @5 D
备注:/ n% r, ?# d9 s" F& t) d
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?! M8 \! k, `# S7 O
2、相关代码如下:1 |. K/ B0 K" K# k* V) W
//UPP DMA缓冲大小512字节
3 t. l( ^" r; n6 M; c' R; C#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍6 J& [ P1 V/ s8 k
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT" z5 Y7 Y5 z% w" Z, m
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)* j1 d# V: y/ Z4 Y5 t a1 P& A0 s
1 @" H" I F W4 ?7 E6 W4 E, z0 @
6 p( n& Z, }4 K& O& e8 w! ]5 x//upp接收、发送buffer
4 {1 K4 g# k% c! O+ _: ~#pragma DATA_ALIGN(upp_buffer_a, 8)
# S/ J% T$ s( h0 `) h$ O1 u#pragma DATA_ALIGN(upp_buffer_b, 8)
; L) E: f6 p* `8 C/ j/ p; {! D- p$ y) E0 m" J
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
' _6 a1 b: ?& i& T' z/ L4 d' eunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];0 _0 Q* ^1 s9 y
4 A) k: z% C8 s2 u3 C. t8 W. F
% A! |' J2 R. k" q9 s `static bool server_upp_data_recv(Server *server)
( r$ c0 r% K; p% ~/ x( X{- R9 O& J1 M3 `. t
if(server->upp_channel_a_recv == false) {
7 \# V3 r! S& }: P. `: v) {5 A) q server_msg_send(server, APP_CMD_LOG, "upp recv: start");
, W, z" L2 f/ X, i if(ListMP_empty(server->upp_recv_list_free) == FALSE) {1 O3 a& `( [% y- @0 j
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");4 {. S4 F% e: `* W( A
5 ^. e* y5 \, ~
* B. B3 @& g! |! c4 w2 ]4 r3 Z6 H( G memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
* E( M6 O E; Y) t6 Q1 }" g
5 h3 m3 m2 i: ^1 o server->upp_channel_a_recv = true;//, U$ e0 Z' K/ u. g5 g
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);! k% b* }& I) |
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;4 Z% N+ K6 B( `% Y
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
# R) T0 U7 S1 G( H% Q4 P server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
* K# g$ N3 L, d
. }7 x) \4 O% Q# r# ~2 Q upp_error_count = 0;7 F. i* {, p4 T2 k& u
upp_dmai_int_cut = 0;1 f# k7 K2 Q. ]5 V7 B- S
8 a- z% N2 }* h8 I. i% J
// fill in data
2 K" q. q; t+ W3 v0 c$ F uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);- M; A7 o+ [) `6 Z- {& Z6 g1 Y
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
; ]0 N+ a8 p) g; d }# ], w! x3 [, d- H0 i
}5 G& N" b7 B6 Y
else{
% [0 a C& y6 \1 A if (upp_dmai_int_cut > 0){
$ t& k( n( a8 y1 |& c DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
8 i* f3 f) c0 k" \+ t8 g Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
# F1 E9 I; q% i/ u% T
! x9 z( O' t" ]3 W! j; r) n/ s3 N& j) s2 `$ x/ N4 ~
//copy data to upp_recv_list_busy
1 _. n6 v g9 Q' _% [/ R) O* Q! R$ e memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
- z6 t6 }* m- T; W+ Y1 c& U$ v
' r$ ]% a6 U$ d //
6 [2 r+ o# G2 b4 x1 r- ~ ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);. W- ]6 H0 T) k
, g" p( U6 D: M' A2 l1 ]
//
J5 X9 C5 A+ j- ]" D server->upp_channel_a_recv = false;//
0 Y5 Z6 u' M8 p! \
0 m6 e$ G/ m9 U+ [+ l: S7 ` server_msg_send(server, APP_CMD_LOG, "upp recv: success");
) {9 u! a" C2 p; \, ]/ a }
# i/ j3 o' P# F }
& t, L( f7 G: K( D/ L2 O+ H* }0 t4 o9 G
7 N5 W2 g2 l* [/ U return true;0 @. g, z& s! c6 A! B5 u
}2 q. X& e7 o- R
: n: Q' Q# a; l% ?/ ~
static bool server_upp_data_send(Server *server)( n" Y, m( B2 g Y% t2 o+ f
{' W g# b/ w" b) l( m
if(ListMP_empty(server->upp_send_list_busy) == FALSE){6 q( [3 n+ x6 L* g% |1 P
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);+ n+ @( y3 C% B+ J/ H
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);3 ^8 s6 _9 C$ c5 r( `
char tmp[128] ={0};
$ e, \+ b3 {# F- e& s& U
) s. ~1 y2 d4 m' a server_msg_send(server, APP_CMD_LOG, "upp send: start");
$ g' S h7 n1 S7 e; ^ print_log(server, data, 64);
0 K- ?% U2 Y1 |9 P- ~. g0 X5 h
# l/ E8 b4 G* x) p8 v5 ` w |+ E //! A$ v! o( T: I l o% w
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
' s6 N+ a, V" Z# ` U5 S9 r/ ~( n memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE); Y% z" D$ U/ j
print_log(server, upp_buffer_b, 64);5 D. d/ Z$ V! v3 ?5 ]. G
0 Y$ i1 ?+ j# P* J server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);0 _' J4 o/ @& M1 @
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
1 Y0 j- C x M" l' @7 O @3 o server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
/ B+ V7 j9 j! P( |) ]1 r" | server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;4 F X+ I: d; \; y, K+ ?! w
# D% @+ }" ~8 p/ J/ L memset(tmp, 0, sizeof(tmp));$ p- `! f0 d( N |8 f
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ) Z" r- ~0 j4 o, F; x( b1 D
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
6 a7 ?: m* r {/ m6 {9 Q6 v" } server_msg_send(server, APP_CMD_LOG, tmp);
& m+ [' f y9 B. b
$ G/ ~1 e. P" U8 V0 Z7 i3 V8 q9 P upp_error_count = 0;
6 P8 y( x& I6 h! z upp_dmaq_int_cut = 0;
9 t' K' [, a3 l4 u( F [ // fill in data ' h9 L, P4 o& ~9 O" C1 v
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ) h! ~) k1 {4 a! c7 m- K) \
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");# p+ v7 N# b+ R
) r0 Q' q! y3 ^ // wait send success4 h1 @ n, l- B5 w% L
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
' J5 E! Z8 y! |* `
* u$ y, A: j& V( g // make data node in free list
" I" O( O; ~) z4 x ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
) x S: p" z2 b$ k/ `" C$ ^ server_msg_send(server, APP_CMD_LOG, "upp send: success");
6 Q# z+ u$ j& Y3 r$ o/ {3 J/ t }% k# X9 G8 f7 p
return true;3 \: f2 j: |+ M% i5 |
}
0 t4 }$ S$ p+ c+ Y- ^# A
4 l! @# k' O" c* s- q- O# l7 G( I6 ]/ e4 y# E* W$ f+ x
M) l% t, B7 L& I
+ w5 M0 r" \- r( |3 G' X, ~& X- E, C! F" C# g; s0 ^7 I
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|