|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
5 V- A. _3 b3 q( R6 F6 f$ d, A
/ U+ a" z9 g9 i) ]问题描述:
2 y, Y, N. I% _. b% H在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
6 u7 Y5 j3 B6 {3 T n4 G- F( Y2 m# c. n3 y) a- D/ K3 V
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。5 o/ a& k5 v9 ^# Y; a- X
( d6 i. P0 J- ?$ y$ R& X
测试结果如下:! i( l! v, y5 S* W4 T5 K
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?+ \9 d1 d% Q7 J4 Y `* ]
: R5 S1 ^. Q* q; d- I8 j9 w
+ B/ S1 n" S5 [8 v备注: p! O/ q& n- M% \0 a
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?6 f( y3 D" H0 g: _
2、相关代码如下:8 v. L! H G4 T& L! H- [
//UPP DMA缓冲大小512字节+ Q& F! n1 ?5 q# k6 j0 u
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍- P+ }, e+ x" h) F
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT' ^6 G, x3 F2 D6 ]
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
6 f( ]1 H9 u7 V, t
0 n; N3 h- G% M' l' X1 J6 k) P0 R( s1 @3 U1 S% Y6 i$ `4 _1 P x* L, A
//upp接收、发送buffer/ K( n+ I6 Z1 @6 ]* A
#pragma DATA_ALIGN(upp_buffer_a, 8)
/ [& `1 g, _. B0 a( w! w$ x#pragma DATA_ALIGN(upp_buffer_b, 8)7 t9 V5 b6 J3 ^1 P! a8 t4 {
1 O0 m$ \+ a6 q* y; Hunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
' g* N n% R7 g. Y' B* cunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];- Y8 l8 A+ `+ T/ W$ `- W: w
" V0 A* o4 _9 p q; i* J* B* M: a1 l2 E p+ S
static bool server_upp_data_recv(Server *server) ! j: _0 Z; B) t. S* \6 {$ Q
{2 U" v! `6 N7 l6 z' I8 F
if(server->upp_channel_a_recv == false) {3 ~- \0 y# o) |/ d
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
& @* O1 @ K2 x: K. D0 i if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
1 w; {3 S8 G$ g6 q* x, S, C server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");/ ` ~3 r) S) Z5 l
u0 n/ b$ _: X: K0 |: A) s" ?7 G6 ]2 [6 g7 w: i
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
; l4 p- u; @. l. V! ]
/ J& T- e% |+ V2 K7 ]. Z6 p6 x server->upp_channel_a_recv = true;//
2 |& Z+ @. \0 Q" } server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);8 j6 U7 n. {' X" x0 `
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
+ w$ S# S+ h4 @ server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
" E( j8 ^+ l7 J; h0 ^& _: n6 M o server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
$ K1 c! [0 P: ~! |
" {/ O% J' E6 D( [7 K2 X6 p upp_error_count = 0;: }3 D: f- J1 L } i# ]1 [* M
upp_dmai_int_cut = 0;8 G. d$ a7 _$ g6 {6 V
( g$ c% l( \% J // fill in data ' V) n$ `& M/ D
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
* |4 ~( c- r; n. m& R, J/ b server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");$ P% }0 q( j9 O6 _
}) a7 F% l: c# y8 z( f
}6 p5 _4 h- Z3 Z+ [7 W
else{
' N. C" Z8 z1 U' v' j4 E6 ?0 L if (upp_dmai_int_cut > 0){
; O# w! i4 I' N DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
. {2 n5 A: h- C* @8 F( P Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
! O" v; \1 j: U+ z+ U& ^8 Y) M+ G4 ^* w
' h: b. k# O( O% V) Z) ` //copy data to upp_recv_list_busy) k; [- t# x# t) s
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
. z, J; S) @) w0 G
9 P/ ~7 z! z7 K4 \, E5 M! i //
& M Q8 _, l. M ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
; x8 v( n" b$ i% w( Z6 U& U' V% c" @9 L. ?3 `2 t* a
//% t' W: M+ [. m* r6 ]
server->upp_channel_a_recv = false;//
# D: P; u8 `1 _ G
/ K! n' a$ r" J6 |$ F server_msg_send(server, APP_CMD_LOG, "upp recv: success");
9 T- M+ P, e3 ?/ M* `7 C }
6 S/ C$ x6 y* ^ P }
( X8 d9 @# t1 r* F9 m2 f, N8 y$ G' e' i, o: Q
7 @8 {0 f0 f+ w1 j1 g( H" { return true;" O6 q5 J( ^& R* x. |
}
& Q1 k$ M& r0 a' ~- i2 f; v# m" v d% e% x. K
static bool server_upp_data_send(Server *server)- F0 l0 z* l. G" b* Y& L7 a7 m0 ^2 h+ X
{
j. b* P! q6 V7 W! j if(ListMP_empty(server->upp_send_list_busy) == FALSE){4 ^! f! R% n2 q" x1 R- X$ T
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
6 O& a( g% N1 ]" Z: ? unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);! f% i/ N( M, _ J7 F" `
char tmp[128] ={0};
4 z3 |8 a! e4 S7 F1 c' I2 D8 C) p. H* _" R3 S2 g
server_msg_send(server, APP_CMD_LOG, "upp send: start");. V4 O5 N; S# r6 ~2 m2 q) P
print_log(server, data, 64);
& j v; l. i' _" m; X1 s* f( x0 P
//2 |' G" Y+ `0 {* K
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
- P& K! x% I0 g z memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);+ y' ^0 |6 K K
print_log(server, upp_buffer_b, 64);
1 a$ g- D/ n2 a6 P, \* G
1 y* E" `6 F, b( Q2 P! u server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
1 \& l/ G* H+ R. f5 _ server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 9 d0 M& t/ u( e) ^: H; H8 @' Z
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;4 K1 m% w0 y" V& ~6 S
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;- P! x' x% q7 F" F$ V
' u& T. f& @3 K, Z) _
memset(tmp, 0, sizeof(tmp));3 D( }( D" q j7 j! @6 \# A- ^
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
( r& Z0 s+ U) n2 a# U5 b sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);# F8 A7 {4 p) k i
server_msg_send(server, APP_CMD_LOG, tmp);/ j' w w- o% g/ \' z, q" s
$ m7 V2 q0 E9 C
upp_error_count = 0;3 l( R! C1 O/ Z2 ?7 }/ M O& p# j2 s4 E
upp_dmaq_int_cut = 0;8 m( w' W- h- S5 s2 v- y5 _
// fill in data
: f* K, J' r" n4 W uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
' w0 g9 G& b+ T0 w* e server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
& {1 \2 u1 K) l$ b$ T* N. q( G O7 t0 ^
// wait send success
4 |9 O: E; H7 `; K while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 4 y: D' x% U: s. T0 P+ T6 m
& a. F- X+ Q- E0 d
// make data node in free list . s5 l! @+ G4 O4 G' ]8 Z# w/ K) C" ~
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);1 L1 T) l9 V; E
server_msg_send(server, APP_CMD_LOG, "upp send: success");7 l3 m/ w& B' b/ B% E7 w" O
}2 K" _' R, ^7 c0 I" s# U
return true;! |( R7 `: E) }/ | P+ e
}1 y3 d2 Z+ }, o' L0 L
. ]4 G, j# s: p: ]1 W- {
5 f- s y" d+ j: k; D3 ]
8 l! G' I8 ~5 g4 i
4 n! g2 E/ i: w8 ^+ P
3 O+ i2 m# d# l C- @3 S6 h
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|