|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 1 h& w* H9 n$ D9 C M
# I% S' s, ^& B5 `5 F问题描述:
; o9 x- z- t9 k4 x* Y在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
9 f' ?) E4 d# ]5 k$ L
! N. i7 W# {7 f- y; U) V图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
4 }1 L' {9 X: B7 t7 U% Z2 i0 Z+ r
2 r4 h& Z: m! ^, W% u) S测试结果如下:
) r: p+ q) t) v8 G138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
1 _% q9 x- ?& X3 I5 `3 ]
H! c& S9 H. J9 `+ J* G& v3 g6 p0 O2 U( S( n! T
备注:
) M! q* q1 x6 J* ^# f1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
8 X1 o3 o; N2 I5 ` t8 L2、相关代码如下:4 ]2 @% o2 ~; h) c8 a. e7 ^
//UPP DMA缓冲大小512字节+ c/ S7 g, K+ F S2 x
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍" Y; w/ k3 b7 u1 g6 X5 }
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
* w# G- B! b1 G) ]7 B#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)5 e/ q# D' R& L) S b) z' i+ F" G
6 c# g# [: X% M8 K) K$ u) J0 [1 }
$ J' P: {6 s& _7 A2 } p//upp接收、发送buffer2 \6 \; t% G7 J/ S3 j
#pragma DATA_ALIGN(upp_buffer_a, 8)
( T) L) A+ I6 g# I#pragma DATA_ALIGN(upp_buffer_b, 8)2 X+ e9 [& K" Z
/ H. }% U2 o* d0 j8 N: \) \$ k
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
& @# J: K5 I$ A5 v/ Kunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];6 c0 I; v/ |: L6 ~
3 r2 w+ ^$ [- V! x
; v+ O, i4 E# \6 Cstatic bool server_upp_data_recv(Server *server)
" A4 U- s! L; ^{
7 m# u; {5 ~) Y* _/ W if(server->upp_channel_a_recv == false) {
2 c, e+ x. E6 T2 F; T6 F server_msg_send(server, APP_CMD_LOG, "upp recv: start");
# ]9 S/ n* U1 k) A* x if(ListMP_empty(server->upp_recv_list_free) == FALSE) {8 D/ W8 G. T2 {' `; e! p# n" t
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
3 A! n) G6 r2 Y9 w) U/ ?' e
# b7 J8 p: A+ c) |" M5 e, @0 l& a* d9 [& D
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
1 g$ t, t7 E. h' ?
; P. x: B s& O' b6 E, z( A server->upp_channel_a_recv = true;//: E$ R& G$ ?' o& r1 G* k' m1 }( ?/ s
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);" j# b) m: [. f( i0 T; V5 z Y
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;: d8 o0 T! [1 F/ u4 W
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;' k0 C6 l Q( y& }9 p$ G
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
7 J7 l4 X5 e1 \
% X! i8 s, O% f% R; y& A upp_error_count = 0;0 o$ Z% b. P' L; s B. w
upp_dmai_int_cut = 0;& z( \8 R' a& B* i. t, m
3 a1 m+ f) `6 p% J
// fill in data
, e2 t, o4 \" m$ |( h uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
9 p. b; \* y8 k* h! I+ k server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
4 _9 i( o+ Q/ _% s+ B }" C. r* H+ j% P- M& `% k3 x* }
}
]) j2 n; K1 C2 [4 \/ }, Z else{
( Y- q( y2 B6 J" B1 U0 W if (upp_dmai_int_cut > 0){
& u1 T' |: z# `$ F DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
4 Y9 @' z2 Z/ G) _$ W Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);( P% k0 o2 S. J
2 ]0 n) `5 J0 w: B& o
, Z9 X' ?+ O0 F' Q //copy data to upp_recv_list_busy
6 u7 ?5 [* J9 @+ Y, c memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
; j9 r6 d. G; X) r
. P8 ~# m; v8 t" V9 a, g+ } //
3 @" H6 i+ r; R ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);1 e1 v6 v6 O5 w; s: e; r
8 |1 U% h9 ]/ H; z' w3 O
//
1 T& p: R8 V! Q8 `$ H server->upp_channel_a_recv = false;//
, u2 g6 S9 l/ K( g7 _, D
4 B; }) r: c7 Q1 z! J/ o server_msg_send(server, APP_CMD_LOG, "upp recv: success");: [8 Z7 _. X: v9 n7 K' T
}( ^6 q( d% i) u) {6 F7 C- [% J
}% k2 |2 b/ l& {- [
7 n3 P; k; E( B3 c. y- W
0 a A) a- [8 z: z
return true;
. C$ F- g! k6 a}
1 p' [. m. T4 G, Z0 t8 y. |/ J& M0 I) z' V G" O N
static bool server_upp_data_send(Server *server)& g5 F* J2 ?2 e
{; d9 s1 s- D# M2 d* J7 Y4 g
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
: `6 D; Q( o0 w2 i5 [ DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
3 D1 [! |/ v& C: w: [ unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);( o* E q4 k: @. a$ K, m' `' D
char tmp[128] ={0};0 E7 K8 x/ z* f2 Q) a1 b
0 t% Y s& L6 Q! W# W
server_msg_send(server, APP_CMD_LOG, "upp send: start");6 x. F! L" C! X( Y+ z3 A
print_log(server, data, 64);/ v; M7 Q% }+ E" X1 I2 O
2 u! c/ \* R | M4 @* H1 E
//
. Q8 ~* D1 l6 a8 c0 _* Z% D memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
. E0 _1 T4 ~/ Z6 C memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
% L9 A, t! Z% U& |) r4 H print_log(server, upp_buffer_b, 64);
6 Q9 \, c; Z7 `% G; }
: h0 @5 g* r# C x: ` server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
* ]$ {& J g; S server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
- t6 }9 U/ ^0 `' y- m" R4 a& s server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
6 D! r( r& J: d1 O+ K! r6 O server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;$ q" Z1 F* D2 G. p |; w
: |5 d' g" ^8 {. u% x- L
memset(tmp, 0, sizeof(tmp));5 X$ h( \* Q% P
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 9 W6 x4 k3 S2 Y, ~1 J$ o
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);! e, p/ m+ s( z9 t0 N# ^' v
server_msg_send(server, APP_CMD_LOG, tmp);
# U8 G. s* `' D G o" r9 ?
. a' ]6 o4 y. Q" |+ Z( { upp_error_count = 0;
( e! K4 `2 n2 m8 G; G upp_dmaq_int_cut = 0;7 S8 Y! E& ?0 D
// fill in data ) X+ [" O8 P- n3 S S6 r
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
* `0 }# K- {# i5 I server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
6 J# O+ @9 ] I! s$ J' j5 I$ |! b& x
// wait send success
; M/ T# i; U+ X( j9 a9 w0 ]1 h while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
4 d, U u$ K9 |$ B. H
1 d8 P& |# P& o' T+ R9 b% t% p( E& [ // make data node in free list
- X3 S. [9 X. m o1 ? ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
4 ^2 `6 |! ~+ Y8 S; ? server_msg_send(server, APP_CMD_LOG, "upp send: success");
" v* M6 y, H5 b- n) K" F }
. }: D u& \- N- d& \/ V+ u5 G return true;; j5 ^9 W/ z9 w; W4 ]# ?, K2 \# O2 d
}
: u3 R9 _* R' a$ _5 K k3 V( n& f, n3 ?/ |$ {5 E& i( K
1 R+ F6 P! f$ z) H
! A* |3 i5 c: z: l
$ v7 \! x g0 E3 D ^" ~
5 z3 K9 A& P( L. G |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|