|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
5 Y; p; o, M1 A* H/ i$ E
2 U) \, T: W8 P, ~! p3 L0 x, D( z问题描述:% {6 K) s% J" i3 Q/ @# }2 B
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:& l. _# q/ }. k+ O; w |
1 t, I- _- i& X7 F
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。& E3 E9 y( ^4 ]7 g
6 F; {& X2 ~4 H! |% g
测试结果如下:9 v, b) E+ m9 j
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
+ b" Q; v& r0 D5 n: q3 \! t" z( |/ Q5 T1 a: t% D ?
. _$ n2 g. @- i3 P6 b/ D* }" G备注:
- O- ?3 n; F6 G% g( ~: g F- v1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
8 n; I" e0 m" M" P) T0 r/ {2、相关代码如下:
& G1 }& {' Z+ w8 t( G+ M//UPP DMA缓冲大小512字节
U) d; x$ W; x3 o+ r#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍: E' C9 r1 [5 w; v
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
6 U* h" M! R4 j3 c5 g#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
& q9 ^1 r7 B' s
# n/ g2 Z2 p; l; j* Q: [5 s8 @. V5 K: m" s' [
//upp接收、发送buffer
: U m& Y* e% x- p5 _. H8 z4 a#pragma DATA_ALIGN(upp_buffer_a, 8)
: w1 ?& P5 s% S# p$ P2 b7 {#pragma DATA_ALIGN(upp_buffer_b, 8)
: @ ] ^, G# q! \2 N+ j! u; l" [, g4 @% D3 I! C8 d
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
& Q) C. j6 i" e' u/ _9 Yunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
/ I& M( ~% }( {4 h( ?2 K
+ p) f4 X f8 @3 @8 Y: P0 u6 l$ c! F' l
static bool server_upp_data_recv(Server *server) * ]/ N) o6 u1 h6 \
{; F/ x G% C+ j, _
if(server->upp_channel_a_recv == false) {" _ {- t, k( M5 [
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
; F' F; [6 W/ H2 ^& ]# }$ [ if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
& a9 Q& W: a' t' p$ f7 L7 x server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
4 k3 i4 L" A6 z, s1 a
6 D; I* ~3 _3 A6 \) f
4 ` I" b% S t/ T l memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);& [6 X- G! f+ ^
, p/ v, Z9 N W, x z/ [
server->upp_channel_a_recv = true;//
: V% W! W9 w: g% i3 c! [; Y server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
3 T, ^& n$ a6 G server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;$ c" I5 M" N2 |8 U
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;) {/ f1 J4 j( G5 m! L: X' O
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//% Y8 W; P: d* |; s2 Y
! ^7 K; D7 L7 b$ Z5 S
upp_error_count = 0;
$ f1 {& S7 v6 r( a8 M8 l7 Z upp_dmai_int_cut = 0;
+ X/ e, j9 @7 x) H& E8 g, m( Y9 G8 t5 S6 q' x
// fill in data
: P5 L# }7 P# ]9 m- T, W$ |8 A uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);6 y- H& z% F6 N6 S5 \( c
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");6 Z8 G% ~, c6 d( Q
}
& n$ N+ v+ o! V" A }
; G7 n6 p2 s) {5 C, d: D else{
; L: o6 z F" A( Y2 v if (upp_dmai_int_cut > 0){- p( B @; x& ^3 T5 o
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
3 B. F7 Q: H3 p' x Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);/ t) q5 F9 l y- |* q. o
+ V4 W2 o+ Y* J. W# F
1 ]) V) D: R# n! V3 J" T. W5 t. u
//copy data to upp_recv_list_busy
$ U$ Z+ H L8 D memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);8 C' h5 Z4 f: s9 e
) f: G, D; b% u& b' ^0 m- C //
$ U3 X3 [, v, L9 W. y ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
" x: {& d2 r9 K, b% |; y0 O
2 @% F7 I! B- \8 X" I+ q //5 d8 O+ o% E4 {: N" A
server->upp_channel_a_recv = false;//9 J# `% F" O7 E K1 p& L4 \3 J v
- g; `4 u% I. }" G( w |) k! D server_msg_send(server, APP_CMD_LOG, "upp recv: success");1 M+ y# M" B+ J) v& @- A- B
}
" r9 g0 Z( V6 {8 ?2 L Q }, R& d$ }& T. Q% d4 @ ^' k
9 k; e3 q+ Q- P5 _* e! G4 V/ ~7 `8 y' ~* ?( Y! K5 r1 F
return true;& R/ P& C: C# [. Y3 h4 u9 k
}
' p! R4 A6 b6 j: q( v- K3 o
/ h1 q. x. N* z2 s8 l( _) z( N- {6 bstatic bool server_upp_data_send(Server *server)" K% q n+ c8 l
{
$ l' q# ]) Q* C) x2 x7 n/ v if(ListMP_empty(server->upp_send_list_busy) == FALSE){% g5 D K3 l$ j2 Q4 ?
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);; Q$ M4 p; |# b& p( F# d, {) G
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);+ i! e! ^, ?4 C3 N" }5 ]
char tmp[128] ={0};
' T, y" q0 B8 U, ?1 X; ^ h# }$ q8 a, s T' E
server_msg_send(server, APP_CMD_LOG, "upp send: start");: K/ e/ u6 ?( E
print_log(server, data, 64);& s/ l" Q# y9 Q* S
7 l. Q3 s" j: D @. Q, F //5 [ m) C# q3 J
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
6 N9 o6 k( J/ u" P' j memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
6 ~6 {, e$ p) }. \5 I: l! C print_log(server, upp_buffer_b, 64);
+ B; N9 F( [" S* |- Q- z) f
7 Q# Z) m. c4 j# Z) H server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
, r7 H5 d& T! ~ server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
8 r" J4 u9 Z* _- I* t+ ]; ? server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;" z, k+ k- o; s4 y' e( w4 C
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
3 `( i" I" d% F6 ?& _! ^5 B- A( p* S- }- i) F! ]- q5 L
memset(tmp, 0, sizeof(tmp));' k$ v( R9 ~8 m( `+ S1 H# H
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
$ S4 ?2 s5 d9 |3 T9 L; x$ i sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
" V' L+ u5 @3 R) i1 n5 d% k server_msg_send(server, APP_CMD_LOG, tmp);/ ^8 P, k6 F/ X$ ^, M
6 j& E9 j G6 a8 P
upp_error_count = 0;% s. Z1 o( q+ L |8 ?
upp_dmaq_int_cut = 0;$ m& h# z1 |, j \+ }2 M- s, Z
// fill in data
8 I, O) o2 N8 K& G! j$ B) o uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
, _* j0 x' U1 c, e server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
' {7 Z" g ^8 A. Z; g
) A- G3 A! l5 E2 G7 \7 } // wait send success# G5 I9 D$ k+ G1 m2 Y- M
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ; A4 `, d+ n- n
" B- M9 S1 e! K5 d3 r8 ~
// make data node in free list
( U' ^! E8 i0 d6 [3 p9 \ ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);2 K' p5 f( E$ V& O
server_msg_send(server, APP_CMD_LOG, "upp send: success");$ a" N: ^. g; L& l% u( U& z0 F u
}" N# A" I4 C6 [( A* J
return true;% c9 ?5 s& E1 p* p; [
}" q: Y+ B6 T* q
6 g2 [# ]& P: @7 w: r3 g3 ^
! j/ v2 y2 D/ J/ B
, K! x! H- |- v! D
, [9 v& @3 r# Z5 U# B! A! k. @3 N( w' O% u2 l, `) p6 n# N
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|