|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 & r, E- [- z( |( i5 p, \4 e* f
$ i; m$ ]/ g' z% ~$ U3 L9 A问题描述:
" T" I4 @$ d6 L在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:8 b* E* r% n0 n/ s5 f/ |! b
0 ?, P7 |. @% R8 M0 G. [- U U
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
! \2 r& Y( k# S/ `% L
4 Y( H+ |( c$ Z* c, J7 k% L6 ]测试结果如下:2 R" `; [) y' i# S, d- o9 m6 R/ ^. l
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?3 [% b, ]- G9 ~3 H9 h) z$ U7 F# w% E- T
8 {. H8 s1 k( N) x. B. H3 P" o" H% D: G& S) J1 @
备注:1 Y8 p; ]# U7 M4 _. c: B, G# B
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
$ P5 T" w5 ]* t, U8 i# m! u9 \/ D2、相关代码如下:
1 t3 f$ v$ ]1 R9 O//UPP DMA缓冲大小512字节
# J" {: c8 `7 N#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍" w$ L6 M$ L9 n4 Z. B4 j! W* |
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT; U/ S1 h5 `$ d [; r
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)0 A/ O2 E$ y# n7 C
1 Z0 |1 a" f4 \, s0 ^7 ^- t: X0 R2 e
% z; e9 r3 w) P2 [0 m1 U4 [! E
//upp接收、发送buffer
5 ^8 f1 b6 j) V6 E2 z" N( r#pragma DATA_ALIGN(upp_buffer_a, 8)8 Q9 V" f7 \, {0 L: z+ R5 T2 k
#pragma DATA_ALIGN(upp_buffer_b, 8)7 m3 ?5 Q, h; j4 Y5 g# a* R) D# @- J
& H$ R$ G5 m/ a C% [1 y' e# [9 J. Punsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
2 q4 Z" j" e5 `. I0 r5 runsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];5 r0 O* _9 Y4 `& x* r+ I$ B! S
8 L/ i6 ^# [$ _( f4 u! L5 T+ M" }) {% }, O9 A+ Z9 V3 @& V
static bool server_upp_data_recv(Server *server) 4 |, g! w0 R: \: X8 e$ X
{3 I+ A) o" f3 X
if(server->upp_channel_a_recv == false) {
* Z) C3 |! V/ ]" G server_msg_send(server, APP_CMD_LOG, "upp recv: start");
+ C# m% w5 F3 V* A. v! u0 q if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
: X4 h3 I) y4 O: Z8 f9 X) X server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");- l/ B$ {2 I- X2 d
5 Y- N! Z7 G4 ?/ O! _/ j* X7 p4 @: P$ c, D
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
. _+ f! z( @. `# d9 n2 A/ ?4 L# ]( o- l& g; _7 [- [
server->upp_channel_a_recv = true;//* |( s" N% Y" b" `" z1 g& }
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);( p/ ~' q2 b# c' [; P
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
C( |, f) t' c7 h7 L- V server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;# ~ o9 g! i2 c4 U
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//! z; `8 F' p+ [, R/ }! i
* p% J) o& k& n; h6 y6 q8 B/ N! h upp_error_count = 0;. f1 W3 o u4 [% O; n
upp_dmai_int_cut = 0;
6 `/ ?% C& m. q- R9 ]* k( w( ~ w4 I' M( C- v
// fill in data
8 q$ Z2 O7 O. T" v uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
9 ]- g! W% Z; q3 D, E* O server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
s7 Y1 }: U Z' V0 s+ K }& _ i2 z. o! |% u9 w8 ~2 g. S& h
}9 @; s8 ~. v$ l& d$ H7 H$ ]
else{- i% n# c/ Z/ x3 [/ x+ N; n
if (upp_dmai_int_cut > 0){
8 ]$ I$ t& ~' [& n6 e7 e DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
B% T/ Q' R1 G" t7 M" T Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer); |; A8 N! E: C1 u
4 M* F" @6 s4 Q: F9 Y% @' W0 X# H
& v/ Q! O' @# a& R0 f4 d) Y
//copy data to upp_recv_list_busy2 r! O$ [7 w9 O! ^. V d
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
6 J& s3 P1 Q- R. ~/ j/ z
0 j8 ]& Z7 m8 q: ?5 g/ g //% w7 e; [' l6 t& m( j0 Z
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
; ]% l; C" O6 ]% N1 y4 {: s# |4 Q1 ^" M6 g! @- M1 y
//
0 F1 H% r! @/ q server->upp_channel_a_recv = false;//! H+ f1 L$ V: h0 a( w
- P& W$ D/ Y5 P9 T% R9 ]
server_msg_send(server, APP_CMD_LOG, "upp recv: success");3 G; J+ Q7 C4 P% B' K+ }
}
p5 w' n" ?( F" s p7 i( d }
) A1 a- ]* _2 t. a3 |
" b7 ?7 a, M! E
/ O: F: I' r$ p4 t/ Z return true;
" G; @7 p9 P/ l0 H1 W4 I}
! a8 P' J6 |# M. b- w: S" f8 s2 [, X5 [2 Q$ E5 N
static bool server_upp_data_send(Server *server). E# l% K1 n' S: p6 y
{
: ?0 Y7 \ {7 Z0 B1 H# U if(ListMP_empty(server->upp_send_list_busy) == FALSE){
0 w5 i' ~: h$ x0 E' I DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
; Y2 a8 g+ W+ l8 h' x unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);/ d' g& k0 m* W$ u6 F
char tmp[128] ={0};
) ~& S. p9 @1 _, I' \4 |/ G
# M5 P& q8 M5 A" |" f; t! f server_msg_send(server, APP_CMD_LOG, "upp send: start");) E9 j1 j( t0 t
print_log(server, data, 64);
0 D: `' |7 g, Q1 g. l, ~# C" Z: S& v" {0 N( Q
//
: c2 ?$ S' R _% M1 K memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);+ \# M1 s. F6 y8 ^0 Y$ {
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
. h* w. V& X2 B print_log(server, upp_buffer_b, 64);
* Z0 M: [0 S' E- C" Y; ]% H1 ]/ n, q) A, N" l) p: Z
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);4 Y* ] m5 S! @3 |
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; - R+ Y# D# p% R0 w
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
2 Y5 P% Z5 ^) @! h- m0 A server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;+ R( E2 B$ @# l% L% K+ Q
, e5 p6 \% g/ ~) W memset(tmp, 0, sizeof(tmp));! V5 E c& C( R* ~" M# P, _, u
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", & d, Q- N7 E) X- _/ z. T
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
( l) ?, R) p9 [! m0 B' y! N& ` server_msg_send(server, APP_CMD_LOG, tmp);
* A3 }8 Y7 ~+ r# s& ?0 J
# w) ]( n2 O9 _- U upp_error_count = 0;
" I3 S' Q6 S {. M upp_dmaq_int_cut = 0;+ A/ ? d! k* h0 Q/ g
// fill in data " r; b5 Z* y! s
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 4 x* q( M+ I9 I1 L6 l
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");# ]$ Z- p" {& W
& ?' ?5 s2 |7 n4 O8 R // wait send success7 z* N# x1 a* Z
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); " N6 H, \2 m% S" E6 D# F/ I
) |( S+ q$ {& c& o% g
// make data node in free list , B+ X7 A' X1 L- o3 Y# l
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
+ D' y2 k: `8 x( f( I- b server_msg_send(server, APP_CMD_LOG, "upp send: success");
, V5 H/ d' d' @. P( x; d% ~4 { }! X& D; ^2 W: F- G# e
return true;
( K* ?1 ^6 C# u( k+ K. j- g}
* G8 o& q6 D- R/ Q' L1 H# d4 {, b, ^, O
+ l# [+ ^+ n. ^' }2 z% T
* U, Y7 Y/ ^$ H8 m: j
y9 p9 Q0 n7 S+ O/ l# Q2 {0 h2 y! W$ |$ y
D5 f* d- [% P/ v# B! o% T9 [ |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|