|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 0 c) C3 a8 E) P$ [( @
+ M* z: @$ l* [( ?8 B# f
问题描述:
" X& _0 c) y. N+ @6 o7 l' @在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:( \1 K; n, k Q
- ?# i+ Q4 H) e T$ F( z: z图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。" [7 s+ J. W! u* X. A7 m& P/ G) C& Y
6 _7 z# b' F. n) O, d" |测试结果如下: I. r; e# L& u- e$ O) D5 U
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?9 A% Q+ l( `3 t6 K" {
4 B9 c# l8 F6 g0 A% M l- m1 D$ p# J7 V. a, Y$ p3 E
备注:
6 U" f; `) P5 J( Z1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
3 @: K8 @% J t# t1 w) g2、相关代码如下:/ Q( k# v4 h9 Y3 @7 ?8 G$ R
//UPP DMA缓冲大小512字节$ |, x- u1 o A
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍7 B' M1 [+ V3 i8 G/ E2 X, ~! G
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
5 g4 L8 X( X& j) \#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)5 d( [% W4 U8 j) K7 t
8 h9 @7 z5 B$ ^) }# r$ S$ P. g/ {- O+ h- v3 ]6 x; X5 @+ p7 v
//upp接收、发送buffer! L" i, s! o' {' j) J
#pragma DATA_ALIGN(upp_buffer_a, 8)8 _& v4 c2 z% z2 ]9 o1 l% |
#pragma DATA_ALIGN(upp_buffer_b, 8)
) |9 `5 K% E) R
! C" X ^2 R* D- H. I3 Z3 h$ nunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];, t6 f" }/ T: p: ]8 o
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];! ] W8 Q8 |/ z3 |! G
D8 @: ?7 x3 r! N. t0 l
2 _3 K( L3 |! j6 `* N5 X. nstatic bool server_upp_data_recv(Server *server) % Y& H7 J1 @" x6 [7 ^* ]7 h
{
$ Q# d2 {/ j! I1 v$ ] if(server->upp_channel_a_recv == false) {1 T3 h# C( r! \4 f7 X6 P2 a
server_msg_send(server, APP_CMD_LOG, "upp recv: start");2 x3 }+ G# g! Z/ C
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {& q+ ~) D9 D( B/ i
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
/ p2 v, F. t% D2 E7 E! `" m% H7 e; Y& } Z' i: c0 L
' }) n7 q# G3 `: G memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
0 z0 u2 H3 A" z1 y+ J( K9 E% P
0 w. R& q8 C- K0 T |8 J5 `) Q/ _ server->upp_channel_a_recv = true;//( G1 g: W9 @ S: n
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);& {6 Y7 G# M& S4 j9 ?) W
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
1 g* ~9 C- q. @ m server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
) N" _) s3 [0 ~* u |' N8 @3 _ server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//6 g( Q9 t+ T9 k# x. u
" P. D0 U- F, _* e upp_error_count = 0;
$ [7 d' c. O7 {# x8 l2 p upp_dmai_int_cut = 0;+ z S8 ^* ~4 E' O: X: H6 ]
& d) m8 [) @ W9 G: y // fill in data
. `: b0 h9 ^+ E7 O uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
+ A: i; M, N9 }" \" U6 z U server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
, Q5 @/ g4 o- s: k0 G4 m' a8 K }* n5 u1 O% u( F. c/ o; i4 D
}% P" p$ V% v9 g0 w; `6 G# U
else{
2 Q% k* ]$ P7 O W6 [# G0 J( G if (upp_dmai_int_cut > 0){
2 F" z* n7 m2 ^1 U, _6 Y# n1 x/ y DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
) ], F* t2 b' I% U! k, D Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);/ D- @6 Q2 ~( G, ?) j% B
; q5 t- s, O+ M: i# J/ w
) m6 ]$ ]6 r7 M0 H9 X. ?# [5 a1 k7 r
//copy data to upp_recv_list_busy
( }2 T, h* u5 r Q+ ] memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);5 G$ U, k6 d; O; l/ G
* O2 m2 Y1 R$ T: A* x
//( p' x; X# v5 ?* a
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
# g8 ?9 i" h6 Z w
- G& v [' U% l/ p7 i& c6 l9 z //
2 d# g, n) p! L. z, o! D server->upp_channel_a_recv = false;//4 W# v: ]; _. m7 N' s+ ^, u
; K; n Q" t. `1 ]/ f& a server_msg_send(server, APP_CMD_LOG, "upp recv: success");
$ q- T( c$ C& x) m }; i% F1 W5 e l: T W+ F
}5 y. ~- s/ X$ z1 C, v! u9 V
5 L8 u. k* F$ Z' t5 a* b* H
& M* @2 v3 I: ~1 Q. d5 A: Q return true;
% P# j/ S( I4 A3 b6 Q& \& ~9 ]}
5 T3 H; |$ w# A8 n! u
" W5 t' r- J' |& }+ S P7 f' xstatic bool server_upp_data_send(Server *server)) }+ [+ T G. d8 I
{
: R4 S$ ~* r5 P+ ~ if(ListMP_empty(server->upp_send_list_busy) == FALSE){, z1 z* s; ^# n/ N6 q5 L4 Q
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
- x/ a$ N+ \ B unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
5 n5 U- a. ]* C" k8 ~3 J9 _ char tmp[128] ={0};
: [6 A4 b$ b7 v( b# h
b$ I, v5 R7 y6 E5 T server_msg_send(server, APP_CMD_LOG, "upp send: start");. t* L8 s9 _5 R4 A( Y6 ]# Z& e3 J
print_log(server, data, 64);" g8 Y# u7 | H1 E9 Y
+ ?7 F2 s. V& W+ E" a" [0 I+ Y //
7 c1 Z! O& H, o, u4 c& q1 U memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);, `7 K4 i9 e) f' i4 m3 ^' `: L. @
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
/ d w$ [9 i/ q: m# C print_log(server, upp_buffer_b, 64);
4 I0 V& X1 g1 U1 N# k/ d7 {/ r6 ?! |# o
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
$ j# Y& \) P7 B7 I8 i6 ?) t# w server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
0 b g5 Q* K* o8 d* p6 J$ s$ y3 E server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;" P9 |, ^7 w- f: ~+ d" k `9 m
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
0 [! C. E" g. Y2 r: ]/ L! q: ^/ n/ c, G) R
memset(tmp, 0, sizeof(tmp));6 y: I# z% R& d5 m0 }
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
* n, o5 z( X, ], e. ]" ~ sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);- F$ v% p$ C* t6 w2 T& z
server_msg_send(server, APP_CMD_LOG, tmp);6 k) u. L" |2 N9 m
$ {; f5 l' r& B9 ^9 P
upp_error_count = 0;
3 t- \+ Z, ]/ s* H; C3 M! V upp_dmaq_int_cut = 0;% k- g1 r% i( F0 g4 N: h
// fill in data
% j1 O. F; @3 |0 { uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); , [+ S2 H, i' v
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");/ ?$ f- M2 }9 G& ], m
+ H; q. b) i2 i: S* @
// wait send success
& P) c! l& I; q2 O/ F- h while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
! e* _5 K* ^' d4 v5 b/ G4 d5 l8 w( D" w* p a
// make data node in free list $ K( \# @* E; i2 t
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
1 \# k- K) m1 P6 @/ W server_msg_send(server, APP_CMD_LOG, "upp send: success");
( F' {1 N9 R% C, j) C }( y; s( m B+ Z+ ~5 f
return true;% l7 d' {/ k J/ p3 R; O) Z8 N4 f' s
}' I. [/ m, `; m! q& R2 K/ u
# ~. t1 B" c' ]3 Z6 r: z
/ F4 J z7 X" X- z- u7 f1 _. \. \1 i7 x# O: B4 P+ U
# Z% l( h$ a+ c3 H$ W; j5 j$ n, w# c. ^6 D9 ]
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|