|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
0 x7 Q, i1 b$ O& X
9 t& {. s2 ?9 {, J* x2 F8 m问题描述:+ S# y; Y7 F- B5 I9 }
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
; F% n; a; X1 k; m7 l# S7 `* p6 t. j( O2 _* T3 B. v
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。9 | D5 e7 R4 i3 X/ q' k. R
) V+ p- A: O% y5 l" m6 Y" Q测试结果如下: c5 W/ ~, p2 o% E% i" U
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
$ Z; O: c4 z [( u, p7 P. f9 j4 A" W! `& v7 g9 V6 A
/ v% O; e$ U7 x9 f D/ c9 a备注:
/ h; G6 b: `1 o* J1 ]1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
8 v7 c0 a" b8 r* N) E6 c5 s2、相关代码如下:
5 c( `8 o; z; m9 Q1 U# L# e; }//UPP DMA缓冲大小512字节
, O# {: g6 g" V3 u e* p) I#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍' [/ m0 S1 R) h$ M O7 K% I
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT. ~1 q! P: L3 i' z: H& a: ^
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
9 @* y7 o- _# ^
n7 i4 z) M( p, O" Q$ e) ?, {6 t5 B4 t% i8 N' A. ~% N% x
//upp接收、发送buffer
) E% y1 Y/ G4 A y8 V/ e#pragma DATA_ALIGN(upp_buffer_a, 8)" p& Y& o7 q% r3 h' ?( s/ P% ~
#pragma DATA_ALIGN(upp_buffer_b, 8)" J9 ^. x& r/ D+ Y0 W
' |9 X. G1 l. z2 {5 l
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];5 W& C3 f; \7 Y5 D2 w$ p2 u
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
# W: n5 ] l8 f, A2 W: W8 \
( `' c, C" ?9 x/ J5 x
1 N' b& I" n# u5 |% e$ \static bool server_upp_data_recv(Server *server)
7 w$ u9 h" W( B/ {{ K( T3 A" n+ a/ z( \3 M$ B x
if(server->upp_channel_a_recv == false) {
5 H' P: _: n- R' X, g2 c4 N server_msg_send(server, APP_CMD_LOG, "upp recv: start");
& U8 n& X9 e2 F* ]( L if(ListMP_empty(server->upp_recv_list_free) == FALSE) {1 |7 m X2 x+ S/ W" y/ ?* @. r
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
6 y8 U E3 ?2 z! H) \3 R
: o; A3 u2 }7 V6 x
( D( u4 l% O5 D. U3 n- q! N memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);0 V( n/ R' Q" ^; c! T6 B
. X& w: o* Q6 n5 [: \4 V server->upp_channel_a_recv = true;//
, x: ], x* p, G1 f server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);" j9 t, M* G" r: |9 L, q0 x
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;7 a: Y- U& O) ^5 X& X
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
9 S! C- g0 q/ }2 g) ?+ p server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//! U1 T4 ^2 L( V: P1 b
2 J$ m9 _5 Z8 G upp_error_count = 0;% q0 }5 t$ f Y# g8 v
upp_dmai_int_cut = 0;
5 }2 A7 j3 Q( ^4 L$ ]6 s' y( K
6 d9 R' ^, r* ?0 M // fill in data ' W' X7 n% L0 P* M7 l
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);. Y7 x: L5 [- c
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
9 S i4 L2 u9 ^( c }
% L2 m& K' ~1 m; ^ }
7 T! ~8 [( a- K else{1 a" H# m* G$ A$ [& \
if (upp_dmai_int_cut > 0){
7 J$ k9 N6 S [' I0 k9 \7 z DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);4 k+ [9 m/ ^: V
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
# U* z4 q u1 l/ F8 P. u5 B! y4 P' v
) Q0 S5 Q1 g2 \7 }6 K3 y
) H5 F5 R+ M9 `, A7 h, W+ Q //copy data to upp_recv_list_busy0 U" r9 T( I' ]5 v/ }; A4 T
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
! A( A& ], G N' c$ r
: h L* E' O. W5 G# P+ g/ v( ` //% q% ~9 e! a( t9 Y4 u
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
: {- Z7 W2 f# \4 Q: E+ g, H4 O% Y9 J) b$ G+ I9 m7 ?
//
: s2 _3 Q+ S- q, D7 E server->upp_channel_a_recv = false;//7 b; Q( r M1 y6 E. }
; j9 M0 r# `! ^3 ^* @. k9 o
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
7 P2 Q& s/ Q: i6 ]! e a$ A }. @ z1 k7 ?$ ] c2 X3 m! h- r3 ?
}, b. a5 U3 F- e
& e/ \5 q% t& a0 v5 X+ }3 @/ M5 T5 Q# U' T. w
return true;; M* g# R, p4 q. Q
}
% o9 Z# C( r: M
2 B5 H' {$ x: A" _static bool server_upp_data_send(Server *server)
$ J _6 F B$ W# @$ e$ O. M, Y ?, `{
& w% b# R6 O! ~0 N0 d: B if(ListMP_empty(server->upp_send_list_busy) == FALSE){% x$ O6 X( [. v9 J$ g2 h3 `* W/ H
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);) l. ~. a# b2 s/ `
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);0 `; b7 L9 O0 I$ w9 t+ z
char tmp[128] ={0};! @$ T ^4 H/ f
3 _+ | i! U9 p1 X6 i! S
server_msg_send(server, APP_CMD_LOG, "upp send: start");$ e* X" \# F) M+ N' Z: x
print_log(server, data, 64);) [" M. M$ [! ?6 d, e& m
- u$ P* E' c) V6 K //2 L3 G% v& @; j+ { [ w7 E
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);& s- }! j0 y- `# u* T
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);2 V% G/ p! j6 q0 c$ Y) ~
print_log(server, upp_buffer_b, 64);% z$ f7 j) M$ E' A
3 ^+ y) y$ U. `2 e' s( R8 P3 p server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
" r, H) N* w$ y) G3 |' f$ H server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
- k: N8 v' k/ K* X, f9 m% X0 ] server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
+ l0 U& w q& o server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
8 M) {0 M# x! W8 A4 E3 }
) f' a6 j' y8 t memset(tmp, 0, sizeof(tmp));
; X1 H/ n w. v0 V! K) l) m. P( A sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", % \7 w' n6 W- U# y9 \
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);$ X4 O# G9 q3 ^5 I9 F4 n
server_msg_send(server, APP_CMD_LOG, tmp);8 N8 ]# K) Y% X
$ _7 Z7 j+ V8 c( @# r* @
upp_error_count = 0;2 \4 H7 v6 Y' r" o; x8 L% E5 R
upp_dmaq_int_cut = 0;
0 {& Q; ~2 j) o1 } // fill in data b% ~$ R& O3 r' O8 }
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
+ |. C E+ a ^7 ]9 Z server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
$ R K2 H* J& O3 _- \
: h# ~7 Q7 y* m2 ^$ j% _" Q7 f // wait send success/ a2 K. ^# X a, [4 F R$ ^/ Z% k
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 7 h' B2 I* j3 m; j
2 H; A/ F$ u. e* _ // make data node in free list
9 L8 d6 a- `, Q ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);' u! b9 p* l& ~6 A3 |. Y6 n# }
server_msg_send(server, APP_CMD_LOG, "upp send: success");$ T, {9 x h6 d( E
} D# x0 Z, e! F f6 R$ S$ q
return true;2 q. c0 r9 n' z
}* T- W' [/ n& m
' R: T% _% O( |
1 e: ^0 p" ^5 Z
7 G( Z/ g+ _' `+ |* ^9 Z4 q
$ [5 L6 i' @* P, k0 O \8 ^. O: l! L x
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|