标题: 138 Upp问题咨询 [打印本页] 作者: liangws 时间: 2017-4-11 14:43 标题: 138 Upp问题咨询 本帖最后由 liangws 于 2017-4-11 17:00 编辑 1 A# R+ V4 p# |# u; V. L
: B/ J* z4 c/ P1 U g% Z
问题描述: x5 }8 Y6 O$ Z+ W) c在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:8 H: L; y# z, Z
[attach]2174[/attach]9 T+ k9 X3 Q5 V7 N5 n. e2 ]
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。! H: H. m+ q4 T. e
3 G; S% a) k; F: h: f: o: e4 i
测试结果如下:8 E @9 J. H! J4 A
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?% O* u6 \0 I- J- R0 s9 U
" c8 p# Z( Q; C. p5 u( O/ S
. D \; m% L& d+ ` x# f$ I- u* B
备注: 4 ~! m3 Y+ O2 B4 n1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起? , ]7 L+ I! A7 A; T4 n2、相关代码如下:5 L7 V+ ?6 z# g `1 Q4 Z
//UPP DMA缓冲大小512字节' e( @8 Q$ q7 H
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍4 ~9 e* b ]' g y: t( k6 } r
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT4 \" c1 x: u9 J
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)/ }) b3 I0 V. h4 B" f; A
7 g. c+ B1 I9 r
1 f) o3 d' S; [% V+ K/ M" |/ N* N//upp接收、发送buffer: C& `7 @# H$ M7 f, w% N
#pragma DATA_ALIGN(upp_buffer_a, 8) 9 Q: c9 g. \5 J) F ^5 Y4 L3 s#pragma DATA_ALIGN(upp_buffer_b, 8) ) x, t. ?) P, B/ v& _! e, W 4 ?& W+ Y0 \$ F- s5 m# \( Q- yunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];; S) c7 I& C$ b7 J, q
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];1 v* c& X1 [, f% B4 q* a# \
0 f% L3 G2 v9 Q7 h; y! r. H
% m1 q6 H/ m9 p& b
static bool server_upp_data_recv(Server *server) 8 T; D* l* @8 e6 S2 V9 Y- M
{% s6 R: A) R' L# a* u
if(server->upp_channel_a_recv == false) { ' `6 l3 J# s) }/ [ server_msg_send(server, APP_CMD_LOG, "upp recv: start");2 F$ V! Y9 `" V( @+ y
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {$ x: V4 R1 c0 I8 o3 t* y" L r
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success"); 1 K9 A- G. h: b& e 6 o7 U) z" s3 C' Q( R& B0 m! v7 E3 A/ L7 E5 u5 o h
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);% d; @2 |3 D: R
4 `+ Z% a( D4 c( P- N( d8 a, h server->upp_channel_a_recv = true;//% s' q0 r6 M+ F: ^# O
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a); 8 L1 p. z, R( M. K. O" o: H8 i server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;* X6 T& R% V4 Z1 J
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT; - V. i. \" t2 L% m server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;// : E$ S$ j# Z2 T _) V* ]! z: ]! E, e, L6 Q
upp_error_count = 0;* D' e" ~" F7 L3 e$ V9 Y7 d2 h
upp_dmai_int_cut = 0; 4 a& i, B* o7 P6 h1 E " ?4 |# i; \/ o: d: G3 E8 c+ ]: T. R // fill in data ! t7 m5 E7 F9 r uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA); ' g$ V+ {" a, M5 p( U- | server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");+ C" ^5 O: S* ~$ k! ^2 z
}( ?$ u2 g" P0 u5 J& F' T8 l; K
}; d* b$ o' T9 X, r& `
else{* `$ ]. a% d0 \& {. v$ V8 g0 Q
if (upp_dmai_int_cut > 0){! [+ T; l% z2 b. F: H5 c
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);3 t4 C1 _+ B# R0 ?
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);; j: b# B8 i/ A+ s, t# f
/ v! P, t0 M; J! S" [. v2 P9 i , H9 D8 x" t3 t( c0 g5 o //copy data to upp_recv_list_busy : J) E, L, L( L. q, U B memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE); ) ]8 A- c. v7 I" y8 s 1 [/ x$ Z+ L0 e. y& s* p // % g" `* g/ V; e: u$ X ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node); ; j1 f7 i, u/ |9 N1 P; C* M3 }8 h+ X( h# l8 j& F
//2 c. t$ O7 R0 _ x0 B. h; e: w
server->upp_channel_a_recv = false;//, n, B6 A& f- j- v* f8 U( F
+ B) | e N$ A" @( a' `- J7 s0 V, x
server_msg_send(server, APP_CMD_LOG, "upp recv: success");8 Z0 e3 a# ~. y0 R
}) U0 V1 y7 ~/ e4 n
}; ~0 S7 Z4 o8 \$ S
4 r! b$ |9 k0 h" I& V1 n, M$ w0 D5 D- G
return true;+ Q! m- n2 d3 y) v: P' t* X
}6 Q5 g! v- z* w {* ]# m: ]8 X
& E" V: V9 x% V; z1 t+ \, A& O
static bool server_upp_data_send(Server *server) 2 m, T+ L- e% g# z9 n{ # X \& D$ G- N; v8 E( { if(ListMP_empty(server->upp_send_list_busy) == FALSE){3 I, j! V; n4 ?7 T& K. `
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);4 I) s, T; B$ U
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);( b% G/ V+ Q9 S' i2 b b
char tmp[128] ={0}; % L! W1 _* I* H% w/ l4 u6 T3 `+ s6 i2 }# p
server_msg_send(server, APP_CMD_LOG, "upp send: start");* K6 p* A: Z" _ n
print_log(server, data, 64);" T% A/ a6 U6 x |( F
( ?+ D. c. X3 A. u" q" U$ X% @
//* y; W9 Z& J) b r" t% g( G
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);. N6 U* b/ g# ^; y, J+ w
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE); ) I" Z% Y' d# T' c' I9 T print_log(server, upp_buffer_b, 64); - v1 ~, c, x8 v% C9 R9 t( `! v) \+ D8 |! {& Q2 J( ?! C6 P& Q9 A
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b); 1 X6 w; ~, L) i3 w server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; $ O5 n3 u: u1 P1 t2 H9 f- o) r
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;4 ~9 G8 _$ u) Z/ z
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT; ) g3 r3 E5 {! q+ p! W/ K- E4 Q! \ v- Y
memset(tmp, 0, sizeof(tmp));$ a& z8 Q/ H9 s+ T F. R
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 0 z0 V% n* I0 S8 B) f! C; Q8 ]$ I
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);& a) b1 x8 r+ e* a4 x# [" \0 R; r
server_msg_send(server, APP_CMD_LOG, tmp); * ? R9 A* s1 g9 A2 a 3 ?5 i" y5 I2 u3 u1 x$ ~2 ^5 i upp_error_count = 0;7 C9 S0 U. ]; C$ F4 R3 U
upp_dmaq_int_cut = 0; * Y0 d; n& t( Q [. m6 f // fill in data , F! L2 r7 q" w9 N' r; G9 ^ uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 4 Q' R$ x* ?2 J! |2 { server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq"); 2 I. `7 I, Z( s8 B + J' z9 m0 T; {$ e0 V8 z! c3 [- o // wait send success. J; G, @( S! s0 ~
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); * Y$ T# T+ i4 ^( l! w! ]
' m( L7 S9 @& W3 i* K: K) U // make data node in free list 5 \6 t8 v5 T, L- ^8 T% G( `
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);( V3 V/ i0 ?4 g+ T) j1 x6 F
server_msg_send(server, APP_CMD_LOG, "upp send: success"); ) Z8 S+ n% x: y }( d, L+ k$ I* b; [5 P. u- F
return true;3 s) R2 `* w% M2 l5 ^, k
} , o' a8 @3 ]( X5 e; o / f: }2 ] C- b* C. _: r& [2 K, N $ m( o4 v4 ^4 e7 c$ ?5 W( F 5 s( [; y# j' w 6 W+ l- j5 o$ j. e. f ' S# g8 G( `* j4 d' c/ o作者: human 时间: 2017-4-11 22:03
需要边界对齐 , E% M8 F+ ?: w3 p# O' I3 D) ^, v# Y[attach]2175[/attach] 0 A0 N! S8 Y" \& E! x