|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
9 \' y6 N4 ^2 Y. U4 ?" I
: D8 N# M4 J, z# r" ~- T/ r4 T问题描述:
2 v. c* h1 a, }4 c! L1 t在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:! v1 f# q& ]4 G. ?
6 F+ ?0 `* t# D$ B# S0 A
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。+ y1 q5 d Z0 M
# S4 n; c& Q8 E& \9 d3 V. x! ]7 C测试结果如下:
/ N1 T- q( d' z138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?# ?; i; R2 Q" ?0 c4 u2 J
$ @$ Y6 [3 E: y% Z0 J
1 i2 @" d! p9 D8 E& E' u备注:
6 B1 A6 Z: D4 g( r, g. b( n1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
0 M3 J, C0 K+ v, L* |- J2、相关代码如下:, P$ C* ?7 [' N8 A! M' v8 c: }+ Y
//UPP DMA缓冲大小512字节
5 S1 }% }6 s6 Q7 `#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍# E! N' y( ^2 Z
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT- J" J4 ?; S6 @, \
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)4 E9 y7 \ [8 Q( `) L
! ~: A O" \; v2 q5 l
& Z+ ~0 t4 _/ q6 k8 v* D4 M7 l//upp接收、发送buffer2 J+ p" y# Q: H& u
#pragma DATA_ALIGN(upp_buffer_a, 8)4 n \2 y# D! R
#pragma DATA_ALIGN(upp_buffer_b, 8)
- V! ~% n* ^+ t/ R5 g2 l4 s3 [' ^2 Y \5 z% X
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
: K! s# H. S& Gunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE]; v* F6 M. F4 _) Q
6 o) B8 d4 R1 a+ {
4 W# C* {8 |' I8 u# U+ u+ f6 Mstatic bool server_upp_data_recv(Server *server) 4 {+ `$ n W4 H% v' K0 G
{$ M$ I6 u) C$ S4 F' R1 c) C
if(server->upp_channel_a_recv == false) {5 i6 X q& J) g( Q* ^3 m: Z& ~
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
7 L* c; N* W" ^$ P1 K if(ListMP_empty(server->upp_recv_list_free) == FALSE) {) y4 I+ O: G' Y& J9 D ]
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");& D: A5 v" f6 P; {3 j5 ~+ L
1 _, P/ _. N' p% U
1 Y3 U0 [3 s; [- X) q. u memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
+ L6 b _# t& B5 b0 `1 ?' z; r3 q. j' ]/ F
server->upp_channel_a_recv = true;//
) ^; H; Z5 {' h( z5 J server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);% S, s/ \( w. Z1 }9 \
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;+ |# ?( [6 k+ O! S8 O7 c9 U
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;5 Y& v+ g, R/ J) i$ U! k
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//$ T6 l( Q" ?5 a" u
" Y: M/ ] z7 o8 q
upp_error_count = 0;. G1 k' P, O8 ?8 g$ `' U+ t
upp_dmai_int_cut = 0;
! s/ Z7 C# K5 j! m
, r0 u5 F' E! s. ] // fill in data " r8 s& g' p- ]
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);& O! f' z6 @. R8 P; Z" Q4 x- g
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");( A8 Y7 z7 W5 {0 v# ?4 V: p3 U6 M
}
$ l3 a; K3 j+ S2 Z" H1 Y4 \# Q }
% @+ L& G" C+ W9 q5 N else{8 y' h; b$ r, ? N$ M ]. B
if (upp_dmai_int_cut > 0){. }/ |6 |$ X7 n( [
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);& s, S* s5 ]$ J& E$ f4 ?! g# U
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
* X' ?. G& }, [, ]; K9 ^
0 H4 ^' Q) ?; f+ W
]5 T) G. g2 t4 b" o+ y //copy data to upp_recv_list_busy
; U4 c6 m1 X, G5 N" X8 ^1 ]; I memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);# ~8 r3 b1 b' U0 l5 v
5 n0 m1 C, i. X, R" H0 i& K9 } //
: C3 b4 P8 H) N7 F& M8 P( k ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);* k" {. \2 \6 ?% t* p
9 G2 e% ], [1 |* ]
//
4 ~: E/ k. b" i+ |0 g4 G& } server->upp_channel_a_recv = false;//2 G6 V& x( M$ c% A6 X& Q/ z
, J# g1 _" z) J
server_msg_send(server, APP_CMD_LOG, "upp recv: success");6 l. }" c, A* ]$ Q4 h
}' K0 k9 v, |7 }; R5 R! }/ ^: E7 ]
}
$ `5 X" n6 X$ S. |
; _% D4 [" G( M1 t7 R
7 Y7 u- r5 p& t1 p return true;7 n2 n1 h# |# Q; `0 Z3 H' W
}! Z# [2 N' Z9 l' Z5 Y2 y
( R$ T* D$ q k$ C( f2 _+ B) xstatic bool server_upp_data_send(Server *server)* c5 W# e7 j4 L- N7 p
{' b1 p- Q" T& [2 c8 b2 g# T
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
4 ^% T, {6 w U% ^; M+ y( l$ ^ DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
`7 u5 i! F1 H8 c' ^' t6 ^ unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);* V; i6 U x# M0 e
char tmp[128] ={0};5 j# ~$ x0 y" Y( I$ o# D4 `
# o$ `7 q# Y# r/ P; A server_msg_send(server, APP_CMD_LOG, "upp send: start");6 u6 b6 }- H C$ M% H
print_log(server, data, 64);2 u& F! L2 X5 G& @9 w; p: a Y
8 T7 M! k1 p' M6 Y //
* F) G; Q. M2 [- e' V8 D3 r memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE); z* v; [6 j2 W) Y9 C
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
. A P& u7 v! f P' f+ M print_log(server, upp_buffer_b, 64);- a6 z2 g- Q1 u) F
- ^! L( Q; q; L! k server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);4 ^* ^) @. K8 \& K( v
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
, v, c! |4 q1 C+ T1 t server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;" K1 {* C0 f2 R2 ~
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
' h# B% t0 T% |5 f* ]9 u6 h) q: u! @6 V
. H+ U* G- t7 V3 y memset(tmp, 0, sizeof(tmp));) V- [' e: J! }
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
0 w8 d& |4 Q& j* V: B sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
8 f4 _! {/ @7 r+ U; O) | server_msg_send(server, APP_CMD_LOG, tmp);
7 v: q' A+ u( S* A6 _+ Y* }9 [0 M4 |: O* H4 V
upp_error_count = 0;
: C* m M% L) k) `) Q% P; z, V upp_dmaq_int_cut = 0;
; H- p+ m" K6 `4 p) s) _ // fill in data $ q+ o3 u2 }( I0 R/ C
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); : E5 Q; m6 G0 Y" |" z& ?& X$ {
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");4 ^9 U& M$ V) N; X/ y/ v6 B
" U- g) h8 C, m+ S/ P$ A
// wait send success
) U# g+ W- Q+ k% D3 E/ S while (upp_dmaq_int_cut < 1 && upp_error_count == 0); $ z9 [ l7 x# Y8 N9 w
* }! ^7 I* o E9 ]% }- X
// make data node in free list , x# k+ p6 n! m- I
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);5 N) l3 v9 ?+ P$ K/ H: x( @
server_msg_send(server, APP_CMD_LOG, "upp send: success");
. W- g* W7 S f3 Z }
: X/ G3 \; p/ {! E2 o) x return true;, }. y+ o5 H3 z0 V6 S
}
, m# s+ W; p' v$ d; F8 N9 G c( w" b6 e4 N h- v7 j5 u
7 m' O- l: V$ i/ A+ Y% v0 D- l j& h l! M! l4 l- Y
. X" w/ V/ f6 Q' n
& w) Y: {& b! F+ O" c4 B6 O" D! L |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|