|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
1 ]' i" j# @+ p3 m: p/ w- {1 ^
7 z) J0 @7 G- r! ^! w2 o M9 n" b8 c问题描述:
5 Y: Y/ p1 _+ K在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:+ K8 b9 O2 f4 V8 ~. N8 O: [4 G e
4 a g, U) r3 V% y3 x
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。/ T+ z% D* u" w' ]7 C O9 e4 N
2 W, f' s: N4 G# Y0 F测试结果如下:
4 }0 p7 C0 \3 n6 _* i; q9 E) B138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
- B' C! u! B# `% O0 b+ M6 L0 v
1 n8 C2 f" n9 O; D" N) i l0 V" l s) H- H \4 R
备注:
, g G6 y8 e \) |- j1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?5 \; c$ \* e+ k) R" f3 g
2、相关代码如下:
, M( @/ W, {% a) [//UPP DMA缓冲大小512字节8 t: A/ A# j8 Y7 H" U+ q2 Y
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
) b5 h- z, E) R, O) ~2 ^ K% V# ?#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
% C. k8 m( s) ?( p c$ B#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
9 o7 z; }" G C, t7 h$ s4 }/ j' L" L; p* n8 Z3 P* ~! e
+ ~# U; h7 k* p% G! R( O//upp接收、发送buffer1 ^' s R) ~, i& j* G
#pragma DATA_ALIGN(upp_buffer_a, 8)
# h ?4 G4 a; J2 i#pragma DATA_ALIGN(upp_buffer_b, 8)
0 z+ |# r/ H. u8 G8 T, L2 n& o4 P
8 F/ i. n9 m8 ^ e& r G# f" E8 zunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];; c$ j+ | g3 Y
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];/ s$ @& O9 `+ S
! _( |5 z9 c) v! q1 Q. d0 m0 d5 P1 _1 q7 W- B& `
static bool server_upp_data_recv(Server *server)
# L( v5 H9 P$ R Y' S{5 D3 ~6 @ d- l
if(server->upp_channel_a_recv == false) {: D* X$ x& B: B$ y. J+ v; a! d8 U2 h
server_msg_send(server, APP_CMD_LOG, "upp recv: start");! C% g% U* l W' J& _: x
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
9 |1 j% ~' M4 U) E y server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");% j) B6 Y* R) E8 r7 I) r; S
6 S- X- v# }! [3 f; u2 U% U: m: u
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
# x" o# F- F* D; j+ ^" I7 e
0 H. e/ e6 o6 ~% ?- W& D" E; M. P3 @ server->upp_channel_a_recv = true;//
; T' o) H$ n9 f# |5 Y8 ?" k9 Y server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);, B3 }" [# V& ~- a1 ^
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
1 e U7 _; G9 Z5 n% W% G" J+ A server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
" n) Y9 m5 O' A& O7 z* m$ t1 ^* ^$ b server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//) z5 J( ^$ q% }8 f* K, r8 C
5 \: p9 ^- G' q7 J3 M6 L8 Q2 M4 l
upp_error_count = 0;
, Q/ P7 E; b. t. K upp_dmai_int_cut = 0;
f% Q) u+ z' S4 j$ [8 I% ~- F* ^3 ?2 w% K$ Z
// fill in data
C5 T" E1 X9 j1 T1 D, P$ {# ^ uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
3 K: Z* p7 ?' B. O U server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");/ p5 L9 h! J; W3 y) \
}* U& [/ _( k; r; w+ F
}; W9 v: f% l, Y& s' s! z
else{2 B* E+ }0 h4 b. u, m! X4 _+ U9 x
if (upp_dmai_int_cut > 0){/ o3 s8 N: L9 X( c
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);, _) \& P, h2 B0 n
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);4 v/ J7 ^- Q |6 C9 C A- ]
8 B6 D7 W# a$ G
( Q3 C) h' ^4 L5 z+ l
//copy data to upp_recv_list_busy
+ W+ V" V/ |" w I6 i z. @0 v memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
1 D/ |4 u7 E' V' R4 W' {1 F# w9 z0 y0 w" m
//# K$ o/ \/ A, j) o0 h( U
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);; B0 |9 z- |+ Y9 u5 U" u' d
/ l/ c3 \) }% I4 [ H& ]
//
" P4 w# U1 ^; C+ v9 m$ E4 A! N server->upp_channel_a_recv = false;//
/ H6 c# @* F+ R. [% B) r! G
; v7 O# _; V- I1 T server_msg_send(server, APP_CMD_LOG, "upp recv: success");
3 M& K7 t/ o: r3 x }. B3 i/ ^8 s. [8 V- U8 j, @, z: d
}
& N9 v- U4 n* ]% l3 v5 l, r
. ?3 l0 V+ U) H D" t y
9 h$ W D* a1 @0 A return true;
, X0 @+ Q2 X3 f" E- \9 u}% {' u0 a9 s! X7 k {. d1 z. x2 w
4 I2 ^0 B7 r1 [# U+ u# ^+ Qstatic bool server_upp_data_send(Server *server)
7 d9 J* E9 M/ p7 f/ ]$ z{8 `" D" o: |/ `" P7 }' ~$ |- ?5 [/ R; B
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
9 x V( q: R- C' C( s DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
' L' v7 G t+ r& f unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
: A5 I% { `5 v/ z7 |- g- s char tmp[128] ={0};9 s. U! _0 e+ P' A; k& B# G
9 I2 b6 I: N S: O/ a
server_msg_send(server, APP_CMD_LOG, "upp send: start");$ k. `0 E. b5 { d& n) }8 {* K# M
print_log(server, data, 64);+ q. `% |1 o; T" M9 x
5 Q8 ]6 }2 ^. S* f& J // t# r* O8 z+ B, A- U7 r8 X( T
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
1 `/ u$ @3 ^6 J. s6 ^ memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);+ o/ G' L4 b1 t
print_log(server, upp_buffer_b, 64);
' w: k( {2 S# A/ q6 V; \5 A. C! g; U& {: }& o3 z& r' z8 r4 l
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
. J' @. P5 o% D. B& ~ server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
9 ^+ d/ t+ C& N8 b1 }0 G" h$ A server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
& j6 G/ c) Z9 |, Y server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;3 Z8 W. ^, N/ B8 [( r
8 Q0 Y: }, r K# ? r9 f memset(tmp, 0, sizeof(tmp));
; v6 U- ~' }9 P! L& N! v sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
" L9 D; ~$ t3 J, ]5 v& E4 r sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
+ _! o: ^% f7 ^6 n( ^, N server_msg_send(server, APP_CMD_LOG, tmp);
1 e' x- w; D# H' W4 x" R* e
) D& x s6 d) J4 f upp_error_count = 0;
( b7 o; S1 J' o2 C* E0 r upp_dmaq_int_cut = 0;
3 P0 z6 I6 s: P, Q // fill in data
) h5 i5 Z: ?: G. w. }0 Q/ ?% l" G$ q% W uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 6 @9 U& g0 i2 P& n2 D1 u$ B
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");9 i9 v% d5 d/ m+ T4 W$ V
* L2 W1 y' ^" J: B // wait send success
- k5 \+ _6 j! x# V3 ~+ l" r% | while (upp_dmaq_int_cut < 1 && upp_error_count == 0); , ?6 G ?9 Z4 n% [
+ ?# f: s# x/ _, N5 Q1 B9 J // make data node in free list # z, Q% j7 f( t% c/ M5 }6 w( a
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
5 i# f: w; y0 [ w7 E! r server_msg_send(server, APP_CMD_LOG, "upp send: success");
. L& n2 i, G2 k; t/ e }
0 `' N+ A8 c4 V4 v return true;* o# ]1 q" D- @+ H& T
}# I' z; P5 L3 T. N2 n3 F+ B
/ f4 G' }. e. c3 z& _% W7 N8 f* s: ? B5 ?/ Q# r# {# W
& Z, r; {$ A$ c8 j2 l& M% M, N' B0 Q7 |7 g! D' Y+ p3 I4 n: Z
: J0 q# z' W2 [' e3 e
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|