|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
$ |1 b1 V* b4 j) c: e- Q% d) J7 V+ |+ f. x a# I3 Y6 j4 x: \. [' X- R
问题描述:
( `! j8 i& N& r9 i+ a w4 {- X9 n7 U在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
e# b; V, S' g1 J; {9 W m% X( c
0 \" r& W" w8 U4 n, X& K7 B) `图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。" E9 x# [5 i8 n) u* B
0 A$ i1 C0 e& x" R Q" R# Q测试结果如下:
I/ ^5 Q+ ] n6 c' r, D- H5 N% S: |138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
$ C1 h1 l% w. O$ W1 x" D" F3 S8 |# c+ R L+ ]2 m7 A; N; A
, V: M/ H0 c. |备注:9 Z6 N' Y' j" k: L2 y# t) L' i
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
5 [6 F4 p* `8 A4 ?! G' |9 p( m# Z2、相关代码如下:( F+ u6 z$ Q* u: m& m0 g$ a
//UPP DMA缓冲大小512字节3 s |: e( {8 W% [! [* q3 Z# c
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
+ k2 X( m6 \: @& d0 V9 s#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT" r& ?/ h0 S. N6 _9 P
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
+ @5 S$ L9 D0 _6 B8 G4 S' l
; R8 k. P9 d* E* ~8 K% d0 I+ F6 b; x9 J* V- H
//upp接收、发送buffer& }7 C0 u9 _. \( q
#pragma DATA_ALIGN(upp_buffer_a, 8)
0 U$ K p& a0 q, \( x#pragma DATA_ALIGN(upp_buffer_b, 8). |9 ~+ X5 k0 ]
- H) S7 L: t) y* junsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];% Q" B" e( G0 w& ^8 k/ J5 B0 T- `
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];3 v3 @. [8 T7 x* ~9 g
; f. B2 |7 {3 G. I1 s
- a5 n2 T! P% H& f0 Z; k/ T& c
static bool server_upp_data_recv(Server *server) ; N: o4 E; ~8 K s. t7 O% S
{$ o" A( L# U c+ R
if(server->upp_channel_a_recv == false) {
' J% _( }; b M7 o2 n, } server_msg_send(server, APP_CMD_LOG, "upp recv: start");5 g8 ?9 e, j) N3 z, [
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {: ]4 N1 s# X) w, A2 V; k
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");: o/ i, s% p |# Z. [
4 k+ n ]/ K/ K
1 A8 L2 N5 w6 t+ K, b. D9 {/ P memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE); _1 p5 h9 J: j- f- I
$ ?$ _7 G- O3 ~; H* f9 } server->upp_channel_a_recv = true;//: A3 p: f7 Y5 {( W8 B6 m3 G
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);3 J& ?8 d0 M5 o8 y( U
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;: p# U( ^ D4 u* p! P" p& [2 I
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;7 c2 I% Q% X' W0 t# s( z
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
. A0 H. U$ n: I7 j& Q6 w
0 G6 B r# W0 z" l& N upp_error_count = 0;6 e# e: C4 l' M- V
upp_dmai_int_cut = 0;3 J' K K: ^( W5 \
0 l& P% b7 M9 ?6 a; M // fill in data
6 U9 `) M/ O' Q( i* R S uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);( c# z$ z1 F" G4 B+ g0 e
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");/ ]& \( k8 P ~' d
}
' m; h+ i5 l0 w. @5 U1 p }$ z. s2 m5 v8 R
else{
" I, c: @2 T" `8 I2 {7 ` if (upp_dmai_int_cut > 0){
& \# H+ ]- s0 ^: A2 Q% @1 ~1 f DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
/ W' O2 Z7 g( o/ D0 |# w Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);# X- g! c6 s( `" w4 b% V- r
3 g, H0 c- y8 h: f
! u0 E7 `/ Z; w5 r$ p' x) G! x$ H, S2 A //copy data to upp_recv_list_busy
1 b% z" A+ i `8 a/ m! v/ A memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);7 I4 S6 e9 S: Y8 H
! L B# ]1 t) M; q. S9 L4 H //
9 { `) l& f1 Z. A ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
1 {4 Y- S, s+ \- G" |- M2 V
: R- {4 r4 X0 r: a //1 S! u0 b% u4 x% [
server->upp_channel_a_recv = false;//
0 Q4 a3 s! a+ }* d, i! x4 @( [0 D9 I( K# e# e; {- s0 W6 y6 q
server_msg_send(server, APP_CMD_LOG, "upp recv: success");9 K" W* S6 z% j1 e
}
^! `! m1 ]% S5 S& G0 ^+ _ }
" z2 \; Y7 j( b0 v1 a8 Y; C' Z- V. @! u- ^3 h6 R
2 h# N4 Q! g& y9 B return true;0 P1 ?4 J# k$ g2 z2 S
}
) D: {) W' ]% |6 B0 X4 b% D2 _ k' x8 m: v
static bool server_upp_data_send(Server *server)6 |" Q$ Z0 y! d7 x, h
{
2 V2 F/ `, P5 }4 t% b; Y if(ListMP_empty(server->upp_send_list_busy) == FALSE){) ^- t M6 F: g/ C
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
* z( V& n0 U' k unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
% C5 J7 T9 r2 X' U1 x char tmp[128] ={0};
) @' G7 C; U/ ]
1 R& T) _2 s; b/ l5 L$ F# @7 T" y C3 w server_msg_send(server, APP_CMD_LOG, "upp send: start");9 u# w9 e: q* x/ L- r
print_log(server, data, 64);
- O7 r) \: y: @3 F N7 ?6 q% k1 R! I1 \
//
" @* S2 L3 h; w/ g( y memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
0 F* }) C/ W8 ~4 z memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);$ }+ Q3 y5 J( W
print_log(server, upp_buffer_b, 64);
; F/ k4 M' C! Y9 [2 I. t8 ?( U. y3 r4 q3 B. c" w! x: _# {6 U7 k' o- x
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
4 i3 ^! j6 r3 [1 h/ I server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ) k, t5 \/ _; C- o P4 c3 _
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
2 Y0 H% f8 t) I0 Z server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
1 E- u6 |& I# u7 t: ]( T) y) O2 [7 u2 E- J5 T% R; r/ u
memset(tmp, 0, sizeof(tmp));& p: l+ v4 y( |
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
, g* B0 l+ {; d* D d sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
2 p- n! L, x! w' J X* }4 ~ server_msg_send(server, APP_CMD_LOG, tmp);
5 e7 d& t: K& r* ` }* C4 y
) S4 a. p' h* g' c r1 e7 _ upp_error_count = 0;
a. ^+ e* V( _. {3 v; L upp_dmaq_int_cut = 0;: ]- W( ~/ c: p& Q9 S& F7 B9 D( B* |
// fill in data
8 b3 G/ t% r1 q* K6 V uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
! `; F1 i2 I6 g! p server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
' J0 e( z+ N2 s* s9 j+ b! b, \+ h' r. m; Y' f. _; P$ z
// wait send success
8 x6 w' u0 h0 e7 ~4 B: B5 m; K while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
5 V6 ?& h( d( a+ A2 |, f( Y5 u g4 v I9 u0 b
// make data node in free list 7 f; ~& W: v2 j, Y# f
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);$ o! W" q! F% V
server_msg_send(server, APP_CMD_LOG, "upp send: success");' ?# b" ~( C5 I
}
# w+ t3 {8 Z: s* ?7 i' G return true;8 T$ `5 n$ p& R: c! a5 L) z
}
7 Q1 \& y+ f* ~3 {& v" u. K0 q0 S' e0 H0 k! d1 q* ?& W* h
7 {7 ^; S Q; W* z( n+ f4 b1 K
1 e! A' {# Q7 _# b+ {
, J7 [* f0 W* D2 ~5 h$ P
: g5 A: g# T# K7 R4 a |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|