|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 - u' I8 r5 J7 x( V8 p
1 H; o8 P8 U( x9 s+ a/ r8 ^! _问题描述:
2 L1 ?9 [) G q' j在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
1 g/ c6 r) _( R" X' z/ r, u: s% [ C4 M2 n
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。* [. O: T8 l8 ]: c5 y
% c6 H! `" q" ?! H
测试结果如下:+ t% x, n$ v+ |
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
$ i3 a# R) `: Y( g% a
, x- T5 M7 B) p" k6 P! I: i& m4 m Y3 Z) o* w. G
备注:3 V' c) V3 Q: i6 T* F
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?2 ^% S o) h3 J/ Y$ {6 W4 l" {) G
2、相关代码如下:' y+ D7 B' Q+ Q" P
//UPP DMA缓冲大小512字节/ s m8 d* y% L6 I6 e; z6 I( f
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
; E# }$ G( `, ^% j% |! J#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT* ]1 M, O' {/ [) d; k( `
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
, a$ A6 l9 f9 W" M" u/ b1 r; G2 {# W. r3 `
$ v" W/ j, l. k, v//upp接收、发送buffer
( v: A* T9 B7 H#pragma DATA_ALIGN(upp_buffer_a, 8)2 p7 Z8 ^5 k/ V& X% ?1 @
#pragma DATA_ALIGN(upp_buffer_b, 8)
; M% q" s$ ^+ P/ z; {" D$ A% `; B8 n
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
: y. l2 W9 H: ]) q; L& nunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
5 v6 H9 T: w$ i( G: j) r& I3 N; I& G' ]( d9 _
. W' h" @2 [; s. {/ a
static bool server_upp_data_recv(Server *server)
8 E+ h; u8 S/ J0 q{7 o/ f& y- x! K' x* @
if(server->upp_channel_a_recv == false) {. H# k+ x1 P: T8 \( v4 N% F
server_msg_send(server, APP_CMD_LOG, "upp recv: start");1 M( H2 A2 W+ @( H* F& H0 Q
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
! o a& c/ h% u S8 M server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");6 q% n; u9 X. E9 {" A
6 `* y6 J$ q5 R
1 D' Y) G/ c- V4 s- K4 j5 M2 h
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
: c. s" t# ~( J6 x* K4 s! B7 V3 N& x
" e4 L' U/ ]" k3 i# H server->upp_channel_a_recv = true;//! p$ [* B; `& X+ ]& |+ |
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a); T, x0 x+ d0 P2 {
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
& D7 W2 h" a, A server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;7 ^+ i$ |. e! r9 `$ Y
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//) k; H# {/ i! [: u1 R0 q, _
4 ]7 h$ t5 M7 ~% R' A6 ?
upp_error_count = 0;
0 S0 O4 y. _0 A, a. C6 S2 m( t upp_dmai_int_cut = 0;8 v/ k, F2 U+ a5 W
: k' X: C8 k I3 }1 T( u // fill in data
. L5 C* [9 r6 h- ^ uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);" ~, m1 A8 n( d, Q7 z
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");# d9 Q- X+ u# V- q& s: P: X5 R/ {6 H/ F
}( G2 d# K* v# q/ o$ W5 P; D: \3 B8 H+ N
}$ w* }# ~+ p+ ]3 ~" A0 W
else{
. P; |4 H* J/ X" g if (upp_dmai_int_cut > 0){
+ X4 }3 M# l* O6 T/ P DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
; E3 O, F3 u3 y5 g5 u; \ Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);. x9 ~* h6 S% U" y. I
, _8 S' W5 z2 |* t9 s# z) p5 {
5 |0 Y4 p9 F0 A5 h5 u' D( g& K //copy data to upp_recv_list_busy1 [' T4 I- H6 f0 d3 ^4 E
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
# v" a, k% z$ Q7 P) m) k+ Z0 Z" o5 ~' \
//
- m. f( e9 D6 @4 d1 _/ O ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
; U% A( [9 U! a9 y, j+ I5 a) Q# B
0 F2 _0 g1 j f# P) t //
, C+ c5 i# y+ C! r6 P& l( Q server->upp_channel_a_recv = false;//$ O5 b/ i! I6 S2 J' u. P2 r
; b+ q4 u H1 v( F Q/ M# m! ]# y( K" d
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
$ w$ F0 B" ~& p& ^ }1 j: h' H7 w9 E
}7 _# e& t6 ~: ~/ ~& _7 o
0 C. h7 X8 O% t) |# B( R3 q& I' z5 }- Q: @) g5 e4 u; U
return true;* C3 I6 ]3 t# | v- X
}
0 ^; t3 c) b4 ^" u3 T+ I. D+ m# Z, r. V! {$ [2 L; f# m* V# [; a% g! V/ S
static bool server_upp_data_send(Server *server)
/ j* A2 f. K9 ^/ k{8 X# n, w: [& O
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
- i) W4 Q V/ g% e5 O0 a+ i DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
1 r4 @, T2 `; L. R+ J7 \ unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
) s4 k6 i; E: z; u. T char tmp[128] ={0};
% |# I9 _) Y; k% x
/ G5 h" ?1 c* ^5 b% h: Q server_msg_send(server, APP_CMD_LOG, "upp send: start");
; H/ i" y. F& Q; X print_log(server, data, 64);# G5 T, j% G ^
1 V; ?/ b* F8 p+ c+ W1 M8 }) \7 e
//
1 l% A. S+ f! f* c memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);( k$ {5 y: b/ W5 w4 w4 f {! U# H
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE); C8 a% O8 X s2 k/ L7 b( ~* z
print_log(server, upp_buffer_b, 64);. i; l7 W9 T. f3 x0 \; L
3 d% j6 K+ O& g M2 j
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
7 _$ B3 s: }! l) }; |0 M! ? server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
4 D/ j, b3 l2 m5 f& K! J& W server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
& |' q6 } |7 p0 o server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
' V9 K& h* E9 y7 J5 u1 K% i
6 j: [% L Z. ~1 j/ i memset(tmp, 0, sizeof(tmp));- U5 E) w2 P3 ^6 C
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", . l0 t) M: s6 ~8 ~) N4 k" _0 w
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);4 {2 Z T9 c* R1 U5 d0 ^1 C8 e
server_msg_send(server, APP_CMD_LOG, tmp);6 K3 d0 c3 k. b0 n8 m+ a
8 ~' c2 c" Z% g7 P upp_error_count = 0; Q% p, {- ^9 j0 H/ J" \( J
upp_dmaq_int_cut = 0;& B* m+ W% v, Q
// fill in data
! Q; [2 X2 l9 E, E9 L" v+ M uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); & U3 N2 b8 H2 c/ r$ A
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
+ d" J8 g! `; n- I' H+ X
4 R _& b% g$ f$ ?$ A1 ]3 _! s // wait send success
: n5 [2 ], w' `. l0 ] while (upp_dmaq_int_cut < 1 && upp_error_count == 0); . l3 A4 N& W, Q8 ]% ~5 K- P5 S1 U
; }: B1 o1 @8 [/ R, ^ // make data node in free list S% Q, T& {" D2 b) O
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
; E3 d+ r1 } T2 `% a9 ~1 T5 _5 c server_msg_send(server, APP_CMD_LOG, "upp send: success");
& v6 c% N _! z5 w" p }
/ o5 t1 u$ g, |3 P/ S return true;
. W4 ?9 m' m- P& \& E}
`& s* S5 T* k& V& h
. L/ a# H- _" c2 w9 _( Q; I- z" w8 l2 b7 z( S( C8 @
( K' M! J- l0 Q1 ]1 V) J( I/ b' m6 u4 |; K' U2 {' G( h! h
7 M6 _& W2 E6 }7 F! k
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|