|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
# Z9 i: t' q) ^. X$ a# C$ G9 C4 f' G3 r
问题描述:
, q/ h6 B, R4 f! H在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
. A( v& X+ U5 u+ q" F" D. b, N$ Q0 C+ `
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
2 A! G' q' h" Y$ |# ~0 `. s/ \, m3 F7 {
测试结果如下:8 G! @1 q( r& l: h8 v: _% Q6 n- b8 P
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
: q, j& Y$ G) Y1 a/ n1 m8 I! b' O P) R! u
, ~/ a. ]( ]4 {备注:
4 y- t' ?2 Q5 J. _1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
% n5 g C5 B. w! Y4 }$ z2、相关代码如下:8 X. h" ~6 i' u0 |# s. c1 g/ G
//UPP DMA缓冲大小512字节0 h# B" _! f6 i- G; `9 Z: ^& g
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍* v9 |! p% S7 f6 |
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
2 N: P. V$ y9 F% I#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)6 L% P1 n: F; D
& h; j7 D) B$ }: o" z/ y9 L6 | f
//upp接收、发送buffer& F6 N, i' U( ?+ m1 g; i- j
#pragma DATA_ALIGN(upp_buffer_a, 8)! v1 q- I, y, Z, _1 c8 v
#pragma DATA_ALIGN(upp_buffer_b, 8)
: n5 @+ u7 l* [
' a/ c. x. v& t1 f/ k1 bunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];: Q6 ~9 I( F0 N$ v
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
0 k5 E5 y' E; b; l# e& ]% @ Y! Y- F6 q& K" D1 d @& j0 O" `' i
( d1 f0 M7 y# n& W% a" P) astatic bool server_upp_data_recv(Server *server)
" N- g0 z$ ?1 {, o( M+ a) @{
# n7 I4 t# K D M# u/ U7 h if(server->upp_channel_a_recv == false) {
$ K6 W$ w4 g+ p: _2 V3 D2 s0 C server_msg_send(server, APP_CMD_LOG, "upp recv: start");
3 f% f U1 t, c* u ~% M if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
2 J/ c5 R0 i r- l. ~7 B8 X: J server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");9 N. A4 h. Y% M ]! K: X" `
+ `2 D3 J5 [; j7 l* g6 Y
6 w4 C) Q* H% M" ^7 j' @; t
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);- [* N1 s; E1 M) W
; D+ d; b$ U- S) |' _$ |
server->upp_channel_a_recv = true;//
/ P; a P p7 o8 z4 c server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
" Z: ^6 ~1 n/ q server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
. [9 s4 \/ h3 A9 B! o, m% I7 i server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
7 l, m2 L! n5 `) d! ~: X server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//6 Q! j/ r. x9 g( u; }
6 N' t/ O4 |( Q' D7 {8 M& ?- |' n upp_error_count = 0;
4 _) x$ z( w; R& C! @7 P upp_dmai_int_cut = 0;
$ F0 B: _9 V# ^! Z" q5 D2 O9 i+ K/ M# r
// fill in data
- }$ g+ u l% W: \ uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
% `. X3 B9 e2 P server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
" M G5 |' \" I4 S( f$ C }/ n Q4 S2 l; R$ w1 K$ r& n/ \& w
}3 \$ c& @% i/ g& l" I
else{
% q, s( Z, T' m) w if (upp_dmai_int_cut > 0){
5 }: v8 H9 R. Q) y6 o DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
) ^& t, A5 f4 ]# ?$ S a. }1 ] Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
& A7 q7 z. _! S. Z
. F! @7 z6 P! M& v+ Z% E1 q0 `, H; |3 F F# [4 b
//copy data to upp_recv_list_busy- F. o- w9 y; K% N7 ~6 c
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
' {8 t) M' K1 B1 h7 P& _9 f" `4 d- g# e* W) p; I3 {
//* t+ _& Y, f5 r% u2 [5 } ?! e
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);$ W4 S0 ^0 b% E
3 N; L8 E" y% ?; n& B0 D5 E: ]
//* C2 M0 ? d3 @9 E
server->upp_channel_a_recv = false;//- A" H& ^/ ?7 A
+ t. L" i3 T% Q1 r7 b server_msg_send(server, APP_CMD_LOG, "upp recv: success");
# a1 @2 T8 X2 ]3 l }: x8 h5 \) I. b
}
% B' C$ u8 }2 x. ^% d
/ c& }, m/ E: ~ R
% v7 b& I- u" ?, a return true;
% R5 R; x2 P+ V6 ?$ G}
. V) j# r4 @0 T+ k! i, U) R1 m% Q) U% [$ t0 i3 G; x/ N. F" Y
static bool server_upp_data_send(Server *server)+ }( Q& q( m9 d' I7 a K
{' g. X3 b+ h/ ^+ Z9 v5 Y/ ?& D, F
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
) _0 e" V. R* N9 a" V8 A3 z* r V DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
* e5 A) P" F5 p unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);( Q% d8 e$ u: o1 d. p# t( G
char tmp[128] ={0};
% m) L f x& l+ U1 o3 ?3 ?; M
0 e' { o6 D$ ~7 b' p server_msg_send(server, APP_CMD_LOG, "upp send: start");
9 X# K1 }' N5 p8 I) R y* G* P print_log(server, data, 64);
$ b3 Q: Q; T2 x1 d: e1 ~, j+ K
//& w/ W r7 \0 a4 Z
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
4 ^2 O$ p7 t* B4 l9 E+ x( S memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
& f; M! A# g; l8 H* {( s6 ? print_log(server, upp_buffer_b, 64);9 J' j4 Q) p% V
$ Z8 Z) i0 q5 x/ v
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
# u5 E7 d, ~; n5 B: Q7 R server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
; e7 L4 w. j3 b { server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
2 l3 m. X' |* q ^ server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
) U5 ^3 g+ A+ H; N
' ?2 D+ F0 n. d4 F9 q' x memset(tmp, 0, sizeof(tmp));
4 ^( O6 q- E& c z; i sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", * R+ k5 `8 N: M6 n; O, ~! A
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
' I1 q( c# G7 `6 |. ? server_msg_send(server, APP_CMD_LOG, tmp);, y' h* U1 Q- o/ x# r& P
# l9 s7 Z& D# z- o) e' g# C% C0 a upp_error_count = 0;
! D) L: y1 B' V1 |* O& P, l! K upp_dmaq_int_cut = 0;3 k) p8 C. }8 G2 Q: c2 `: U g2 w
// fill in data , G6 O2 i5 U1 p* P7 Q3 P# a
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 0 Z7 v: i$ n: P* T6 P3 G8 }
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
% H5 t2 o0 j9 j+ T3 B& t9 {9 H: S% k0 C
/ u6 T2 K0 A2 M; O // wait send success% h6 u4 R* Y$ X
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); " T/ D- {5 [; L/ \" c
3 r* o" L8 f8 @5 a- O5 K8 O8 O- _
// make data node in free list
- s+ @2 F" [8 [ ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);2 H" j: }4 F7 k! z1 E i, ^
server_msg_send(server, APP_CMD_LOG, "upp send: success");
* P6 m# H% L' ^1 U; A* i, j) E }, [0 _2 m% j" I/ w
return true;
- c6 f3 a# E) R# ^7 z( [7 u}
. J& X5 I( C' A7 m" `8 {# {% l- J# K9 B
: f+ d, Y+ ~4 K. U! T- w. `% \2 s0 J; t& f( ]% T
# n; G1 z: \ \0 x+ o
- X" ?5 f2 ~5 |0 [ |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|