标题: 138 Upp问题咨询 [打印本页] 作者: liangws 时间: 2017-4-11 14:43 标题: 138 Upp问题咨询 本帖最后由 liangws 于 2017-4-11 17:00 编辑 6 ~) X4 {7 M4 B8 M, v3 b& p4 C1 J5 C9 c! }) ^7 O
问题描述:9 u" _( b% D1 x- t
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下: 5 K0 v4 {* ^/ q( x1 ?[attach]2174[/attach]8 b' T7 i9 s; W, j2 ^- `$ l* ?: `4 L
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。5 g2 A7 }, z o) I+ T
8 ?' q4 e1 y: u1 `' N# J
测试结果如下:4 {( g4 l7 y; }7 _& @' r
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的? ; Z% P4 q, m7 @6 M, k; M9 t e" A% Z" ^' f8 n. Y: C
, f" J1 `# E2 I- c3 z
备注:( j8 j4 |9 J. i& ]7 D
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?9 }9 ?2 \+ G/ F. `7 }/ j& a# ?+ h. p
2、相关代码如下:% _2 l: p. @; h8 q9 A" ^* \
//UPP DMA缓冲大小512字节! @/ I+ {: @" [- ~: J1 {6 |+ E
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍 6 e Q& }9 e8 d2 H8 ]& b#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT 7 @* X9 a$ P3 V. C$ d#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT) 1 c0 \. F6 Q6 l/ r+ ^+ U 1 _+ L& a, V. h, ~3 Y 7 [3 }8 _: u- n% \7 S$ a. S//upp接收、发送buffer! T, p1 b1 ^1 R1 l4 m
#pragma DATA_ALIGN(upp_buffer_a, 8) 7 _+ x- `) y4 p( V5 ]; L#pragma DATA_ALIGN(upp_buffer_b, 8)" x% `- V% t6 V g
# i/ L1 Z8 {0 o& |unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];% M& n# R% F- U4 S2 C) F' s
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE]; 0 D# y4 \) F! w% S) j2 V O 1 X+ p3 u; y, v( y1 e7 w$ [, b! ]5 |: {6 b
static bool server_upp_data_recv(Server *server) : I. y1 ^ n4 r1 W& J8 S+ v5 m
{& J0 ?- |/ o$ k" u1 [5 P2 X
if(server->upp_channel_a_recv == false) {8 I& y1 S* z( r( X
server_msg_send(server, APP_CMD_LOG, "upp recv: start"); ; Q) O* C) |9 z% _6 Q5 C if(ListMP_empty(server->upp_recv_list_free) == FALSE) { # U3 v3 c. C" Z+ g4 }! d% [( w server_msg_send(server, APP_CMD_LOG, "upp recv: get node success"); 9 N4 p& {8 R' z8 v2 e 9 R% V; C# |2 u5 d4 t 4 |6 ]" x5 ~" r memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);; L7 f6 y. ?+ t+ N( V/ y
. }) C. ?3 h1 S! H) V
server->upp_channel_a_recv = true;//! z% C# X6 W3 U) y% K
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);0 |, q' t9 v" ]8 }. g0 F2 Q
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT; $ ?' `+ B( i7 T8 n/ x server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;2 N' N+ ?( d) h5 Y
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;// # v! E% s, W; h+ ~" m7 l9 p; k) ` 4 l: w w7 ^5 o- Q% G/ I) q* @ upp_error_count = 0; 5 C! g1 _; I" J1 e: g upp_dmai_int_cut = 0;6 ~. B) a9 b7 [8 e5 S. S3 f
6 J3 P8 o! @5 a* |0 [/ h' }: [" k
// fill in data 5 c1 s9 V8 o( ^! Z
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA); / ?8 Z: F5 L: }- Y! ]4 p& I server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi"); ( S& z* `9 G4 Y; r: c& Z } # j4 K3 u8 z4 [+ Y8 G% l } ) r# J0 _# W0 {3 G9 V( h else{( H6 \ u! K! R" M6 }$ Z: D
if (upp_dmai_int_cut > 0){* [: t: b' ^- O& ], o0 L
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);4 K& j" \# e" C# f2 C- E
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);! X; Q$ O2 I9 F) R2 J# [
8 f; `- v4 L/ A8 X7 |0 c2 j# s% S4 z8 E3 p/ V& ~! v% T
//copy data to upp_recv_list_busy' i# S5 B' e3 K. d1 m: Y
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);. O3 u; k1 W0 x' `7 z! W
2 C& c& i/ r, r/ V' l5 H# C //5 \. c; I5 e9 v" x* h/ Q! s
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node); ) R) T8 t% D8 T! U% d+ n! [- t0 O ) j) W5 g7 t4 g //+ C& t8 m: o3 e: _5 D. R4 L9 X& ?1 a
server->upp_channel_a_recv = false;//3 l! w- { ~& \; j* z7 t( ?& l: ^
0 J @4 ^5 ?+ @ C9 b i* N+ h4 i
server_msg_send(server, APP_CMD_LOG, "upp recv: success"); 7 L3 a1 e% O( c/ `+ t9 g7 \ } : V/ ~# ~9 K3 ^; D) ?! I5 l } 5 ]0 U* W$ D" A& l' I/ p" w 8 \7 ^1 t, P" q/ }+ h9 N: b, ]/ [( c A$ e: J
return true;% ~0 h! [5 G4 K* k/ f+ R ^
} 4 Q; e E7 i0 r; i1 W7 @/ D; r& W; B# k4 y5 v+ w1 D6 g% N( e
static bool server_upp_data_send(Server *server), n+ V: ~6 }9 i5 K* J, @0 d! s
{ : x' n- E/ e ~5 j if(ListMP_empty(server->upp_send_list_busy) == FALSE){ 1 t' o! K' M9 d0 u$ ^" d7 }, e" V DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy); ( X: A- X+ \* t% S1 R unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);+ E% }9 x5 ?8 h8 U
char tmp[128] ={0}; ) h- B0 K: u% z4 r+ N $ a; s s9 m! {' d* R* M; p server_msg_send(server, APP_CMD_LOG, "upp send: start"); % V. V6 L# k3 x7 {* y! T. E: I8 B print_log(server, data, 64);; u/ M5 _3 r5 i
% S/ E+ e: K: ~2 c8 j- h /// X/ h, c) K/ C$ G8 ~
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE); + h+ A' h9 L% S memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);$ P* G) v2 t* G5 T0 ^4 f. k
print_log(server, upp_buffer_b, 64); 4 t5 C3 e2 M; i w. E" A0 n- v8 k% r% j; w( _
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b); 5 _: s4 T# _& z$ P/ L server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ) s4 \( ]$ D8 W& l server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT; ; `& y2 T/ r, k% W7 F server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;" d6 Q1 \# N. N# m }0 w
A: M0 f4 V3 @6 F) j) |8 ?: y
memset(tmp, 0, sizeof(tmp));8 ^2 u& H& c$ g: t, \" o
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", * ^) X. Y/ F( F! F$ P1 u) s
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);0 r T- C6 _( {+ j4 p, H& | {
server_msg_send(server, APP_CMD_LOG, tmp);! G8 Z, P2 g5 \1 {, e/ q' a" D
q; g T i9 C+ M) j" W6 J8 k upp_error_count = 0; + V. d) O7 H9 }2 k& B upp_dmaq_int_cut = 0;' `2 M3 c4 |0 A& b/ F. D j4 K
// fill in data 4 v+ ^( E* g8 d- G" g' g3 b/ m
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 3 {* @1 q. u2 m, \7 D& P% B
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");8 L+ b5 [6 D9 d7 W* c
+ I" a: N) p3 j. ^- E' @ // wait send success, P1 m* L/ A: q# N I, E: Q
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); . g" s- D9 `4 k; b7 L i: j2 Q
; ?% {# Z2 E/ x9 O# w0 D I) T, w // make data node in free list 3 h! }* d: v7 v( [& P ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);8 `5 U1 o5 I1 G9 i$ G
server_msg_send(server, APP_CMD_LOG, "upp send: success"); 2 X1 c, ~' c% {2 T/ a2 b) b } 0 B1 Q2 B- r: Q \) i7 T' ^; ^; W) | return true;0 _* B3 F8 x# p j
}. d& w# b& _" U2 _( j2 R. b
0 F4 P" a. U; G) a5 Z/ A4 A% F' j
4 Y, C+ H6 ]% F8 T$ I
9 Z4 g! \& U; @' P2 d! P$ S " |; y$ Y4 ]3 @% @作者: human 时间: 2017-4-11 22:03
需要边界对齐8 D7 u! ?/ E$ \! ]8 B5 t
[attach]2175[/attach]8 Q4 m3 `; C! b# e# U% y