|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 2 _) Y( h6 y" L8 q( T
6 s) n: q# i6 x3 W! C5 |问题描述:; X8 k0 D, E. A2 i
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:6 _8 F6 H \- u. w- ^8 k O
( y* |% w1 |; Q% R4 t( S2 l图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
# n" _( ?/ I1 R- v5 T2 r
0 E6 k8 s, v8 U9 e4 z测试结果如下:
. Z! t% {" G. g- {/ Y* F138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
$ V$ m9 ]0 c3 B6 |+ b% A! L/ v' l+ h0 @" p
+ Z9 L" l5 g5 @3 {* |: y备注:
1 @ J; }; [* J1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
& ^0 x/ D5 [1 i9 s Z- ]8 h/ f2、相关代码如下:
3 ^9 H! U% H% j3 z, r$ b8 Y9 ~5 z//UPP DMA缓冲大小512字节
2 u7 G: u5 P" |2 Y6 O. R#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍, p7 _$ x+ I: k: I
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
9 M: J c0 U; H; S& F* q: ^#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)1 Z& b! Q N, B; |4 B8 y! w4 \
( p3 N4 l$ G( A$ o9 [- ]5 t" t( d
9 i, E( ^; n9 T//upp接收、发送buffer
$ y$ z$ r3 a r1 J#pragma DATA_ALIGN(upp_buffer_a, 8)
; {+ o) N. O& l% Y: G#pragma DATA_ALIGN(upp_buffer_b, 8): H- j8 B4 ^+ K2 R* g
; b1 m8 A" s+ a1 S
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];# h( r6 ?/ k: ]7 m" `' b
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
5 G; {9 C J+ M' l; ` Q, j3 g% E9 v' s& w% _8 e
6 K" j% m7 N7 ?- I
static bool server_upp_data_recv(Server *server) 0 Q8 m) D0 [" G3 P5 b0 e9 K2 e
{
' I% ^+ v2 q7 C: f8 t `: O3 m if(server->upp_channel_a_recv == false) {2 d3 I: }# J0 `" s1 Q; L T
server_msg_send(server, APP_CMD_LOG, "upp recv: start");* N3 u- q- Y: d$ t( {. [
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
4 |$ N; D, t% w K8 ?1 D# X6 k& F server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
6 l" a) V* S, }+ h: D7 N+ O3 K5 b$ V& R" z
2 l5 L2 Z1 M* y K/ L memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);" O" R; J1 d3 t! l: H* b. G- _' {
8 l) I$ F. I0 j( `
server->upp_channel_a_recv = true;//4 m0 j% p( h _' C3 A, K" s
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
$ P" {, w9 D: Z# x7 r M% N( ]( _ server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
( ]. {* m3 P$ O( ^ server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;; l: I3 i% n9 ?
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//+ ^- P) f8 h! ?+ I( N* x$ `: ^
1 d% `3 k) C4 O/ ~$ L! N+ B
upp_error_count = 0;, o8 ^- { T- a9 n5 g7 l4 c% T, J
upp_dmai_int_cut = 0;
# F3 k% W4 ?6 U. g5 q" H1 x' P* ~+ P7 M
// fill in data
! n+ j3 o4 l9 Y, {, O' Q6 V uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);, U) ~/ q& H6 C* C+ ]
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
0 ]3 p2 ^0 E6 O/ G2 Q" s6 I! ] }& v& V( O2 M; A+ I! A* e- [, X
}4 c5 j, E h) V. G+ k" E. f
else{; d7 M0 v# I- F6 r2 |
if (upp_dmai_int_cut > 0){5 p" h1 _8 {6 T+ I1 L( J2 z- Q }
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
3 v& ]2 g/ Z: P$ y( K Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);0 I8 p5 A$ v, M1 Z
4 G; Y6 Z9 k1 H+ a. f
& l' k( U8 ? v6 x9 D: _ //copy data to upp_recv_list_busy& a0 I: s" d1 [) \; p# o
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);" y6 E1 ^6 y& g9 k
! {! X: }: G- p A& F //! B g; v6 V; l9 @" W1 f$ m
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);5 ]; q6 y+ @# N, p7 p ?
4 Y5 I" s; o+ p7 h //
3 ?0 k! }2 y, Z. N6 v% t! t server->upp_channel_a_recv = false;//# i+ {: U+ P2 f0 U1 ]
$ Q* d3 t2 D" W% c
server_msg_send(server, APP_CMD_LOG, "upp recv: success");; e0 k; l, G+ y) @5 m' k& Z
}' c* I4 ]" M* t+ b, S: w2 g
}" Q' |6 w3 H! e- w8 U: g9 y' g3 a) Q" b
& [9 R9 F* n, c& u( {
( U) a: ~ q8 a return true;7 R9 c0 A$ U1 `! l6 i4 F# s
}1 F# }3 v' T5 [+ _4 ]3 ]: _) J
+ J; M' Y4 S+ e* ^2 W9 k! pstatic bool server_upp_data_send(Server *server); s9 j: f/ v& t! U. {& v
{$ T0 G. a1 ^; h% i3 k. ?
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
3 u" \7 J& V/ v: Y DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
2 r Z7 i7 t6 q5 d& ]: V7 R2 q8 s unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);* V2 J7 J! a6 H$ z4 a
char tmp[128] ={0};
- r v3 }4 p$ v
, y' |8 e( l: }: n* P/ G server_msg_send(server, APP_CMD_LOG, "upp send: start");
. k; _, q' F8 I1 ~ print_log(server, data, 64);
, p+ `! W! R. a/ f" _# n4 K
: j0 _; |8 z* D5 c! ]3 P, [: u //+ s( |* a3 Z( r' W- M4 L# P. v1 M
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
/ X% I) ?. m% c memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);" d$ M: ~" c+ Y- ~% n
print_log(server, upp_buffer_b, 64);& U# x5 `4 ?* F# G% u
7 b6 @) c' p2 o6 k- \ server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
* G" j1 Y0 U/ I3 ?! y server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; % l0 f8 f1 |- d, A1 Q& `) {6 i( Q
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
, j8 z) x3 S8 Q8 n8 w0 \2 q server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;& B5 A+ t/ x" F1 I' ]0 t9 B- s
2 n: l4 W4 f: T5 Z, }
memset(tmp, 0, sizeof(tmp));
4 O8 {" v* z6 E( o sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", + F" ?! ]$ I* x' w
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
' H3 ?1 r- n( u3 u; I3 Z" T5 z$ |# q server_msg_send(server, APP_CMD_LOG, tmp);
) I/ A1 V$ G1 u$ k( K9 ^
: P& k6 l: v5 _7 m upp_error_count = 0;
% R3 `6 O; y0 Z4 d upp_dmaq_int_cut = 0;
0 Q6 K: |' l+ _! f; N // fill in data ! @. k' }- S* ?
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
% ?* O$ B% E3 E server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
) C+ _2 d* Q6 b+ X: x' h( `- D) ?$ [0 G- @% q( _
// wait send success
# K/ E S- W( e- u while (upp_dmaq_int_cut < 1 && upp_error_count == 0); , r4 u3 ]1 x% ]1 i2 A
2 Q# b0 `3 p1 `$ A
// make data node in free list $ |+ W3 D* u$ @9 a R2 [1 r
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
, z1 z @- p4 _$ f: J8 A server_msg_send(server, APP_CMD_LOG, "upp send: success");6 A0 k/ |0 C# P5 D2 X: C+ T3 z- I% j
}- c" ^ ]/ n' O$ f6 B9 p2 K1 p
return true;
# Z3 U6 \. O8 w% t( [* d. u* c}. r, S3 J2 \$ d Z$ R
; `% h" Z3 @+ y* M9 y) c" M
& v0 J0 i, ?# O1 v) w2 i2 [7 |. V
) V4 y: ^/ \8 K9 r! T7 r; U* v
: y8 e& L, V/ Z, X
7 I+ i7 z1 x7 c& w* D
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|