|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
, x0 {4 N- }& N' N
8 b$ Q5 G" B9 {+ k8 V5 k3 T- G问题描述:; K! P* g2 [' t l
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:/ a" w& ~, _- y4 X2 @( t
) e5 T1 A7 g% }. D- \图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
! @ d; }/ t4 E+ F; r8 ^: y* i6 t: v% ^2 T
测试结果如下:
b* C. d3 C2 G; E! J x- u: j138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
" |3 u1 X8 p8 R# [7 @
% z8 O& I4 s: D/ ?
$ ^2 U- B& F+ n1 i备注:: J, r+ c, F9 R* n) ^
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
+ }! D9 o. _* _3 ~2 U, k2、相关代码如下:; n! M: Z7 r! Q. ^7 `& T- ^
//UPP DMA缓冲大小512字节
& B- P5 C$ i; N#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
6 i- ^3 @* i& a' W) a6 J#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT2 ~ |1 }4 H; h) S
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
* \5 {/ o* v5 i( L* E8 K
6 z) W. J s- Z
$ z% v$ U2 D1 [, ^* ~//upp接收、发送buffer
8 [* @1 h k: H, ]9 k& B* u# u9 ^#pragma DATA_ALIGN(upp_buffer_a, 8)
* e1 Z3 }. C2 r2 h#pragma DATA_ALIGN(upp_buffer_b, 8)* D) h5 Q. c, Z1 r6 m: k( @. V
% e1 r) N9 d p7 p
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
$ Q; m- f2 g+ Qunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
a T+ \* S/ b* u* C6 B6 G0 ?3 R4 W: y* c$ D2 J2 A
* _; K6 U2 i) b, `
static bool server_upp_data_recv(Server *server)
# W; l. U! n z! g7 ]8 p{- @# X; L6 C' q1 x2 L/ i) A8 O
if(server->upp_channel_a_recv == false) {$ s4 u$ j8 O3 T- M" d0 N2 Y
server_msg_send(server, APP_CMD_LOG, "upp recv: start");* N W7 L$ r5 Z$ q) z2 p9 \
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
6 J# m X, H! f1 P: i server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
+ b" b8 i b* L$ ?8 b" t, h2 D- U2 y+ O
@$ G- K4 ?' I0 T7 }
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE); c- @; [ K% k1 g- x
0 @' G9 N1 |4 `. y8 `) z/ q: t
server->upp_channel_a_recv = true;//
& ]: Q ]( Z- d9 p# c8 z server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
- w' @* G% _% T r server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;1 j9 P& U' V+ D9 A& h
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;: J% `7 j, L! [5 f
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
9 }" W; r. g- L$ H0 s, U" M4 f7 O/ f* l+ m( ~
upp_error_count = 0;
6 I( r; ^! `" M! L upp_dmai_int_cut = 0;
) s5 d% j* F" O9 u6 z. x1 A5 }/ ?/ \) C8 q4 L3 v3 Q
// fill in data 0 ~( N9 ?, P0 c$ m5 L
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);$ h; y1 ]5 h; I: C! P9 A5 {( e
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
; W8 Q: Q1 Q/ I }
! P- z# H3 M( i0 y# P }' f, D5 c, `& i
else{) Z$ z0 v, R) Y: a4 ?
if (upp_dmai_int_cut > 0){9 b' _. c! g& Q7 Z
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
+ {2 ^$ c6 B" w" k" T5 G3 Y' X Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
: Q( f, i2 U+ N: N4 [. r' [$ ~2 ]3 n% O: u2 V
/ \; c" ?5 m; L* U# m5 I //copy data to upp_recv_list_busy
A/ s7 A! d1 D. ~$ i3 X6 k/ s memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
4 Q8 Q' e7 U0 y) M Y$ o* T0 d. Q+ c+ p" ]9 P
//, y- ]( d( [8 P6 _3 p! v( W) m# |' Z
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
h# b6 }. M( s5 a, _+ c7 O u& P4 y/ _, V
//
% Y/ `+ h7 U' ] server->upp_channel_a_recv = false;//
$ V) d, v& v& m* d# A) z* i
1 F5 Z# g( r+ ]- R- I; M7 s& o! b server_msg_send(server, APP_CMD_LOG, "upp recv: success");+ ?& m$ \, N# f; u- {0 u
}) ^4 [8 I. [; J- _3 b* h( Y2 W
}
1 ~2 G2 k. v g0 {. a4 L( h
6 C5 K) w" d6 d' `' B$ Q$ M% x3 m/ R7 W6 `2 g7 \* r8 q, t, x* o
return true;1 Z6 ^7 C H4 h3 t5 o6 u+ m7 D
}
9 p3 b0 P' E/ K" S2 U
0 o i' ^3 d& I$ l: g( T% Gstatic bool server_upp_data_send(Server *server)
' P% u6 ]; @$ y; z8 g{
: W8 V2 d: n' J2 X; e+ e9 a. b& {- c if(ListMP_empty(server->upp_send_list_busy) == FALSE){9 q. Y ]7 Z+ r7 b$ q' D; c
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);) @7 C y0 U; k0 I4 J, L( f
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);! e- I4 y9 Y8 j+ z7 p1 h" w2 w
char tmp[128] ={0};
! G5 I5 T1 Y5 R9 z! ~) b2 p9 `9 o. h. _+ ^6 r
server_msg_send(server, APP_CMD_LOG, "upp send: start");
" O* l R7 a* n+ y" b3 y print_log(server, data, 64);
+ o; D, R2 r' {" j4 Z1 i8 u( J
& D( G. E5 C2 O* D8 ^ //
8 }# w. ?, R2 a7 P6 [* I memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
3 y! m, S) c9 R8 w memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);. \* Y; a' B$ O2 E$ v
print_log(server, upp_buffer_b, 64);
* h W- N5 I) \
$ f2 d( D }1 o& c2 ?) M server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);. I' U% O! Y j$ O. i* |
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
9 E2 d8 i7 w3 z server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;) _- Z* w* n6 \9 ^/ @1 K
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;4 i$ n4 B( `3 Z. q4 @0 S3 V
1 D/ Y/ h3 E. G1 ?+ t memset(tmp, 0, sizeof(tmp));* R" f& I2 B: a* M& q8 Z
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
& N2 }3 u8 r4 C: k" v sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
2 \# P% G2 t9 L) C server_msg_send(server, APP_CMD_LOG, tmp);
4 P" D4 t2 x$ j/ X: ^; N
: w; l1 L8 f! M- y' i: n$ ~& {2 ]9 c upp_error_count = 0;' _+ }; Z* S6 _5 f- ^
upp_dmaq_int_cut = 0;3 R* c- }% c7 Y, {0 `
// fill in data * m% B9 m/ t) x
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
% K' \7 @+ m; \( I6 D6 m server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");- ?: X. M6 B% E- v- r! e0 ?* z
3 W7 O5 }1 C! j4 b( z+ b% V // wait send success
3 {& V: _( \6 _ ~& G while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
. H7 A! h$ b4 j5 o
& l4 a9 o$ c: U/ E7 n# I4 y2 T // make data node in free list
: p2 G) S0 q- T5 e2 m! i/ `* x ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
( D' A% ]3 v4 x* ^& C# [0 _ server_msg_send(server, APP_CMD_LOG, "upp send: success");
" `& F. b1 n) [; t4 B3 P, } }
( I" u4 c" Y8 M6 [* n# R, u% O return true;' ^$ _% ^6 [# M% Q. ]& E. x' N
}
6 ]9 ~2 F/ a: ^9 g$ D/ [% N+ R& s z% X
! z2 ^- @% J1 o- b8 Q- _! d# ]4 s
! P1 r5 \$ E) _! C, `6 v/ O9 W$ a% |, _9 m' y8 s
4 ~8 d3 `! ?" X |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|