|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 : a6 W0 a- Y& E
' s1 k0 g& _) Y' C
问题描述:: q8 `0 b5 x t" |
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
* [' ^% j& E h5 _/ Z# T6 }2 q4 [5 X& U. k! p$ x
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
: K: v5 C% F: V# w8 r
' F7 E7 y4 |0 t- P测试结果如下:
) e/ P, Z) \, R* J4 X: f138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
6 @+ w' V1 x2 F) A, s
) L4 S. N' o1 T1 Q/ A
, L2 a5 I4 s+ W0 D/ y备注:
2 e' P- g" X6 T1 o, I1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
2 z* U; l4 Y2 q% M+ N4 ^9 Q( e" K2、相关代码如下:$ _$ ^7 `$ G6 a9 J' q8 z' g2 _
//UPP DMA缓冲大小512字节
$ f2 A3 D8 I" n, l#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
( ]# U4 @4 Y% J( u$ y. |* y#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
& ?, u9 d! }+ Q6 q; a#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)0 t7 }2 E4 M7 S/ ~3 g4 M
# M2 m5 Z% I& I8 T4 i; B& h. q1 {% g9 a
//upp接收、发送buffer
% v: C* J$ d$ ~#pragma DATA_ALIGN(upp_buffer_a, 8)
6 K8 x& R S8 \+ [#pragma DATA_ALIGN(upp_buffer_b, 8)
) a c S- j$ O1 s- b/ d7 _ ^; N1 d: l# K1 h6 ?
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];- T; t4 D6 a G: J# R o2 Y& `: ?
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];. H5 k0 F5 s) ? a% c( @
9 G4 S. C# T6 ~) b$ f; f0 [
) g" V# R( O3 ?, \! X( Y% a4 i. ?3 @static bool server_upp_data_recv(Server *server) ! O& j4 Z5 e2 e& ]' a
{ y) p" N3 `9 ^3 J3 a
if(server->upp_channel_a_recv == false) {
1 z5 o. A2 \2 O2 s1 ~6 e2 m server_msg_send(server, APP_CMD_LOG, "upp recv: start");" i4 e% q0 L! x* z
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {: K& Q. l: L) p9 O! |
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
1 k: i7 _% h U( _) U' {! B& F$ z1 R/ a/ c
6 b, u) ~# Z2 ?" K% J memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);7 ^( p$ f2 L" m& K# T M( I
9 n+ A+ }7 Y0 j5 i" ]' p1 |$ K0 u: S2 G server->upp_channel_a_recv = true;//
" H) n$ ]/ l$ g8 h' M server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
( R: n# _' q' }9 N0 z server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
) { _1 r0 ~0 T7 V% U* t server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;" _' h1 D4 C3 j5 ?( s. P, w
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//( y& ^6 M7 t9 G% f
! Y7 }' s) p1 k) Q8 Z1 B upp_error_count = 0;& P' F% ?( Y; e
upp_dmai_int_cut = 0;
3 g9 V% P+ E0 R2 S. n. V) R2 O3 |2 o8 V2 G) y
// fill in data
2 W. L) l9 [. p$ c R% z uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
' ^! N' g- C% b1 Q server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
, W9 [# e8 E& z" I' X$ B/ U }
% |3 _6 T) Q( u. p& w }
! r$ S$ d* T) l else{! p, Z+ G- S( o) T1 s
if (upp_dmai_int_cut > 0){
* S ~( |$ _5 Y" ~/ t8 k% n DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
/ L Q; c" l& A9 r! o Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);' O# c6 Z6 u5 M* x3 E9 R
3 D" v& D3 a5 ` Z! \- [8 }. I" o
9 l' A0 ~9 i0 ^9 z( U3 g, x4 R //copy data to upp_recv_list_busy
! p/ t( P- V9 |+ h) v memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
* I1 X, C& `6 l. H8 ~4 x5 {3 i& b' R8 n" H
//! r" K% V( o* g% K- F3 o4 o
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);' V. l+ c v" r1 K% I, _
4 h# H. Z: Z3 S+ {* \$ h' F7 O
//. B5 U! ]# b I- L0 s! i1 `
server->upp_channel_a_recv = false;//5 a& _0 j6 e' Q# L6 i1 a
6 r+ c2 p4 E9 D; T
server_msg_send(server, APP_CMD_LOG, "upp recv: success");, Q- f% t9 x' Q( p* h _3 @0 j% @
}0 L w7 Z( p2 v( `% y5 ?$ {& J. W
}! e' s, H& n* n j; M1 S. u0 b
$ u: m$ ?0 x! D5 `) W2 O/ S% L" g
( }4 Q: [6 _. M$ L' y0 n: Y' l/ j* K6 m( u
return true;
: m8 s+ F1 E& ?6 @$ X# `1 x4 M. o/ f}
" t8 g9 ?. `+ {
! A- s( ~/ G- v5 w+ n$ X3 A& Tstatic bool server_upp_data_send(Server *server)
7 Q: P7 h+ D4 ?' q5 Q1 T2 W' j{
: j& V0 I% y1 D if(ListMP_empty(server->upp_send_list_busy) == FALSE){
0 z d& Z2 z) Y- _' t1 f DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);# {4 E. R5 l, f8 t; b
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
% x; r* T p' E9 x- i3 |6 j6 l char tmp[128] ={0};
]* a$ G( D( k7 }" y) Y4 D8 F
; F' o/ |& u- G server_msg_send(server, APP_CMD_LOG, "upp send: start");
" ?8 K1 c3 {/ P* G# T4 Z5 j print_log(server, data, 64);1 T) d/ ?# d% \6 |" U3 q# F% {
- V3 E c7 H/ j+ A0 ~# [
//% Q9 x! F: I, x& D* ?- A. i
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);3 P7 b4 J4 O6 d! z; [! S- ~# R
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
6 V" H2 L+ u4 _% [# k( S" a print_log(server, upp_buffer_b, 64);: y z' b0 ^+ j j) O
4 Q$ _2 e2 f( U server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
# a! t& j4 h- E/ M' N' n server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ' |0 n- u4 T2 X
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
; I- x' f; V2 h server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
4 {$ b \6 e! E' w6 w5 L6 x8 H: a3 q
( ?/ U6 Q. n8 f1 X4 { memset(tmp, 0, sizeof(tmp));) X `! i; m2 _2 u
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 6 `: S- ^+ Z, |* ?9 |4 F9 ^
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);$ [) r$ s# h" N
server_msg_send(server, APP_CMD_LOG, tmp);) m( _( v$ G. g' M* b
, H/ L( d& _8 l9 R* p' O upp_error_count = 0;% E9 ~7 }) Z1 h2 R
upp_dmaq_int_cut = 0;+ {0 l5 `3 Q3 u+ S; E( A
// fill in data 9 r; s' {/ K# X
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
) ~( }0 e; {6 h7 D server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");- C* f( D6 L8 K# F9 q; [/ i% c
2 R: y6 s0 d/ A7 Y: y
// wait send success
, |# M- D/ ~6 H" P) F/ Q while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 4 X4 \. X% m5 y& }# Y3 V) h
; ~7 m: h8 x& C) n% T
// make data node in free list
# D6 j6 x' D9 c5 a8 b ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
5 R) i# Q4 K5 s% j server_msg_send(server, APP_CMD_LOG, "upp send: success");
N+ Y5 M( s& s& O4 v& y }+ T3 b" s+ \' c, ~' m
return true;
, ^# _1 |: E* p X}7 |! _' K t. X9 J
9 ^! E: \( q; z. A) q: _
) \5 X( b. s% } H7 t; F# x: Q: v
$ _. t7 a/ a" h+ b) @. p8 u
4 M$ ]% M& r. g5 p6 ^( d |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|