|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 : P% ~$ o/ O# C
. R2 @5 D6 |. \" h+ X9 u% I5 X7 Z问题描述:
) {4 k' h* R4 t9 A' ?" ~# ~- T7 _在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
6 D5 c5 A6 Q. M4 D3 J7 _
2 q$ V g1 x4 [9 S) A图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
3 f* d3 L1 ]# S8 }# t- X# ]7 E* {4 T c" B. s/ i' w9 K& Q
测试结果如下:, i3 P( `: i4 V: |1 Z% P. p* _
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?- Y' B8 U, y7 n8 j9 j
5 c& u4 W9 W& b# m" h* T& D/ r" O
3 f+ b# c* d$ ]# Z8 T( d
备注:3 `& G6 c( o* d" S0 t' ^' w8 U
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?/ t( P# ]7 ^; t) B
2、相关代码如下:
# v R' K: S, A! b//UPP DMA缓冲大小512字节
. B$ t5 a7 p; r) X' @/ ^% @#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍) m, D" N: Y4 T1 T0 d
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
: l) z1 ~# {; o3 o$ M#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)& }1 ~9 y7 _: W6 r5 |& o
7 [6 A# j0 L7 X% W- l3 r* u5 I, g. k4 l+ }
//upp接收、发送buffer
! _' z% X; c: p' ^. M#pragma DATA_ALIGN(upp_buffer_a, 8)
$ x& N+ ], ^1 ^4 a2 l#pragma DATA_ALIGN(upp_buffer_b, 8)9 ?- }# K, D d7 g
3 M, s, q5 k) n+ B
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
- C- }) P( a, g8 {unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];* W+ T7 D% g; W; `" o$ C/ F
1 I, y$ D, a7 ^) \0 M I; ~6 h; {/ X& K0 [
static bool server_upp_data_recv(Server *server) ' f# @5 R7 Z( g0 y
{) K: l, j% C: f; d
if(server->upp_channel_a_recv == false) {, ]! s: F& w3 e+ P+ X9 D k
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
7 |+ `8 R; A5 \, G0 e& G if(ListMP_empty(server->upp_recv_list_free) == FALSE) {- J# b* ^8 y1 h! _
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
, @3 L/ ]7 x7 x' V1 v$ d' S( K# S I1 g& D) S1 e0 B7 n) V6 _
* ]8 d5 T+ L) G0 z$ z6 Z! a; O, b memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
5 U# Z3 U2 T. `) ?6 X4 h' L p \
& e) ?4 P: g8 U( { server->upp_channel_a_recv = true;//" O& X* Q3 ] d5 D4 q8 w
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a); ~- v& r$ w# R
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
5 ?# F A' |$ A6 m server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;, [3 h3 {+ f U
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
6 D5 k: Y8 Y; X9 U% K3 u5 C
) a, { Y3 q' f8 {" y2 W6 | upp_error_count = 0;
9 O" H: r7 Z, ^* _ upp_dmai_int_cut = 0;/ w$ n2 }/ v- {3 J/ B' v6 }
- m* Z( G1 ~( T9 G) { // fill in data ; n: E8 L7 c. f }6 u/ U0 _
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
, v$ f4 L& ^; V' S; A" k server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");7 S9 K d7 f' Z- {8 r \2 N2 S
}$ M6 Y) J8 s: Z3 ? f0 [& D
}4 g, ]2 ]8 M1 w1 ^
else{# Z1 W5 _# K; E
if (upp_dmai_int_cut > 0){
8 T* B/ |" F; n. I DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
E0 r7 t7 L; e# ]$ O Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);# ~; e" y# A$ F( K1 P: O
! u1 f+ h1 Z1 ]. P* L* [+ k6 L" ?
" U2 |$ x1 ~$ F6 a8 e, \7 n //copy data to upp_recv_list_busy
& D! e$ M. z5 J9 N' v; v* S memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);. N" x6 |: c! S6 j9 x. C
5 m6 Q" V) b* v% I //
1 i% Y$ N5 r" M ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);+ R9 s1 h" K/ q3 f% \8 g
$ r) a& ^! z1 ^- c; h* u9 h! x8 p
//
3 {* ~ }& H; z9 o! k/ F server->upp_channel_a_recv = false;//
" X% Q7 L2 Q5 V) X# c4 _2 z* Y9 d
0 z' q9 T" ^/ Z0 u, ? server_msg_send(server, APP_CMD_LOG, "upp recv: success");
5 v1 L5 \ E3 w5 t' L2 Q }5 M5 g% \9 j, h
}
9 a; o5 |- G( A! L9 |* y. ?5 i
( G/ g/ d& n/ U7 ~) p j& p
( G# s9 C$ }# W: x- s return true;7 M! [. j/ t& e V8 h6 |3 W' I
}1 w1 v6 M; p( A9 f( H
9 y. V2 D. h) O9 P0 f+ Z8 tstatic bool server_upp_data_send(Server *server)
6 Z3 K1 E* M8 _/ V/ m- p{
7 F0 Y( {% i- m4 _' F P if(ListMP_empty(server->upp_send_list_busy) == FALSE){' X* ]% d$ ~4 V3 ^4 R0 [5 R6 A
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);7 O" U3 T- d1 z$ f- I8 ]
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);) n. q5 n: o b: F- z
char tmp[128] ={0};
, G2 V/ ~! D: J/ f5 W& @" V& f. i, R3 [: ~% J; w+ T- j
server_msg_send(server, APP_CMD_LOG, "upp send: start");
$ `: l5 M: i7 j! Y# A) F" ~ print_log(server, data, 64);( e/ b9 G4 H# P# [, d+ p
, i: f/ f$ q: h# S* y //
- [) z: B- |+ ~0 T# S memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);' G2 w# H& v1 i6 n9 M
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);+ [4 l3 b a2 X i. G
print_log(server, upp_buffer_b, 64);. F# H( y1 B$ }! n, h4 `! i# r
5 t n* N2 L0 D/ w( j( e
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);8 Z0 v& i2 q- @# e) I! \
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
/ F- N, A0 X/ C* Z$ [7 t& ] server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;7 f) y. h b4 X
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;6 [2 S, [; K8 S* G$ K' b7 E( z7 [" S
' u! q9 B# w6 j. h3 j
memset(tmp, 0, sizeof(tmp));# A; U: Y6 o* H6 d/ g: ?4 @) s6 n4 i7 k
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
( |$ d/ W7 I% S3 M sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
2 G6 D( |# r! e' V$ c8 y- w0 c server_msg_send(server, APP_CMD_LOG, tmp);0 V& a9 G. \( o6 o& l i2 N9 d
& j3 r* ?# @# x1 N. {7 A; h
upp_error_count = 0;
: _# p( U, H% B+ a/ u( _ t6 h+ _% J, q upp_dmaq_int_cut = 0;$ U. F+ ?. b9 l% l! |7 J3 B6 d3 Q
// fill in data
( b6 I* i" ]: J uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 2 ~0 i& w8 B8 \' @
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
( W" ~- z! g' Z7 w1 }6 {% {9 ~5 m0 h! i/ @. n
// wait send success- I, }" w- N( n% e
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 9 J! F* F+ g# H2 I( D
0 l0 d+ x7 d8 O6 E // make data node in free list . X# L; V$ k9 k0 w, J* P4 f
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
2 B# x8 i& J' T W- Y2 c/ w d server_msg_send(server, APP_CMD_LOG, "upp send: success");) \8 x* P! L: J
}
( D5 b- y9 w/ J9 b& t return true;7 m$ i+ L* F L5 U
}
- h! ^8 V3 A; s) D5 T1 C3 U
: E5 D" s: {3 ^* ]3 p9 i5 |/ m
: `. C& k( f* ]% z) M( L# R; y' l8 n. i$ b! [+ r; y
- q5 G Z5 B6 i8 r$ Z* k- R" ~$ f2 i; \( _
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|