|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
3 h7 ]3 o! }3 x6 V) B5 G+ b3 Z8 |: j2 [
问题描述:
% a4 c5 [) O. J1 A& ^# G在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:3 ?$ G2 y% z1 b; e
- {# q: N2 {9 \5 s! c2 a* `图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
$ m7 q X3 |2 M3 d
( ]: d( S+ P9 K2 l0 a测试结果如下:
1 ]1 F; \3 n( \9 H T/ ]' d0 x138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?5 l$ w5 V3 ?% H* J, l( ]# S5 b
, [0 f' E: r; m% r! U+ |! e" L9 s' p" p, \
备注:
) N2 x% a6 X( H0 s" Q1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
, ^. p# m$ z2 Y, ~# f$ X, H2、相关代码如下:
& U4 G) Z( O; {+ S: i1 |4 ?' H//UPP DMA缓冲大小512字节
, L9 e9 e3 q; z#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍2 @9 ?+ R+ s. @' w2 P
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT4 d3 t2 M5 h% u! @0 L2 p
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
- ~& Q: R7 p6 P/ A: l4 _
, M0 W5 J T! s6 ^. s) x& |( @5 s; h0 T! h9 K9 }# U! ]
//upp接收、发送buffer
" U' x/ c$ N' ]$ {0 d2 z#pragma DATA_ALIGN(upp_buffer_a, 8)
* c9 Y$ I. R! R#pragma DATA_ALIGN(upp_buffer_b, 8)
2 K8 b1 i$ w4 s O
3 e& d: \+ E( \' Bunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
$ j( |- \6 m! D/ T0 q- @3 d: ?: uunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
. I+ b' |( M; F! P
L" P# C! j s9 Y5 u
0 |1 T1 ~) |1 L+ a5 o ?& h9 D8 Jstatic bool server_upp_data_recv(Server *server)
: f/ C" H' t1 ?0 Y* D{! L' r$ ?& B, W
if(server->upp_channel_a_recv == false) {% W& M$ w9 X" ` ^' U& N( f
server_msg_send(server, APP_CMD_LOG, "upp recv: start");% q1 u m# l% V
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
; o, g% ], v; y5 j) [( t server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");8 U8 d' n* _1 {; `8 e0 \. x2 g. j
5 `; P" U; U! H
% N' a3 X. {/ E+ d4 C2 P% _
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);) A' z5 B5 w6 Y7 E4 d9 C
! n. @# M! w4 G: c* ^$ q7 Z3 E server->upp_channel_a_recv = true;//( N) U3 D9 @7 V+ H! z! O
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
8 G4 y' b7 r* f+ q3 z. ~) F7 v server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;8 B$ ^% u I- n1 G0 F, C4 A9 g3 U8 a
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
5 O+ s1 R- |$ ` server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
% b6 I/ c) T( D+ [' u1 v; o0 q/ R
3 h J/ v: c0 g% M6 _$ N* u9 S upp_error_count = 0;
6 S1 H8 n" F3 l4 H+ \: J upp_dmai_int_cut = 0;
, m+ e, |7 S5 Z) q o I
7 E0 t$ I( D, Z, @: R // fill in data
% X) p. ^0 Q& j! ?! |" }! k# V uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA); g' o0 J' F: R2 O4 J4 H
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");8 p" R, Q Q Z
}+ [9 V/ _8 e# q" k3 u/ o# |! z
}
: Z" [5 ^( ?' Y else{1 I8 C+ ?5 ]6 s* P! ?: u
if (upp_dmai_int_cut > 0){2 ^4 E8 k3 R8 M9 K a/ t
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
; {0 Q1 ?3 e) |5 E3 t& G Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);- @& b) o/ j' v8 {5 a3 x
6 P9 J9 m0 |) l: q# a4 e1 ], T4 D
& ?/ q1 {) G: x* L3 j //copy data to upp_recv_list_busy/ o( C. z r1 ^ Q! _2 P7 X2 m; x
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);' C$ v4 }0 v! n: G, J
3 l% N8 _8 R3 ]% g. ~ X1 W //0 M! U1 N( ~ w6 ?
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);9 a" j) D- J$ s+ f
7 \ G6 `/ G1 L( j; U
//
# J3 H4 F( C2 ~% i4 k) a( h server->upp_channel_a_recv = false;//; v3 P' X- n# H$ N! ]
: b# o6 o9 y5 k1 z server_msg_send(server, APP_CMD_LOG, "upp recv: success");8 ~# d: a, p" t. o: s# o; L, ]
}/ x9 k+ n2 t3 L$ g4 J, L
}
5 Z# w1 [ @! s9 Q8 R1 x2 s& j6 k% R. K( [( @8 y
. u5 o8 u: }; t, r% l: T return true;
2 b( V' w3 V4 b5 w2 v$ r2 A}$ J4 \7 g4 o% q8 E& k$ i
& {5 ], J1 D( V
static bool server_upp_data_send(Server *server)" m6 |* d( I* y. M- B$ j2 G
{
1 _4 G1 i* Y$ ~4 \- ~2 f if(ListMP_empty(server->upp_send_list_busy) == FALSE){
1 @0 u F: J+ E" `/ X3 Q DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);( Y/ d; j2 u. v8 I
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);( f8 H M( x/ e6 f+ m: U
char tmp[128] ={0};5 H) G/ ]6 \/ k5 H0 b8 g
. t4 w- ^1 P) S' S" q6 J server_msg_send(server, APP_CMD_LOG, "upp send: start");. W1 n1 K* X7 k4 f$ \5 x- r# P
print_log(server, data, 64);7 h2 V, @7 m7 h3 h9 y# ^4 D) g: o- F
7 {9 n# f2 ?' Y4 d: G) P" f7 O //
' P/ Z+ ~/ h# o4 a2 o, [ memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
3 W6 h1 K+ N" d# s& ]% y& E! |6 \ memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
0 ~2 k! p; s6 [8 O+ c print_log(server, upp_buffer_b, 64);
1 n2 P) w1 S6 y& H3 ]' H
" M4 K: {% F; o2 x* @ server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);: F( s: A* ~$ W; e' n- U9 E) L
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
2 d& |7 E( h6 Z% g server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
2 F& [, [& W4 f' y, v N7 A server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;. h. ~+ W+ V( y( [1 b
& w2 v& q9 q7 a: K/ U- ?8 J4 |
memset(tmp, 0, sizeof(tmp));
% ?+ g! U) v* a5 e$ N5 i1 g, u( R sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 2 p" C+ _7 s+ {6 ]2 N
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);2 K/ V$ w2 V0 T5 _8 j
server_msg_send(server, APP_CMD_LOG, tmp);
: c1 {* p; ]. T8 {. i
" Q+ w9 Q$ i* C) G upp_error_count = 0;
# m9 C' I; V, U; T& x upp_dmaq_int_cut = 0;
( \. z( P# h! d% p( P- o9 m2 ] // fill in data & a N2 f8 L6 g5 N, ^
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
/ n4 r# A" r0 j e* h' q server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq"); b0 M/ Y. a8 k# C9 S3 ]5 u
( }' @9 U% l7 j5 _( X: b
// wait send success
& X# H% y% \# t; m. S while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 4 d# H4 g9 N1 q5 i
. i( L* f& a! @- o9 J% `- { // make data node in free list
: k D' a5 ^( o" c$ s4 T ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);& c2 N# P0 i- A! v/ b
server_msg_send(server, APP_CMD_LOG, "upp send: success");, m$ c9 C0 ~+ s( T, O( D
}' w; k: T t4 s
return true;
5 v' k& }6 v; [}
" \/ `7 I$ g( d5 \" {* o5 i0 [* H1 w4 S8 v
. i' |# P4 {. a) ~
( a5 n( R3 d/ C8 o
! U1 N1 D$ I: g
1 J' c0 X( E: A8 S |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|