|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 & y: C( s* d( ~9 H9 r. C( z Q! y: N
[1 p* Q( _' z1 c$ D8 } W
问题描述:6 W. |0 l* k Z2 e& Q
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:) i! ]5 O- o( b! V/ v3 \4 d
x7 T) z1 ]& U图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
2 ~! J) L$ R) T( _5 H" N3 b ^7 @$ ?, n8 e$ a+ ^; k9 ~; O
测试结果如下:
v2 z% X2 |- ^( ]8 W, Y; O8 p" f' o138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
- e+ |2 I' X. m: T
& D0 E7 M7 R8 n3 I# |
# c" E* D" C B2 y* G备注:" `5 h3 p6 }) x5 w' `; k' M( v
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
) B8 ]' T& O+ s6 [/ K$ }( B+ I0 c2、相关代码如下:
7 ]% ]( W; V1 i$ |//UPP DMA缓冲大小512字节" X! z; A' e- r+ z
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍! I( D1 }" }# A$ b! M9 o1 t8 _
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT. J( Q0 u" A* r3 [$ i5 G1 B
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)9 ]+ R0 \- r" |1 o4 V
& _' `1 _, h# J& m( P$ B! u( P9 [& b. N1 i
//upp接收、发送buffer
" o% ?( T, E, k' @4 o& O#pragma DATA_ALIGN(upp_buffer_a, 8)) t. ?) T$ R3 q) P4 t; x
#pragma DATA_ALIGN(upp_buffer_b, 8)3 u' x1 J8 t- M+ P" G7 e
( M" [ i: H. m+ m) X& Y E
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
! y$ V% U" h2 uunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
S; Z: a( _. P( Z' R, t7 A6 v; C- t |
- ~- F: p/ P) \0 d, O4 c% p b6 u
static bool server_upp_data_recv(Server *server)
$ P2 R; t M+ Y- I- [7 @4 Z$ e5 l{
2 l1 x1 V& s# k) U if(server->upp_channel_a_recv == false) {
0 j0 T$ L8 ^& Y A/ E% f) Z9 l4 E server_msg_send(server, APP_CMD_LOG, "upp recv: start");+ k" X% ~8 H" P$ D/ W' I
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {7 ]+ S0 }+ ^8 t- F/ }: K4 k
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
" Y7 }+ A" T+ j% f3 Y p
9 @% k8 N9 @. {/ g; j) V1 B5 W! Y$ b, {8 u5 F2 U
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);& `! ]# R+ g& L% U6 A
& ~7 A0 {$ m, D2 d. v server->upp_channel_a_recv = true;//
. I0 y6 N( i J% y8 z* N d server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
5 o' @: F3 B4 t: _2 b1 n server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;. z3 F8 Z! Q# Z$ U# @8 ]2 `
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
; r9 {" V2 S+ l9 J server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
% o0 ^( p9 V2 W2 U$ p
) @8 x y% d* L! z! u2 T, a% V upp_error_count = 0;! X' R6 f, a# k
upp_dmai_int_cut = 0; G3 i {, D4 C1 c1 k l6 L
! E. r! K& N4 T I) n+ f7 ^& `2 ^1 E // fill in data
7 N8 o1 r1 s/ U! `2 R- ^ uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
7 p9 D* f! e- A2 ? server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");/ S+ k. H6 |3 `$ c9 o( N5 Q
}
2 P, T" J2 x# A: S! F: h! Z" n$ `- _0 e } \+ q5 e, j) J5 [
else{
# F+ y' u) S7 J' X' K# R) I4 O9 z if (upp_dmai_int_cut > 0){
% Y/ y8 E5 d2 u: I+ d: x6 l1 d6 o DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);( _6 N- y1 p2 @* q7 \. e
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);* [; R i$ b5 ^( ?3 ^
% d: [ w7 l4 B! o6 t+ y" [" \1 G, ~ C* B# h* d" @
//copy data to upp_recv_list_busy
9 U! j( @ G0 U% k memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
; ?2 m! z# {" @+ ?) B$ o* n* k) n/ ~, ?
//0 L" q9 J% M. ?$ `' k
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);/ v" m1 P! |5 ?) v5 M. [) Z1 K
& u. _/ |4 M( @2 l! Z: l: o4 R //
5 ?% t' h$ z; k3 S8 ` server->upp_channel_a_recv = false;//3 r& e3 h/ M7 |6 C; x6 n: B* I
0 a% r4 p; s! Y2 q server_msg_send(server, APP_CMD_LOG, "upp recv: success");
8 x, b, j. g! F" n5 r. D }
7 m9 F3 N5 L9 @3 F0 F0 X }
4 n2 c# _) Y% N( t9 c9 t6 l
: C/ A+ D o, a3 L! O- b8 Z; t$ \3 b: B* c$ X' _, Q5 d- R6 _: S; N5 u) Y8 s! A
return true;
7 }: [# d& B+ u8 Z} H; B$ k! ]7 l; Y: f% @0 _
$ C! t! I# G' J; ystatic bool server_upp_data_send(Server *server)
" G$ E4 G3 P) W# m) H: [, u{0 A9 `) [9 u4 ?5 E
if(ListMP_empty(server->upp_send_list_busy) == FALSE){" n& x( V2 x5 A: C
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
7 ^* Q8 e& Q3 A& a% P3 ~. Z. Q2 a unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
, ]+ c8 P- T, t) S ~/ W char tmp[128] ={0};. W0 L8 s! a0 Q3 B, H( m
0 n0 |8 \ Y# v2 v
server_msg_send(server, APP_CMD_LOG, "upp send: start");
* J5 ~7 t; y8 \, _ print_log(server, data, 64);2 c. ?0 T5 N) R0 w( F
1 {0 l& O9 w# S# v ~% H
//
% d) ?6 s1 H2 D4 K* y memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
& a, N" Y2 ?7 z7 t) z4 P: ^" h9 } memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);5 E X3 s' y. L& Y6 u" i: U/ ?. I
print_log(server, upp_buffer_b, 64);/ e" u' L5 ^, c% l8 l! i/ ~
: _" I! C$ j9 u4 e* w# T9 w2 R% Y server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);6 D- t& P% q7 ]6 P5 u! T3 R) f
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 6 J' Q% u4 j3 B4 [& Z
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
5 G6 p3 P; U% n8 | server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;3 y4 {: V1 s4 J* }; Z
- W+ ]1 H+ u" D memset(tmp, 0, sizeof(tmp));
/ N! o) Y' {+ T7 |* y( w sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
. l, a5 }, g9 \ sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);1 p3 u" ^3 N; e( m4 ?% A$ X
server_msg_send(server, APP_CMD_LOG, tmp);& a6 B; S* L' }- {0 G2 `
9 T; j/ Y7 {) G0 R' J" c7 c
upp_error_count = 0;/ l/ [* D2 q6 e% g
upp_dmaq_int_cut = 0;
& T- T6 z0 g; W0 z+ t7 d0 @/ w0 R! W // fill in data
6 V- z0 ]2 G6 Z. B uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
( d K2 [3 v; j9 v server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");$ J1 F5 k+ h) n: A* A- ~6 L
5 \( w7 Z; h/ j; z* k; j // wait send success8 l7 a9 @9 `) c; n' b
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 7 a p) s1 r: v9 U& Y
1 H. V1 ?. X1 O( y( R: R // make data node in free list 0 z% S: ?& w8 Q9 y# ~( R
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
' w% t& Z7 N3 x+ \8 v5 t+ [, G server_msg_send(server, APP_CMD_LOG, "upp send: success");
. @6 s% m4 J _3 e0 u }
4 u, m) y4 d, K6 s/ } return true;
9 M; J5 b0 g2 s/ y( ^}7 N# Q7 a# |$ d# s
: ~6 b7 k. [' [% c0 @, s
* e6 P. }5 T. ^" Y& F/ v. T% m
9 u% e ? o% F! U. j/ E* W$ K; W( B6 V: N& e# a
- P& m; a+ h$ o' b |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|