|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
3 M3 y5 i6 B6 A& M8 |7 i
k/ b0 W2 S) g- a' C l0 c2 I4 ~问题描述:
" j2 [0 y% W( a9 j! l1 \- K在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
( G2 R' a- s! R2 Q0 W
: u( r( A& ?( p0 n图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。7 N/ ~/ g( [% D7 {6 l' Q: k9 d3 Y
8 h( o) t5 i( N2 I测试结果如下:
8 p- n1 ]; X6 Q2 `; c2 V138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?; [& b! Z+ w/ t6 H) F$ u- f
) M6 _* K7 @- h, |& W
" ~1 S7 V$ F4 G2 O$ K: q
备注:
; L7 t9 u- p( o3 |2 J8 T6 m1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
# c5 O0 y! y8 D4 u" @! g2、相关代码如下:
( d+ `9 D' b P8 S. \' s//UPP DMA缓冲大小512字节
. e0 F: E5 m5 T4 K2 I#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
/ A& Z; W- B8 S/ @! `#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT( r4 h( s! N0 d$ t8 K4 b
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)# u. b9 r0 c- z$ {2 b1 q; _/ O
: y6 _6 e' R/ _3 Q* a/ X! z; F+ J
8 i) W7 K! p" w, E R9 @" r$ I" s//upp接收、发送buffer3 e- d* _8 Z8 }
#pragma DATA_ALIGN(upp_buffer_a, 8)
4 w, {1 |, G7 Y) Y v$ S6 e+ w#pragma DATA_ALIGN(upp_buffer_b, 8)8 x) W$ `, }* t7 u
3 Z Q3 T$ v: X8 d2 V# K+ }
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];% N n }! d$ T. c7 e- B
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
& \( P1 d' h/ O! F' |6 M! R! w& a# N2 G
3 g3 s, Y. g/ U
static bool server_upp_data_recv(Server *server)
) D' h2 r) X, ^; K) v5 d{/ b, N. L. p6 l+ h; w! ?- S+ A4 k; _
if(server->upp_channel_a_recv == false) {
/ _' v/ N$ m$ ~9 A! T2 t server_msg_send(server, APP_CMD_LOG, "upp recv: start"); E2 _7 y& R6 F- X* P1 h
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {6 X; ^# v! ^1 n+ ?
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");: f/ e8 }6 X$ [; U% Z
+ {" E$ a" E3 U" V8 f6 s
4 N5 o$ P. M6 T memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
' j# R5 J- s( R& m6 E6 U& q4 F; C6 j8 ?, j- O
server->upp_channel_a_recv = true;//
" X$ f" V$ ~' e6 c7 h server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
; y9 A' N: L% A. ]9 C7 |* I3 X server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
# Q0 }5 m. k$ ?' V2 n server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
. ^$ D" [$ D% |$ S$ |$ q; a server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
2 B$ L c5 _% U8 W$ a( r8 F! J! h+ `$ {0 ~1 u& S- q2 ~
upp_error_count = 0;
( j- j, s* L+ G3 C' K upp_dmai_int_cut = 0;' R! R' G% t2 K- |
! V8 z. b" M' B9 c
// fill in data $ y/ d6 E4 ]$ g" ]
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);& B& u( A2 p0 H8 T
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
% c# A- D& j3 f" _" R; ? }. l4 m$ P" }7 [
}
; ~, k9 ]& ~9 o& `& l9 d3 K else{
$ P9 |5 t4 C% _. F+ h if (upp_dmai_int_cut > 0){
9 F6 Z0 ]' j0 e) U: ^ DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
: Y+ ~& _; `7 U0 s+ p/ P5 n# o6 ?4 [ Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
$ F5 D/ `3 B, m1 ~1 n
6 S! Y6 a# J0 A$ i7 A0 V0 \3 q; }' i
//copy data to upp_recv_list_busy A8 o) |$ G! i0 O0 v' H$ v0 d+ k
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);6 w' K4 X3 M5 Q0 B
: z. s7 C7 f p* b" e; V' F
//
- l4 }* s5 Q" I, p& m% \: |- t ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
7 i" q' I- x7 O1 n! }; p9 v' o8 {! Q/ K6 N; H$ |# j
//, d# C! V% T+ E0 M" O3 m* h
server->upp_channel_a_recv = false;//
/ ]4 U& |6 |' N) g. C6 D0 t, d1 R8 d3 O9 D4 |
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
7 ]; }+ X% x) ~# F, K$ u4 t) l! C }: q3 X- g/ l$ S
}4 d0 A9 c* L- H& n9 B0 t
5 v6 L( A% }; Z
9 t/ D4 v0 x0 T return true;
2 g" I# B4 M# v- `}- j1 S9 d3 A9 @* g0 a
- C: z% `) d2 j O6 L$ I0 p; f/ P
static bool server_upp_data_send(Server *server)
% @5 ^& a& ^+ B{5 P/ S' l* W1 r+ J$ g( d0 g
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
% Y. |7 T5 [9 R0 Y! o DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
/ |4 H# H! i" M1 u unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);$ j& G" H, t5 G2 ]( N3 U W. x+ v
char tmp[128] ={0};
- q7 g. p+ b* |& z9 R, n) |/ B1 U( f' e- J! f+ c7 i/ M, x
server_msg_send(server, APP_CMD_LOG, "upp send: start");
9 @% g4 K% U" [7 H4 C print_log(server, data, 64);
, [9 @# O0 j [. _3 C: G
9 \/ ?+ O8 ]7 ]5 S2 i" A //2 s4 k+ h7 O* K! r
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);+ ]6 b' }; f: t0 b% b
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
! o; O& i, e/ R print_log(server, upp_buffer_b, 64);
2 Y/ }0 w9 N3 y1 G# T4 _2 d' ]) u9 i% U7 d. s
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
4 R+ }$ c& Z m8 V c server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
6 p( L: J x t2 i; q# @ server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;; i2 B$ B. `# ]# i& j ?% t
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
# x0 a+ S7 F" c* S) e% k: H' d2 b: U+ V) s) _
memset(tmp, 0, sizeof(tmp));1 p4 ]4 H8 r: `. @9 a, M6 J
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
# \8 y* e* ?& | sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
* V- h: E7 \8 ^4 _- D/ X2 a8 W! [ server_msg_send(server, APP_CMD_LOG, tmp);4 J6 x9 a: R* {6 l! U
: [+ q6 ]5 S% n' A( ^8 p
upp_error_count = 0;
Q" W/ J4 F& M upp_dmaq_int_cut = 0;
o- N# w2 K! H% b // fill in data . W$ c5 y, n: o! t" ^
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
/ n% G& U! v+ E server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");- d7 d- K- D/ A, e2 X; w: `
! Y1 D) f0 m" J$ r I9 b( V // wait send success
7 Y3 Q2 W0 f- q. ?! K, o while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
4 f9 V" k3 k& p* _& F! j& C1 r% B5 B8 D }
// make data node in free list : [+ N( l9 G7 u2 j( D0 j) b
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
5 k0 s4 h* F% M/ G! @( a2 ^: K server_msg_send(server, APP_CMD_LOG, "upp send: success");3 M u' D7 z3 P# H
}
) _0 ^! a' \& }; Q, ^5 k return true;: N8 D6 u! E: F: o, j" [
}
/ }1 W5 K' C: C) J7 O- M: D# R
' D- m2 n/ h% ]8 O# ^2 S6 b6 n9 {! t( J6 L: ?
* i* w" Y# N8 D2 x! C8 I7 S ]
& f( r4 `3 {8 V& V2 B& d D m! h& a9 p3 u
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|