|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ; b, J B$ L; {, X! b
% J% `5 E' x/ y问题描述:2 e& g1 r! J7 x) E+ D
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
O [& {5 C' J) T+ I
* \: S& [- {; U$ k2 _8 M图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
! {1 x7 W# N+ l, l
( r' \, U$ m- j$ X4 g测试结果如下:
% D1 K8 F3 j9 D4 v, d8 \3 g138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
/ n K! @) \4 I- X2 C
# J( O7 N+ e2 y. r2 K
$ h8 z/ J. E0 `$ J$ l备注:
/ q# C5 m: ~% N) v1 J4 |- D1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
% B% ^2 n2 G2 u9 T2、相关代码如下:1 O( |4 p, z3 e( e. A
//UPP DMA缓冲大小512字节
6 [( S9 @5 K/ o0 b- C#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
; d" L$ F1 N; @$ K8 F4 W#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT3 w7 o& V: a' v& M6 R+ a+ C2 q
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
6 [* p" a0 o: k- ]- O
! @( o( C: d: ]" R+ K6 W- {, c) w$ I& k9 R9 x5 c2 R& G9 G
//upp接收、发送buffer
: b* B1 U& ~9 J! v#pragma DATA_ALIGN(upp_buffer_a, 8)
: s, i1 e/ F+ [9 x6 W9 z( e#pragma DATA_ALIGN(upp_buffer_b, 8)
* P5 @9 F/ C5 T0 y# |$ _: }) C3 }' t4 F. M" B3 |+ ^/ ~9 y1 N& ?
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
' [6 \4 o# Q. Y' gunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];9 `; [/ \6 H6 f6 W) f6 m J
& J/ v- y1 q" M; h. X
x& Y" u) [: @6 E" v8 Z6 l1 Tstatic bool server_upp_data_recv(Server *server) % o; Y' u8 {1 l* U
{8 Z5 M! n9 Y) ^: G+ v
if(server->upp_channel_a_recv == false) {
4 A p$ u3 m* x @2 q server_msg_send(server, APP_CMD_LOG, "upp recv: start");- W. u5 H8 T Z7 o# R( q
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
" j7 s a. @2 |" B, N0 k* R server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
8 X! y! R9 E5 Y9 f% B- \( C
5 B. L, Y @$ |# \( }# u8 g3 K ]5 _8 Z1 M& r E. T
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);6 m2 v9 y1 q3 H
( H9 g# h5 J1 `. A9 e server->upp_channel_a_recv = true;//
- G6 [7 r" {" P. U0 j/ X server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);6 }2 t6 ~# G' ~7 R. M' I' d. J
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;3 F" I8 I- f. _
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT; v2 ~" Y/ T0 }
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//1 v/ W/ W. U3 Z. _; d6 \6 p
/ c: e5 } f6 z, }! |; r" Q& ~0 u. w
upp_error_count = 0;
, [ m6 Y0 }) U5 n; w9 H upp_dmai_int_cut = 0;
) o* D4 I7 C% L4 p+ x: H; ]1 e4 D( w! R( w8 k; ?
// fill in data # R% _$ `- K0 g L x! E
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
9 M* q* L; L: I# f7 z a, v server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");/ \+ X; L5 \7 E5 P% G
}
" F& C2 b, g. H' r$ B( C }
* N o! W4 Q6 A$ V; t! v else{
8 f# x |. u3 T# X6 a K if (upp_dmai_int_cut > 0){! k( R; `# m. C. t
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
, e; ?( y. c$ J7 u Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
9 W) E% y& R0 u' X& z, \6 c* u
2 w+ U `+ @% M7 @: P
& i N% Z+ @) c1 F) o% w* T! S( g //copy data to upp_recv_list_busy9 D; ~5 V+ x$ |1 S1 v& o* u
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
3 ~8 ^! L% j2 t k9 v
) S$ p" _ z. p7 s7 h# k- b1 b //* Q' M9 \, A, T. l! A0 a4 } i. Z
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
- E. @' y* B) @- E1 K5 r% ~; \3 O$ H5 w6 N r0 C
//
2 v1 }7 p5 {/ p r$ L$ G server->upp_channel_a_recv = false;//
, h% _" F1 _) m% ^& k0 `8 r! |1 X$ [5 v8 j; c+ Z
server_msg_send(server, APP_CMD_LOG, "upp recv: success");) ^* p5 w8 L8 e7 S7 q- u
}
6 r7 \6 d# S- Y }9 b* g6 v$ F) w6 @
* @& h/ g+ [* r! z% w
% w. q' ]( l7 n8 }- R6 L; c return true;# [2 H. Y X5 Q' P- ?+ o+ b- p
}
X3 p) ?0 ?9 k' F
, I3 r' w$ \* Mstatic bool server_upp_data_send(Server *server)! u: G8 M- \1 o0 L: U4 T+ p" }
{$ a$ u6 [7 q7 K4 e! e5 M
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
4 q! w* B! J- {2 |" [' w DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
6 K9 D0 L' L2 H; _3 ` unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
2 K* }* B. r2 v char tmp[128] ={0};0 d- p" O6 L# t$ z7 m* W+ |6 k
# t6 H3 A- N+ B$ S0 i server_msg_send(server, APP_CMD_LOG, "upp send: start");
* } B$ _" a6 K0 g% ]: a | print_log(server, data, 64);
/ w: T. f9 Q9 a+ J$ p' u/ B' ~" B4 C4 y( V7 \ r( h
//" G2 @5 D% G( G* c: H
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
. ^+ _: W+ V* x7 T2 C- r+ O memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
; h% M0 P, h0 w5 y1 G2 P print_log(server, upp_buffer_b, 64);. l3 B- w% ~/ p; F" M# S
' K6 @ u: P2 \0 v7 V
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
" k3 E7 j* w( O g server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
# Z2 S3 E H. W: \" J- }6 t server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
" ^ R1 A5 C0 j( K! v" G server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
6 [4 t1 G% K4 b# v
1 z( w2 w6 L: ^" _ memset(tmp, 0, sizeof(tmp));
5 @' o% j8 X. `: w3 e+ X sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
3 b- U9 E: _1 k/ O/ L+ U sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
8 y/ R* D: }% d g5 e* x- Z server_msg_send(server, APP_CMD_LOG, tmp);9 @9 k W8 \$ f1 R; O: _
5 |9 v: T T) |( o. ]. @8 c/ e
upp_error_count = 0;( f0 ^; \( g6 w$ P/ y- `
upp_dmaq_int_cut = 0;
" ]- N' h: K" \7 [8 S // fill in data
9 i, w, }4 O! o, t6 J. d+ e uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 5 A4 F3 g# ~7 n. \) s. F" n2 A( z0 V% y! i
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
" S1 I+ @! a1 o% p9 I; f5 f- |
// wait send success
. e0 k \ n' D! M: H" A3 a while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
; a% S: _9 S( K* x0 r- o; {" |& ]$ [7 l: s
// make data node in free list ) O9 a! O. R3 n$ p6 f& t8 p: J
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);' Y; n1 ^6 [ A2 Q% T4 U
server_msg_send(server, APP_CMD_LOG, "upp send: success");
' `% X& Q1 E* M' I }
4 ]# k9 r1 a& d: y. t# r return true;% X( B- ~) p7 F. z! A
}
' Q- u: u2 l% u) i$ J, x
9 i- g6 A0 ]. w, w2 ~* o2 }$ B7 l
7 Q! U* W. l% P
! U& Z- l+ j9 z' I. N3 n' ]! X
N9 B# L f& ^$ Q( i8 K: P- B3 }9 m" p! u" C6 E
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|