|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 7 a9 w( Z4 s" a& F; `
( n, K7 d, R' W) f& V" G
问题描述:
' [6 U) K9 O+ O H2 Q: E在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:6 s j2 B' A; G7 Z$ E0 U
! @: j. B' t9 \- g2 y# k
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。, B5 y3 c2 D+ x
" |+ ~0 X6 }4 |7 R
测试结果如下:6 j- e4 u6 g( g2 q2 W/ h
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
# S3 w4 }/ I- |/ j% {# N4 J
3 \) i L$ o4 o# @1 n. C& p/ E$ ?6 v2 M4 A8 b
备注:
5 g# f9 I9 l$ u4 Y1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
6 c) B7 r/ B5 v$ B, [' j2、相关代码如下:6 Y* T! Y3 Q, h( |0 [9 R3 z4 s
//UPP DMA缓冲大小512字节
( a6 H! T! w9 _#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
$ ~ ]$ z* G% ?3 U2 @' @6 ]" w. _#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
5 A) ]5 Z" B- h, C9 w#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
, ?& ?& K) ~1 i# H, y
# X. \. I! w+ M% y5 M% S8 e4 I8 I7 D! M
//upp接收、发送buffer
/ z0 A" c2 S% E! o- t) b#pragma DATA_ALIGN(upp_buffer_a, 8)9 K0 C" [" |8 r" e# L
#pragma DATA_ALIGN(upp_buffer_b, 8)
- F3 R/ B' k1 J1 d5 g. ~8 x( M; K2 u
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
: a& s1 d `4 w# {, `unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];: s2 \! I ?8 J& @) T* w* k8 \
, O9 M6 {/ L" k, ]7 |& C
! Y* _) s; s# t( [/ B* Astatic bool server_upp_data_recv(Server *server)
1 A x* l: ]. L{
9 g: o R6 t. W( n' j if(server->upp_channel_a_recv == false) {4 I0 ~0 T+ h D1 U
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
. H* k/ g4 w- Y( C if(ListMP_empty(server->upp_recv_list_free) == FALSE) {+ d9 K/ _2 l! F
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
2 n7 g0 q+ \3 D4 a/ ~6 @8 e1 {' u- ~3 ~6 N( \( z5 ?8 B
$ }3 t% }% V* q/ T6 k+ e
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
7 i! H" P2 ^6 e
2 N! m6 u5 k8 p& P7 W& e server->upp_channel_a_recv = true;//3 |0 E: v) a1 c8 p) T- h8 N
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
2 F( a. d$ ?) m% [- T server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
( I5 E3 ^! I; T" ? server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
, E4 d8 c, x- s1 h( Y server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//( w4 ~; `! t# L& h" T' _8 Q6 p
R) }" c* E8 M1 k4 v2 Z upp_error_count = 0;
; @4 g2 d4 ?( c7 { upp_dmai_int_cut = 0;
( ^4 K9 s! Y8 y3 o: m6 v6 v7 U! o/ w3 a6 C; s2 t
// fill in data z' I# l M2 G& x I" m
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
, ?( A z9 P' f$ Z6 T9 v server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
/ n# v: ?! V( g- q1 |/ I }8 I3 o1 B Z) q. h+ i" e- V
}- @# K: S' o I
else{) ^% ]7 Z! x3 [7 V9 o p% x
if (upp_dmai_int_cut > 0){; v1 ]. t) `2 L2 ~4 `
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);/ s% S8 e' f& S2 k2 @
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);( N! A( K3 s6 i, }$ n* q+ W u
9 a+ h: k5 t. l2 W" |' v9 b
0 R+ C! ?2 m* [) O0 t8 f //copy data to upp_recv_list_busy
! l$ k! W5 p0 n3 V1 D memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
2 o% `8 e( [, U1 X3 K; k
% A; h4 t, { ]0 s! R9 b9 F7 m //7 l& {% w) l! a, `, U7 O2 E- k
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
9 E) N( y. U( u, t" k. U0 g+ s7 z& c7 ?$ S
//" n! ~" D# a4 R, O5 t9 ]
server->upp_channel_a_recv = false;//& E, i4 E/ C: Q4 O
9 Y3 C( v/ z W3 S/ J7 r
server_msg_send(server, APP_CMD_LOG, "upp recv: success");7 @) P: ^) a6 o2 t
}, z# p9 G/ ^4 t* ^* I7 A2 z! Q
}3 d+ H. ^ a5 S* J; j* V% z' O
# t2 v: B, @; V4 d/ ~$ B7 |6 d& K3 T2 {3 J
return true;0 Q) X A$ H+ a: Y
}
+ T4 T6 h/ g$ E: w% e4 ?9 v; f `; n5 J d4 R3 `& g8 \
static bool server_upp_data_send(Server *server)3 ?% {9 g5 ]: [9 Y
{
0 z7 z% o' Q- Z2 K& _' j9 l if(ListMP_empty(server->upp_send_list_busy) == FALSE){
2 w' I: i+ E& y! _; C DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
, F# p" K8 W- h3 J unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);$ f) R" d2 c. ~2 ]2 w6 ]
char tmp[128] ={0};
, _' k" n9 h3 a' M
0 k5 q& C: f7 N9 e" { server_msg_send(server, APP_CMD_LOG, "upp send: start");/ p" J S! ]. Q8 R O% l' [
print_log(server, data, 64);+ N* Y% {. B: W! ~' u7 b* |" J
- A0 U' [, b, g# y! _
//
! C- T* V2 |! }- L# ~ memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
9 P4 m/ w4 G% J, i4 {7 | memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);7 d `9 v( V2 z0 k3 D. j; [
print_log(server, upp_buffer_b, 64);1 Z9 ?; I; |2 e+ d1 Q
$ o# g/ L3 P( K- C1 h2 n+ C* a server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);, b! r3 h% _: ^1 i2 [4 h& E( I# i+ f
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ; L# P f1 w4 n7 g- P0 b; E
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
6 y6 |) K2 F1 e4 m server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;( g( r4 S( W3 p0 v0 \
% q& x8 x9 I- o$ V/ v0 N memset(tmp, 0, sizeof(tmp));) L. e7 \; w" r4 h. h
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 1 S1 ?8 B- B1 a+ J
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
^2 H, k; U5 r7 _: A! ] server_msg_send(server, APP_CMD_LOG, tmp);" D9 s( u, q4 S2 b& l
! [- W' I+ q# s9 ^
upp_error_count = 0;+ F3 q( {- e% r9 L+ h
upp_dmaq_int_cut = 0;
7 V9 `/ G$ u9 }7 V+ H // fill in data
; d$ R5 C+ M# i% q0 P7 m uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
) L" O0 @3 A1 K# S- K server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
3 L1 P2 m; X+ P4 n u5 s& t$ I- p: m% I) Q2 @8 l
// wait send success3 }$ E1 c4 [7 ^$ a0 ]7 x7 M
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 2 [- p, c0 E& {( V# m3 M0 Z
1 |! q1 W5 p' V: x' p // make data node in free list - I5 @7 A# A0 E
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
* s V* R# P0 Y4 \1 p server_msg_send(server, APP_CMD_LOG, "upp send: success");
* K* g* }0 N1 j, r& i }# |5 g5 ^) A4 Z) X/ b( I6 y( l2 c
return true;- ^% P4 `) x S1 C
}/ ]* R- i, V# P0 @
; W0 c3 v q) _- u- |
7 O, ]& e, T& j d4 o. X; d/ }
, C7 n" |6 ~; `$ j0 v/ W- N2 M+ R) E; X" l5 ?% H
8 Q/ _. ^3 Y4 H6 d9 W( L
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|