|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
8 K8 A3 t0 V6 G1 g
, \2 @) ~& i. Z$ H& R+ u1 a- z- B问题描述:
. w9 Z8 N4 O+ b9 \4 K4 g: p. H在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:9 p( @2 f& W( ]* T' T
) F8 v8 Q0 B. E6 \- u" ?( c图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
* N- o3 u1 e5 u$ k6 o8 o# u9 ^; j, t1 n5 S
测试结果如下:
& {, a. [5 Y" e# C" D138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
1 S" T+ f S0 q: @. |/ t+ K: e. V u+ d1 B
9 ^6 t' j% @5 ^5 x
备注:: B$ D* _$ q' e
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
# K/ I6 _2 D3 ^2 c; E. m% y2、相关代码如下:6 [: L9 M; a$ |( p. p b' q' Q
//UPP DMA缓冲大小512字节
`7 {# v* G1 a. H+ [, Q" k9 ~: X4 v#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
4 u, u H6 W3 B) J; N& ^4 ]/ F* I3 v#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT3 i/ j$ n+ P# F8 v( |
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)8 [( [' G8 ~% F5 K
4 z% E& p; _0 n9 J7 v
$ S; D' F6 p" w3 u//upp接收、发送buffer0 ^6 O" F- K7 g7 i" [; l
#pragma DATA_ALIGN(upp_buffer_a, 8)( ?& _/ n2 D9 |: F
#pragma DATA_ALIGN(upp_buffer_b, 8)
% J$ i) A! q+ S$ O7 r/ A( x4 a) q, X6 I3 O- F
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];" ~ v1 ^. v' P% b; N
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
* U z0 N3 I9 U3 F+ U& z M& V& ]. B+ Y% t
; E2 Q8 C1 _) E4 H' p# l2 ^
static bool server_upp_data_recv(Server *server) . x! B$ E; n9 X5 o
{
- m# @' E) b/ q+ k if(server->upp_channel_a_recv == false) {+ k4 A" O0 K1 w8 I+ U9 w; g
server_msg_send(server, APP_CMD_LOG, "upp recv: start");: e/ p4 b3 R. z7 }6 e/ x% g( X) i
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {7 p4 R/ j* q. b1 V9 e# C( s1 d1 c
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");- N- O/ @; N/ G
! U9 k+ r! S( w, v
+ Q$ u) _! M, s% A memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
- Y2 E0 V1 ~, s' t' W$ M0 B0 Z2 q o2 b1 j% |, j3 L
server->upp_channel_a_recv = true;//5 E4 u' s& t4 X4 ]! c
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a); H8 a2 k: h! }5 J; @/ h) D1 Q
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
% U: X) C' c+ e0 c server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
& v+ y) u4 V' Y! [3 j, r% Q$ E server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
3 a* R/ r9 p2 g! f
& b6 Q! j- G4 g7 a0 E* a upp_error_count = 0;
! V- C* t* ~" b1 N% A- C# P3 W upp_dmai_int_cut = 0;
: O2 A& P' V4 F4 I- I8 W! H7 t3 Z; F% m9 K
// fill in data " I- p! | a/ k; B0 w8 N+ \
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
1 ]5 {( t/ ^! y5 c Y' Z server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");: ]8 r: }5 Q3 v) [. ]
}
- q- r3 n/ n; o Z! J }2 h4 n" n5 T$ }8 s) ]
else{
; j) p& |. J+ ? if (upp_dmai_int_cut > 0){- R# h8 ]# ^$ ?. ~& o# y
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
' f6 s# u5 B9 d8 r4 w Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
" ^ `' o! a- M' J$ H' l0 n+ |* h" k* v$ ]
5 o1 p- e; r& l+ F3 b6 J; C
- c" f# {# a& Z' P //copy data to upp_recv_list_busy9 |5 R5 p) g8 ]2 o9 d
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);: P4 q+ K, v+ e# R
9 \3 J; x8 q D8 A //
. o: m9 D' a% L7 }5 }$ i ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);4 H: c7 O5 Z$ T* S
+ ~. z) d! n& }4 l //
5 j+ N. F7 ^) m/ ?+ Q server->upp_channel_a_recv = false;//
% B( d! j- S7 M+ c% n( E) O9 n7 l; d8 {, J
server_msg_send(server, APP_CMD_LOG, "upp recv: success");$ f# u, M3 }5 ^0 O' s$ [; J
}
5 B$ u ~! I% t! Z1 `" y }
' R$ s6 y& N! t, R- R/ W. I4 }8 q' Q6 u& A
8 _ v: B4 c3 X* b9 R3 B0 Q
return true;) U- S4 y \. w, |! A8 B d- d& c% F
}
. v- i9 {: d3 J
W6 W( q! f4 ?# D9 l: {static bool server_upp_data_send(Server *server)4 c" m0 p' o; W# t* E( M
{
( u! L8 k D/ g3 [& s if(ListMP_empty(server->upp_send_list_busy) == FALSE){& ]0 |0 q$ m6 N; [& K) x$ G
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);7 Z, ~/ F( B* F& _0 S' J3 ?
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);9 n9 T% J' z# ~' `! s; V
char tmp[128] ={0};
" g. L }( ]. B7 Q8 t- m1 L$ U( Y' u3 n' V' o! h$ B
server_msg_send(server, APP_CMD_LOG, "upp send: start");
) q. u1 v/ A! {) b& [1 t print_log(server, data, 64);! e& X3 v6 J4 x) Z
" M G5 g \. U //
& Q8 c k% b: t4 i8 c memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);. f+ u0 |' i# a4 ~
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);. n& x A' N, z \
print_log(server, upp_buffer_b, 64);# E- y7 o$ X8 V( ]
3 c% {+ U- K9 u: H7 B server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
2 C8 e7 y5 o( A6 X server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
% e9 Z4 _% d8 z: r$ L% A! P server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
& c! c+ Q! \- G" _5 A# P N4 r server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;6 B. K& q y, B# N5 R* P8 ~. q/ E. l
! y+ P$ U8 L$ U memset(tmp, 0, sizeof(tmp));) s' p; }) J- Q* R5 s
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
' ?2 g" U( b! z4 D sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress); {/ {( h/ c" W/ x6 S) n/ H% |+ c
server_msg_send(server, APP_CMD_LOG, tmp);
- {' o) X4 L/ [# u8 H# t' a: y7 E$ o7 _/ C
upp_error_count = 0;4 I, ]& p! d! @2 }% D0 `
upp_dmaq_int_cut = 0;
* i( m. k0 l1 d) U1 n' @ // fill in data , A8 c7 R- l5 c& r) G
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); * p, \, Z+ ]$ s; p! u
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");/ X4 J+ y: x# w& k4 b7 `4 v: j v* O
/ O2 K9 q3 o5 D1 s$ @" G& I- Q
// wait send success9 h# y- N- `8 ]# s8 t
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
; s9 E- J! J& ~' ~: U% u0 p H G4 ]4 Z% N L* M7 C( q
// make data node in free list
6 H5 \4 j+ l- U% j1 \! K# S. A ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);1 c; Y9 Q- H* ?' s |0 o# U
server_msg_send(server, APP_CMD_LOG, "upp send: success");
6 e# `' X) c Z7 ~6 ? }: O! ]3 l% b* a& X
return true;
3 [, n& ^4 \9 B- [ N}& q! G6 V8 b- }* W/ `" [* l3 S
7 C& V0 U1 m; x- G, y4 X$ O( v; S$ M8 ?; M) ?
" u' y% l, v! M; F7 n* f
# V# [6 j# U9 C- q W$ A
5 L! L& _) D( m" ^ `$ O |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|