|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 6 b( P. e3 f+ ]- t5 W
/ J% }: O4 g: H+ x问题描述:
5 e. ]. f4 u9 ^在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:+ @: ]; B: c8 i9 o6 P% P: `$ a& X# Q
. {7 T) O+ P6 P v' d$ {/ z( G
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
% Y0 i6 l: { R
$ v K1 }9 m# g0 F/ o* j; A5 y测试结果如下:7 I7 J& S0 r5 O7 a% S6 x4 y5 z
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?3 a# L/ o5 y+ O
2 x0 l& w! }9 c( v- V' y2 J' M
b: \/ G5 [9 H+ M备注:
. K5 t5 n. ~2 l% G6 S/ C/ P! e3 }4 f1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
9 u9 _3 } ^' b! d3 I2、相关代码如下:
0 a, i; u- c4 O% a q//UPP DMA缓冲大小512字节, ]6 ~% V4 V8 C, ]2 M: B$ j
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
; u8 K. |/ M9 a( N8 r8 S" P#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
' V( \/ ?& l% a. M1 s! Y7 d#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
. H- p" D7 r, D" P& _* V$ {3 c9 `1 f1 r7 i' I. ~, l
& d) i$ _4 {/ x, B//upp接收、发送buffer
3 w% _2 O3 P+ ` W& e#pragma DATA_ALIGN(upp_buffer_a, 8)
" Z: K9 S2 Z$ {( f8 e; ?#pragma DATA_ALIGN(upp_buffer_b, 8)) W: x9 ~1 _( w- D0 m9 s2 t7 H- o) `$ O
3 J& {5 I" K" H P7 W
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
4 w+ V' ]7 S0 Y) [unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];7 R' v4 C: s# R5 U- @
) u) s7 C; Q# Z& [: ?$ w8 }1 A! y- e
static bool server_upp_data_recv(Server *server)
; j7 l1 z0 X B, T, A w+ P( q{
# T9 P, x" V; z$ B if(server->upp_channel_a_recv == false) {
# a* R4 Q4 f* s0 b- j server_msg_send(server, APP_CMD_LOG, "upp recv: start");
- P/ }( u! n6 I- R0 ], i if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
1 B3 L0 b! t8 t5 t5 U0 K- w server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
3 ?" o8 K) i; {8 a) E0 D+ r; X8 k* d
" B; K I. h: [4 d: b
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
- |% Y7 s5 Y# v4 k. s* f7 y
' L8 H, e1 d7 a5 t server->upp_channel_a_recv = true;//
& g. M2 M; [0 N' j0 z. H server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);9 X7 P' Q% D {+ j$ E
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
/ V0 l* {0 M W) l# i& j server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
1 h" D, c% h$ L, T2 o- W5 d' s+ v server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
1 Q) ^( }$ n( e& r ~9 _
/ o& A) L' V9 A7 T4 J" f) v, D$ D upp_error_count = 0;
1 ~) E# ^! C) `! W+ { upp_dmai_int_cut = 0;
3 N& T! |) E( {- Q U: z$ ?; |$ j: [; Q ~! O% b5 M' V& x( @- G9 W: Z
// fill in data + j' V( m, H+ N8 {4 n9 ^0 }% a+ ]
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
/ m' Z8 A* @* h- |/ O server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
. X# s" f; l5 T/ S9 l) t* u }
1 Q& M* }: ~; T! N& f& C }4 w4 ~5 F7 Y( Z* v+ Z. ~
else{3 `0 j1 H# Y' p3 n$ F
if (upp_dmai_int_cut > 0){
/ S" G! t7 Q, ]) o5 L: M DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);# v3 S: p% D8 H% J( g4 ^
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
; u- E- E6 v% d' j- |
. S0 v/ F3 W# ?) Z3 W0 @6 q- ]5 G; S2 o/ R0 s9 ]7 _
//copy data to upp_recv_list_busy$ D6 K1 T( T. r! ]
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
4 p* t+ j: ?+ K6 @3 I' l* B. l9 @0 Y2 v) c
//
5 v) a% D+ `- v4 d ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
6 @% i( E) {8 [: ]( z [$ ~
u0 u5 F7 m1 v5 }9 q. g //
# X. i/ o" T, X3 H server->upp_channel_a_recv = false;//: Y! ?( G- P9 l$ o4 v q
" w, }/ e4 J% b+ ^
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
2 A' v5 a! S% ^0 E V }
" M( v# Y$ r4 i }4 s4 j7 ^) f8 G) I
; V& p( L3 i# Y/ p* O4 Q( ?# T
+ r8 S) v2 M' ~3 d0 u, W' e
return true;
) g' I0 t" U/ k}$ Z3 u, W u' k/ ]
3 Y* y N3 y1 e$ I Z. rstatic bool server_upp_data_send(Server *server)
2 h. _& v+ o0 |' N! B{
/ J% K% b2 N$ M5 T$ g! r* H' D if(ListMP_empty(server->upp_send_list_busy) == FALSE){" U. j. F: l& [0 v& V3 c1 J- }
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);) Y) f6 K. W6 z
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
4 M) h3 e' m3 o) l2 n( Y char tmp[128] ={0};7 e1 {" }$ W5 J ?
6 W, V: S |1 Y% \
server_msg_send(server, APP_CMD_LOG, "upp send: start");
% ]( N4 L- p! A# E1 g print_log(server, data, 64);
5 x8 w+ s% q" z8 m1 |% t# c, ]( {; \, o- a( `) H3 j
//! t0 _: Z) R3 U4 j( n
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
1 C9 N( ]6 G# m1 W4 h* Y; }1 x) w memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);: c* C8 _2 P1 @. J) T$ y% e
print_log(server, upp_buffer_b, 64);
1 \, \0 ~9 X8 P) j7 O8 ?. c1 E) ?. A0 y2 V6 u9 k
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
f* B K$ e/ d% F) d5 ` server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
! @$ F" t A) ]8 ^& T9 g server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;$ y1 D% w6 n! S/ @$ b
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
* ~; J/ r3 q; Q0 E: f! k' T6 M I8 {8 {8 `3 `5 E! `
memset(tmp, 0, sizeof(tmp));
+ a6 z2 b; r s; U$ x- p1 K! { sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", # G5 `, }/ a8 v: i) }
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
8 G+ N; z0 j9 J! Z7 t server_msg_send(server, APP_CMD_LOG, tmp);
2 l% ]6 N; k& a8 K( Z/ V$ E. O( b0 I& e& G( D
upp_error_count = 0;/ D+ r5 J" [3 h5 e5 ?+ y( A1 O
upp_dmaq_int_cut = 0;. i9 \& V: f" h9 _% Q% ]) {( N! \
// fill in data
4 h5 e0 x1 o1 c- |) M& ^ uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
! d" W1 j4 `; ^5 X, n server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");: V. H- N8 g3 K, @0 ]2 m
# B" Y6 z/ \/ T4 T9 h* b O // wait send success, L( f& Q* Z- ~- a
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
p) o; g9 s' p5 ?% R9 x$ b* Z( A/ t% K0 o$ @9 p" T
// make data node in free list
8 r0 k* A7 J' w( h ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
4 M* B) }8 P, U6 J server_msg_send(server, APP_CMD_LOG, "upp send: success");
1 z j8 N7 y+ h5 B3 w' i1 O }
+ v+ `% N- K' v4 K- g# ~) z return true;
: v' S L- R$ b3 l}3 A! l" b* ?1 p2 n) J0 P
& t1 p$ j) D7 K$ @* H2 i/ c
7 n. C( z8 M/ F8 c* u: m, C! f0 ~9 T9 @* T- M. w
. P V6 E; F- x1 ^2 J
9 T( n, L0 A+ W, k& y |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|