|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ! d& E6 @6 F3 w: ]
/ T- D i$ r3 E* B. r+ |$ A# y问题描述:
6 t; I% v$ }. b" c9 c在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
6 f2 S+ i' p: K* w, }( t; c3 n" z3 u6 n. j# j( k+ z I7 S: K
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。9 h$ |/ i) v+ @) z
$ h# b2 L- ~# b; `$ E
测试结果如下:" k. {* e; I1 Z* g' V' ]
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
5 O# x p4 ^+ D# D0 Y E7 l* v9 m2 c2 J Y8 C" c
( M! D: K8 }& ~+ I# u* K备注:
' g6 V I* @" Y: T! L1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?) p$ d4 e: d, t" y& V" r
2、相关代码如下:* d) ?8 R! E( S# g
//UPP DMA缓冲大小512字节8 Z; K) _: g- S3 o
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍; R. X- x9 I: _* M- U( A" A
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT, ]& N3 N- o* h& H( k, I S
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
' ?& _8 r/ u% B6 p
" ^8 }" x0 w! h+ }6 {* b3 I8 N: P0 c! z" ^8 P7 [- |
//upp接收、发送buffer7 o: W% `' O1 x; h' J, {: b+ U
#pragma DATA_ALIGN(upp_buffer_a, 8)& {9 d. a3 D: y( w! c/ x5 a
#pragma DATA_ALIGN(upp_buffer_b, 8)" E3 r$ L2 D# c1 e
0 |( X/ t* ~8 r4 K% Wunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
6 n/ h/ v/ y& p1 f% hunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];& n- g d# G/ i0 X
$ T. B4 }7 a) {0 Z# c+ h* r$ Q6 e
- Y$ H* H. [; N! U' T' @
static bool server_upp_data_recv(Server *server) ( W% R* K* \9 B1 m4 b2 p4 f
{
; d) _( \& e) i9 j if(server->upp_channel_a_recv == false) {
# K7 K. w2 p& m. ]) T% f' r" z server_msg_send(server, APP_CMD_LOG, "upp recv: start");
# Y8 A f o3 C if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
8 V: `5 X" f5 B: N/ s" t server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
9 H+ ?8 {: b6 ~) y* h# |" f0 F9 P$ |' |/ ], y/ k; p/ V
- K5 B$ E6 g; E( v+ m2 F; f memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);1 n) n J6 D( n6 `
+ M4 b8 h6 h% k server->upp_channel_a_recv = true;//4 Z. w) H |/ A3 d- _% W1 v
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
5 z' E% E- p X server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;( O% P0 q- L7 M0 ^# K4 a1 E
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
9 l- D, V3 w7 C# { server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
6 G& T( Z7 d$ B( r# U: a1 j
6 P; k c' b* z8 @ upp_error_count = 0;
/ S* Z: D' a; T8 Z: D: e upp_dmai_int_cut = 0;3 A9 @) e$ K; u4 v( K
+ Q% U5 U6 M- j) [
// fill in data
$ j0 F( r0 I$ j uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);9 H& K- w! z- t
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
( M7 w3 Q7 v3 H5 }/ s+ \: \$ _8 P }/ R9 g9 H2 m+ [+ E4 E; @& S
}; e0 s! e$ | B0 Z: V* D. V/ f' p
else{
4 L" Y% s I# r6 {; }; w n if (upp_dmai_int_cut > 0){, z7 O& W% {& B0 \& i( C
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);3 k7 R- c! f, q) d; _( I* h% @
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);5 f2 g+ u! `! W, A+ X
: @8 a7 L) b* d) }9 h( F2 C
. X; j7 Z! x; T7 `+ p# w
//copy data to upp_recv_list_busy# f$ V0 k4 c. I, w# f
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
& C9 [7 w+ U; @) R& H
4 y6 E! ~* f2 b' h e. n //
* h/ |& ^. y- S ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);# m( v$ }* |. N. i4 J
) d/ }8 k0 ~$ t$ l6 H //
& k8 g, [4 D% v- z server->upp_channel_a_recv = false;//
& F, k6 K- ~7 i0 n, F5 H& r
# s/ y4 i: L* C3 C! s0 v E server_msg_send(server, APP_CMD_LOG, "upp recv: success");0 e# c2 p4 q& O& s2 o
}2 K* W0 j$ h" h c4 I D
}
. \* l9 j: M% U0 A2 |: [
$ S( {5 `' G% h* _- y. m5 H, W& F5 h7 ~/ s+ r+ @
return true;
* R+ P# r$ I1 `) p# i2 ]9 Z}. o, _/ N2 V! j# q
$ W4 o; Q$ L- \: a
static bool server_upp_data_send(Server *server)" u& i- {1 [# d9 S* s( y8 T
{
8 @) x, x* G' p3 ~ if(ListMP_empty(server->upp_send_list_busy) == FALSE){8 Q2 O' h, _7 v# \; J1 D$ O
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);+ n3 I* |: E7 Q4 z0 S
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);9 Q7 U( ^7 w. I1 [4 d! I ^
char tmp[128] ={0}; f5 f+ Y7 ]3 u7 I
9 B$ P: C* d7 K% E/ _- @2 N server_msg_send(server, APP_CMD_LOG, "upp send: start");
2 Z9 A, L$ H, D/ o9 ^( L2 v7 f print_log(server, data, 64);
, Q- h9 e) u$ B1 D& K* Y- a( M! |, R) S2 p' X7 N* H. L
//+ {9 \; f! D9 w# p% R. m
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);8 S! h' v9 f |$ ^, A
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);3 J) N- T4 {/ }/ I. {
print_log(server, upp_buffer_b, 64);. T. E2 I/ B& H
! R# b2 U- o/ @; q' i
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
6 s, a5 h3 Z- y4 s/ C) W! z" R5 D server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
' B4 `, N$ q7 x server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;/ B- n6 ?1 L4 }0 ^+ D8 J
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
) i/ w, x# g; \- k& i$ J. l0 H* X4 c" D' T
memset(tmp, 0, sizeof(tmp));
4 b# B: U$ _5 x3 S: k) C sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
/ y6 l! s0 E" ~. ?& x sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
2 F0 K& o) e. k server_msg_send(server, APP_CMD_LOG, tmp);0 E( i; G/ o- `5 S/ f: V6 _! S
( b2 }6 w: ~- j0 X1 f
upp_error_count = 0;
" j1 h+ P* q* H' v1 ~ upp_dmaq_int_cut = 0;9 o b, S" A; \4 |2 a
// fill in data 8 d; s2 C8 h$ R6 ~: b, f( e- q
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 3 x3 b5 m7 J2 N! S8 ]- a
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
/ [+ T8 U2 N1 ^0 ?* P' p p, j* E" q8 \: G' ~
// wait send success
' p4 |& X5 I& o" }% K2 Y: N) v6 d while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 9 w! e8 L' M8 p
a! x1 T/ J7 V' O) k, z1 d // make data node in free list 0 w* I6 C& a/ m8 O6 r
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
. M' {$ J. ~/ d! k) y Q @4 q) y server_msg_send(server, APP_CMD_LOG, "upp send: success");7 B* \4 z n3 d) P7 S; o
}6 Q& h# D- R' {8 J, J
return true;. M- x |8 _: c
}2 c2 f5 G& ]$ l: J+ M# v/ @( C+ t4 T
9 Y, Z' \# z( B# X
2 G, r' m3 h( a6 X, y' R! Q
- Q1 B% M7 F% V1 o5 P' e3 [6 H- W4 t$ ^) T D
4 F& Y* \/ ^$ h Y/ ` |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|