|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 $ m _4 N6 U8 J: t
4 r) a. g. J' B' Z; w问题描述:
2 u e# R2 p. V在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
9 A& ~* v& [, s) y9 x3 N
% v; ^" p$ x4 V m图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
: ]" v, h Q) e2 \3 F4 p5 W' T- v% L/ m0 }% k( m$ m9 W. c( F/ D
测试结果如下:7 c: `* f$ p2 P1 y0 |
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?2 Z2 U9 p0 `& h3 T' j" ~9 R
6 A2 {& y: \# X9 }; { q, R" n
8 }2 S$ `7 Z, q* {6 l备注:
: F8 J& G l, P/ S4 Y( h& P1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
- c5 f% D. y5 f. j) I8 U: Z1 H1 E2、相关代码如下:
, x* @8 {4 {8 b" x H. X//UPP DMA缓冲大小512字节1 ?& x1 L. b" d* t3 C- T
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
/ q/ z. a1 T4 m#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT' b8 h7 x; j' K7 @0 p: ]
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
+ i: ]. E, G7 S/ f1 t+ A- G/ Y& Q3 f
7 D/ ~) `# l0 A1 u
//upp接收、发送buffer! y. C$ w+ [2 {. \5 U6 k
#pragma DATA_ALIGN(upp_buffer_a, 8)
3 e! ~ a; [0 w# i#pragma DATA_ALIGN(upp_buffer_b, 8)! l+ |" E3 H3 j" A7 u) L* X) ?5 u* v
7 L' m% `' D& w
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
- @& T* N- O1 y7 Y# }unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];$ w, [% |( ?2 B q! S' A- L: A
2 X0 {+ N3 R6 O; }& d
4 c( E2 M V0 estatic bool server_upp_data_recv(Server *server)
3 E6 R+ `8 I. u( G' X; b{2 p$ W% \' ]- g0 ?! s- R
if(server->upp_channel_a_recv == false) {
+ @ Y8 {- n) T; d' h4 {4 i server_msg_send(server, APP_CMD_LOG, "upp recv: start");7 {! A( E- V# t1 N6 N4 W) p5 G
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
8 Z4 ]8 `; v2 j3 P* ?$ l r server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");* K2 d0 {! U0 `; X1 {* }" e6 T
; V# m+ c, e* A f1 b- D7 M
3 M1 g1 E" ?$ {) X o; Y4 ^
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE); S" }' T! M1 ?5 t
. ^9 \; G, s' o) p9 m6 Q
server->upp_channel_a_recv = true;//
% L6 j, N: K' _! z8 d$ @% L% Q server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);+ W$ T( ^$ ~" Z) v v' F( X! Y; B
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
1 A3 r8 m+ Q, V) \ server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;& y8 _0 p' v) Y. z! {
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
: x' P, m" @; p: T7 _* S
3 D4 l# Y% l# p6 d; \8 W upp_error_count = 0;. z9 O" Q/ t) V) M ~3 B
upp_dmai_int_cut = 0;+ t4 o$ s5 h7 h3 V4 x* _+ R* J4 g
! }& N$ j4 t. b, x, I- E3 W
// fill in data , Y3 k& ]; |" G) I: K
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);" P: T5 j. l8 k+ w( s
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");+ F1 [. ~) Z$ [, N% L
}& N4 B$ Z4 f1 L Y
}
@) }: r9 P0 G1 g1 }9 G else{9 e9 {" l' V" k4 V$ J
if (upp_dmai_int_cut > 0){
; t. I! U; d0 a8 { DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
) E5 B: _! T0 q4 n3 A1 W% @1 M Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);% Z( {, v0 {( P: b0 m/ T
" X0 H: P1 o; G" o) p% _+ J/ a
# M) ~$ d; A" M$ ` //copy data to upp_recv_list_busy) A" ~) r- E, U* K8 g V. O- u
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);$ ^! ?) l$ w' v2 K+ S
9 t* H9 U- m% u+ M0 x1 b& R. d6 z
//
% Y. h4 _4 L) W5 G/ C2 I" \* X) L ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
" w1 d" y e8 m# ~' _' i2 l3 x: \# b0 d
//
$ U1 [) |& F w; m4 P9 A6 D* S server->upp_channel_a_recv = false;//; q. J. R# L. U
$ W$ D5 T7 Q% f
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
1 e1 t3 n2 ]' X: K }$ B" K! {0 E7 O* t1 c6 Q) b
}
* e2 u y: r3 O [! Q2 D6 G2 Y
2 W2 F" o! s# Y
N; }4 U q3 K$ J9 L return true;( l1 D# {. I8 _4 p
}
- V9 d" @; d; n/ [" u
5 ]5 ~# j2 F1 Y6 t) estatic bool server_upp_data_send(Server *server). j1 U2 L! d" {( Z$ ~! F
{2 j3 E% g6 [# H7 D3 H0 w
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
: Q* M2 R8 j6 I DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
6 R+ d! d8 b+ C* J3 @, r9 w% Q unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);6 e7 W' Q( Y: I( S+ l% X9 F
char tmp[128] ={0};
0 ]" G. y2 P' q/ v9 V' {" D( O! s# l% \
server_msg_send(server, APP_CMD_LOG, "upp send: start");
. g. I! o" K+ l G print_log(server, data, 64);
0 m3 }% Q* d0 l' c/ P9 A/ p; F: B6 p1 W6 X1 M1 W7 O
//- p+ Y: C2 ]. d+ I, R4 g: D+ \: R- {
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
; r# y& g8 V: C$ p memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);2 r" F: X" @3 j% B- P+ a/ X
print_log(server, upp_buffer_b, 64);
' }' \6 q6 |5 S
2 \8 R0 a5 n8 m9 t5 R- g0 N server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
; B- W2 J/ l# t0 _1 a" ^ server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; + x& `. n+ j; h2 G2 [
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
" c* G4 U. R/ L) L4 | server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
& \$ E2 \# ~% N/ c' S) \( z
* p0 F! {- Q' Y- ?, ~" x7 V% I memset(tmp, 0, sizeof(tmp));3 @' R4 L/ @. i' e* s0 Y% N
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 0 Q# [# F' b$ M) s
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);4 l; F; a+ y* [' J+ ^3 g# k5 w+ w) s
server_msg_send(server, APP_CMD_LOG, tmp);
0 K' {* y% n: I5 |8 m
9 C: c. S5 }' Q upp_error_count = 0;
7 ^) ?& f2 w" y0 I upp_dmaq_int_cut = 0;: c% [0 n& U0 f4 ]9 U, G+ A5 W" F
// fill in data
& x' C' B1 _4 B* M2 H$ y+ k: d uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
# `: g3 b* y2 M: \' o3 b server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");# ~3 {, M! P0 a2 D! P: I) [
0 {- U' T0 Q: {6 c V+ ` // wait send success
3 N) {; D& H" J/ M while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 8 N. Q# p$ ~; h( ]/ d: e. [7 j) Q3 J
# q g! j- }1 w& u2 u0 Z$ O# Z
// make data node in free list
* c7 l! n9 ]% x! [) k0 D) Y$ u. _! V ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);) R3 r1 L# c$ w, ~* {
server_msg_send(server, APP_CMD_LOG, "upp send: success");
' P7 U# Q4 X& `7 o. Z1 s- @ } u; L% E! q3 ]4 Z! A. a% o
return true;" Z# a' b# p9 q' |+ v- h7 m5 f
}
, |" O" ~" j- Y/ J6 a+ K: ~2 F9 @0 \1 _) U m
3 c) Y' i1 M" X1 h) y6 _1 U1 w! _7 a) \' _7 M! b9 ^9 u
# `, N; F2 ~' j! O( K, s
u* N ^; i* S! Y/ R |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|