|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 2 \. b5 R4 `6 j7 k7 Z" @( W
0 y" Q0 v" p% x% a/ N3 d* [问题描述:4 a' v8 E& s" V# F" J5 R W) p( s" t
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
( M: E6 G- V: s& v# \+ f' k: @/ M* I$ j$ t
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。9 W- b( {3 A# s6 @1 i! }) C
4 ~4 e6 Q, B0 ^. \) Z& {4 F测试结果如下:
9 ^' S0 W. p- E138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
2 ~! k6 c8 a8 m4 G0 y
- }- _% X* R" \! g5 G+ N# K
" ?9 b! [) R1 d/ D备注:
& B7 P9 f$ }# v1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
1 k% g4 `- `6 J% E A R4 s2、相关代码如下:8 G1 X* L6 L* f) d
//UPP DMA缓冲大小512字节. c! k4 W6 p' L2 o8 K
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
+ p) k- ]4 u1 _. h#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT. ?$ V3 J5 @" v; ~9 r0 X
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
, O# Y* {/ M$ b- z5 ]' Z6 F# N% E1 g- u$ B+ q, O+ ?! E7 F
& x W9 H% @. Q
//upp接收、发送buffer3 [ [4 {! i8 j# N
#pragma DATA_ALIGN(upp_buffer_a, 8)
' d) R7 A6 e. g8 W4 v#pragma DATA_ALIGN(upp_buffer_b, 8)& H$ f- Q7 A z1 e) H/ R4 u
. ^4 G/ k6 d6 q! N( Zunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];* J* R, d: k/ o8 K+ t9 f. Q! d) p
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
{, d+ a" D2 b) M1 F
( p3 m/ G% C3 g+ E% o' O; ^
o' X% @# X7 u2 b: jstatic bool server_upp_data_recv(Server *server)
1 v8 P! ^) F6 ?& A{
6 G3 H; v; n: f* {& V8 I# [8 v! _: W if(server->upp_channel_a_recv == false) {1 f! F. n P& n$ J3 Y( G
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
* N$ ?% `. v5 r7 p" H3 l' b, I if(ListMP_empty(server->upp_recv_list_free) == FALSE) {% T9 k& X0 G" ~# Q0 q# \
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");( F6 {1 l( K. k. P3 q7 c
; S% Z5 R7 w- ?9 l
7 w% Z) x; D9 I memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
1 R/ P0 F- S2 P( p5 T3 j0 W
' j9 I4 I: ]: z' b server->upp_channel_a_recv = true;//; y% A1 Q# @9 o; _( ]
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);1 M5 g, t: w# }. _8 j
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;' O) W+ n+ l3 ]- z8 p: K
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;3 A- a, q- y C9 @+ S/ p8 V
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
2 p: C/ B5 z4 P! T# q$ r* T$ @2 t
! c! a. C3 s6 C, q3 R1 D upp_error_count = 0;
4 ^; \' s, q7 B/ I- z, ~( d! y upp_dmai_int_cut = 0;
6 @. v3 v5 _7 r* c$ j/ v. X* c4 M: ^7 E
// fill in data
- P2 j$ U4 r% l4 v uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);1 e: l4 }% m' C5 F2 j
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");: C2 v6 w1 d7 N/ z" k, `; s
}
# X; Y; q* s4 n* i }
2 q- ~- G$ C: x) P5 a else{! X$ S1 L1 P+ A( `; c; d; S
if (upp_dmai_int_cut > 0){
1 W2 p5 ^% ?. B* S3 W" N/ f5 J DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);( g e4 o3 s1 w. C) l9 c* K* p! k- a
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);% w2 y& v. A' |3 q; A' H8 q* `
0 _" l1 F: p1 O$ i- D7 f1 H* S
2 ]( U" |* U( M, G: v2 J4 k+ a( ]* e
//copy data to upp_recv_list_busy4 ^$ ]3 }8 _' X, B" P
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
! B) x4 E6 v, L3 B# \$ w/ P) J N6 T$ l6 W5 ^6 Y: B* H: I1 ~% G
//
0 ]+ a# A V& x ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);/ r* v) A# i( R% ]7 {
H. q$ j% I( K
//2 n7 }. L% d: i) o. {* y
server->upp_channel_a_recv = false;//
. j; M- S" F7 M3 o8 U+ D/ ?
+ C8 c8 [) G& t5 ?9 ]0 C5 q9 }$ R server_msg_send(server, APP_CMD_LOG, "upp recv: success");1 ^! H0 U6 I7 ~
}
+ a5 ^) E5 q! T9 d) R0 J }
) l- Q7 d j; I0 b2 }1 D* R1 o/ I L
, R1 K0 v, D- X6 y return true;$ Y. q3 y; L2 ?; c
}0 ^* l/ y, ]. m, \
- @) M% {; U- U/ s2 h! N2 Y6 i
static bool server_upp_data_send(Server *server)
! I0 c9 C. h- b# i{# Q0 ~! b& }$ P: z% u _0 s3 l# h
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
$ C3 N+ `" A- ^! A+ z1 w- Q* Q DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
- T+ T* S6 i* h* ^5 P" G unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
( A- p+ O' h: I0 I char tmp[128] ={0};
" y. d) u4 a7 C9 P' Q3 t/ b9 {& b- {$ l
server_msg_send(server, APP_CMD_LOG, "upp send: start");5 V* q9 m; ~: ]8 Q
print_log(server, data, 64);
% C' E' d P+ _6 F8 E( t3 t2 f, @ [5 p, {' @7 b3 I: b
//0 z4 t3 o" R8 n/ X' b4 e; C2 b* D
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
% I' i( T/ j0 d1 o0 P% j* |" H8 l8 t) N memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);5 ]7 y" s- b1 O+ x2 Y; o: b" S
print_log(server, upp_buffer_b, 64);
* x; \, ?4 t4 B2 c! K3 J* P2 }4 g6 x5 ^" {8 X2 u1 X
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);( }) x5 M( S" R ~. r( ^' h
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; # e( L6 N) |6 T; B9 ~$ @
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;# I8 \+ ?8 v! W/ s9 i
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;# \. ?# K5 j* ]
8 y0 i: M; a+ v7 K& p9 N' n+ z
memset(tmp, 0, sizeof(tmp));7 h, Q" l8 G ~/ s8 }9 g3 ?8 C
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
; O$ }# I+ V3 y" |; g6 s sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);& }! L. K) f4 k5 C2 o4 [( k" z. {
server_msg_send(server, APP_CMD_LOG, tmp);
$ M1 B0 p! t0 e Q# _5 R. w
) `* n* x7 s; K4 a upp_error_count = 0;- c, d, R! J/ S2 b
upp_dmaq_int_cut = 0;1 J2 e) r! Q {1 u
// fill in data
& I" g$ B' R/ W5 d6 A& J uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
$ m2 o6 [0 W( g/ q- w9 Y n server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
/ S4 C! {0 Z/ I$ D5 Y0 g; b0 F4 m; M- A3 C3 [
// wait send success
( l6 F" o( x# d& V while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 9 [+ O2 _: s9 M6 x
. c3 m+ N4 z6 I; D // make data node in free list - F W7 M- U, \( ]# a5 ]+ K
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);1 f; N, U% N+ n2 E6 ^. l
server_msg_send(server, APP_CMD_LOG, "upp send: success");
7 P: [- O$ u* ]* [ }& [/ k8 N6 ]9 |0 S$ b0 m; c" I
return true;
! X E* p3 U, S8 E& W! A}
$ d' s% P+ o+ r" P( @9 Y! F% z7 g# E+ Y& r: Y
) U8 l: F0 B! d$ a7 u
7 b5 I+ s- `) M1 y
! b6 G0 V( F8 p* V
" M, ~5 v$ y4 b$ T* h |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|