|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
7 S) _% c! h$ a- j+ j" u5 L& C5 @2 S* D1 e
问题描述:
; |4 @8 A9 E' q& P' b+ Q. x4 j在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
6 O, O; _7 u' ~( P/ e) I. [; D- f8 X) Q3 o; ]( ]5 l
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。5 ]: O7 l$ y: X
; L7 s3 a$ X- F. a1 S测试结果如下:
, O5 W7 g: W5 _3 k- R138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?- i o3 Q( \. B% Y8 [$ ~& W3 Y6 e1 t5 ?
5 y9 [4 K' }6 }
0 r0 a, C& Y5 K* Y Y6 L( Q/ a3 A备注:: g. n4 T+ I+ W" E8 y6 B& {
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?8 g9 P% A6 l. h: I: d4 q( @9 t' h
2、相关代码如下:7 u# L0 s! H- b: I
//UPP DMA缓冲大小512字节
0 G/ ?, `+ J* R2 s& t% R _#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍5 ], [3 p$ G" W; ?! e, f5 X
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
. N2 R5 t% z; h6 n* c2 _, ]#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT) N1 ^9 w1 D" q! }% u
) K' v& E2 V4 n: K
# s+ L9 n# C1 n$ N" b2 i: Q//upp接收、发送buffer' b7 u) A0 \2 Q* U+ {9 S8 p
#pragma DATA_ALIGN(upp_buffer_a, 8)
9 p: E& ?, e% z) V5 w#pragma DATA_ALIGN(upp_buffer_b, 8)
8 ^6 h3 C7 Y" V( f! J* }# {- ?. U8 P* w g) `
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
' Y" S# h4 x3 ]- u* y+ wunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
, X7 O! z# D7 M! a/ J, _
f- Z4 E* n: H# \# Q6 p4 p {4 \4 Y
static bool server_upp_data_recv(Server *server)
, ?1 a4 D+ S) Z/ X T; S2 [' R6 ], Z{
2 W; E( \7 H- n% f; C if(server->upp_channel_a_recv == false) {9 T' p. O% w& h1 M/ g7 l! a
server_msg_send(server, APP_CMD_LOG, "upp recv: start");! W4 _( y+ d4 s5 E
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {0 }4 ^, ?9 e, D: m( l% [% e* h
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
2 L/ @, Q, m5 ^" V: V% ` ?, m% X9 B- K I6 _* D' J1 N
/ s$ [8 u5 P B X memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
" \) N0 U1 \( v" e" d( c2 N0 ]7 l9 M! u0 P1 f) n8 k0 p
server->upp_channel_a_recv = true;//7 _" u' P8 l( h. K$ g% d
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
! B- h$ D" D/ T; }/ U$ i& v; Q server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;, K ?5 b- D& K6 M, u; _
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;' A# K& N9 [' F1 f' U0 I
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
0 B& h0 d$ u7 C
$ E4 N2 X. a5 H. D! }; { T upp_error_count = 0;) }6 p t7 N6 j* W
upp_dmai_int_cut = 0;
- |6 [% T* E2 d1 N
9 h$ w& \8 y* c! o( r- _1 k // fill in data ( L; K1 P. ~! M, d& q/ Q- G/ s1 H) ~
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);9 K- \2 _# ~- L! W& G& I+ [" |
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
9 b1 T% S1 L" y; @+ y9 b7 w& c3 n }! _+ x0 Z0 y4 V1 A6 G
}
) ^0 l2 ~4 e7 S4 y, `' u! b else{
8 V- A( z# q( q+ ~ if (upp_dmai_int_cut > 0){5 D+ n- M1 O8 Z# g, R
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);$ \& M! ^2 M; H; V6 x5 G4 W
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);% M: a$ B" [1 z- D) m6 I9 B. A2 y
4 y8 j6 X5 {6 g L) Z5 J
) F8 x8 N1 L3 F: ~3 s //copy data to upp_recv_list_busy4 E7 m' w# B0 X4 p
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE); L5 ?$ `! N5 l Q) E$ G2 D' L
) {, s* K8 z2 p9 ?
//2 z S6 w1 o) f- G$ P) {& t
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);. o9 y" Y% m' S2 n7 [2 f1 Z; X1 Y' {+ M
3 n5 v% i6 k- r //
! @( ]$ |! [: d3 o& A server->upp_channel_a_recv = false;/// \2 _% u1 c, ]
3 E- ]$ N, V* B, {# m server_msg_send(server, APP_CMD_LOG, "upp recv: success");7 m% q: l9 g3 b& M& w0 L6 o
}# I6 K6 b7 d, Q0 x+ O/ }$ W
}
0 K5 H N9 O$ X: }, \4 ~2 T7 y2 F7 ]# J$ y5 T5 f3 A# ?# C# Z# w; N
8 k# T9 m* w' Y0 \# [ return true;+ B2 Y* I/ S0 h* O
}6 ?' S% z2 M: C1 Z! j
# S1 V0 W6 o$ E( x. F. b0 ^) h' l
static bool server_upp_data_send(Server *server)
: r# l, p T) w6 v6 D! |{
5 d) e1 p1 v. x; C8 G& B4 C5 ` if(ListMP_empty(server->upp_send_list_busy) == FALSE){
/ _' g$ j% S' E! l& @% ` DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
h* P, L8 y1 x3 | unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
: Y" n; C. [0 Y% \4 \( X; Y8 O char tmp[128] ={0};+ k9 q* y& T4 H8 Y( a7 e& |0 {
% r1 c" d7 z0 v& F
server_msg_send(server, APP_CMD_LOG, "upp send: start");
. \- b& w: N$ e! E, H# b print_log(server, data, 64);9 x2 M6 o" u5 \; e# ^6 ^' k0 k
7 [# P& h+ q+ N
//
% B6 ^7 F4 T" j. f, \ memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);3 L0 M$ e! L# f: \! D! U3 ^
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
* H7 D o1 V- |; d P; k print_log(server, upp_buffer_b, 64);
. A. }, G3 Z" u5 z6 Q5 k
+ n& s1 A$ _ w server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);0 e+ A6 P" m/ ]) z$ S: J T% o
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
$ Q8 ~# y7 `7 g* K/ ]4 v server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
2 }2 a" H+ a* ?! V4 j+ `3 q server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;- q8 v4 L0 j$ s% ~
0 z# X% r' \4 ~; w3 N& D( q4 L( V memset(tmp, 0, sizeof(tmp));
' n0 H* L/ q; g sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", * @: J2 {$ A5 w4 I1 u. ~
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);" E8 Q/ ?+ f3 e7 v
server_msg_send(server, APP_CMD_LOG, tmp);
) z; Y2 j) J5 C$ z# t! U2 F4 r5 T. L$ ~) t8 ^) l# j4 G3 C
upp_error_count = 0;
, K o; ?; O7 g2 d- w: @ upp_dmaq_int_cut = 0;
% i0 b6 L% g: U. i9 `; u: } // fill in data
7 J7 G1 q: P% x uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); * n% z; _; s6 u$ b+ `
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");7 U- h( P6 O0 ?3 f, o1 g
1 r8 d( @, I# i1 W# X# z // wait send success
" {' v/ M/ I" _5 A# m- t while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
( x. S9 n" U d5 r: T0 ?+ q+ B* u4 ^
// make data node in free list
8 }9 k4 O. E' f( s! q ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
" g/ s& t1 f4 q1 t0 e server_msg_send(server, APP_CMD_LOG, "upp send: success");" s: ]" R+ Q \$ E0 T. }# Q8 l
}
# `: ?8 _$ s( H# P) f! O# @ return true;
; o1 O! o; ^# Y}8 v" D0 S: g# J* W
. i: \9 F' Y5 D' l
, n: E8 |4 g( n
% B5 M9 G/ F1 n- s' p
. k* A, O1 F: N/ L+ ~' h8 U- q# S) }/ J' N2 v) c) `
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|