|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
& {* z7 o' h* S1 ~2 F. v8 I# f. O6 @- ?' S3 U8 t" x& F) w
问题描述:% V, a; [3 d0 v7 d
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
4 a( \" R8 D! F
# q/ `# U2 d# e8 b2 [图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。3 C9 U& @5 U7 t7 K V: {$ }
' B1 b; }2 a9 F/ i9 c测试结果如下:1 H' d& Z) Z' E( \( a% K) i* I2 @
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
# m3 g2 H1 l. ^& G9 p% X; J9 |5 i1 ?3 C$ A
4 `& m4 I% B [0 [备注:4 ?3 t( u! q: @9 c
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?; _; x+ A! z4 l% U2 g0 h5 q
2、相关代码如下:
+ v- p$ P/ }$ O m& D! V2 N+ [; r: y//UPP DMA缓冲大小512字节4 ~5 E" g2 i) e3 D' C% ~+ n/ L
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
- C7 J6 O( q8 b. M#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT% R4 c4 \- R5 o5 h7 ?/ B
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
5 S7 Y8 w* Z2 d( T) X7 ^5 @7 e1 ~, S1 \) I: j4 f$ F* s
: Z- Q+ i! z! k. g5 F) j3 B3 z
//upp接收、发送buffer
% D a" L& G2 E& M0 @9 | J; ^% _#pragma DATA_ALIGN(upp_buffer_a, 8)
: q, q$ Q: s4 Z% |' n; h: h#pragma DATA_ALIGN(upp_buffer_b, 8), e3 ]; H+ Z9 s4 u4 M
0 W, h% ?: T! h/ A. O' J8 Q$ h* bunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
5 h8 Q l+ y: Lunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];& o# [2 u: H5 j$ @4 M
( f* e! K r8 p0 G, Y
6 E( Q( {$ y+ v9 @/ O( B% v
static bool server_upp_data_recv(Server *server)
3 I/ A7 J; T6 v3 ~1 u- Q4 J{. \; B: I% G/ ^1 K) i R
if(server->upp_channel_a_recv == false) {
7 w+ M) F3 ]6 t# e; Z0 I) n server_msg_send(server, APP_CMD_LOG, "upp recv: start");
9 h, J! S9 R" {9 `, D. J* T+ A if(ListMP_empty(server->upp_recv_list_free) == FALSE) {7 f' |) m4 U) J) U1 l4 B7 u' j# x6 x
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
; A. M2 R7 \( m7 Q5 Q; y d9 ]" J$ g) Q* g4 f/ K
3 p) x$ s _% v* N; h
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
' C% | q3 Z' @: V* _$ ]6 P! f$ u9 L2 |& Q/ P4 a; |" v" R
server->upp_channel_a_recv = true;//
0 J0 r; }- c/ H+ H# e! ? server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a); n2 Q Y$ Z0 g1 L
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;9 _: \1 f- M- @: V: o
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;' ~8 I1 V1 R. _; Q
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//! V( N. [2 |1 U' C) g. e# G+ t
2 G& Y& Q+ {& A
upp_error_count = 0;6 s. `) r! Q3 u# C7 A
upp_dmai_int_cut = 0;
# G4 X% }1 X |1 j# N/ a1 Q
; u! z0 H8 }$ ?' Y; U // fill in data / G6 F1 B1 k! N1 W7 k
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
4 j# N$ z/ @7 _0 m3 d server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
# Z0 c( q( M0 G3 X, V3 A" N; s }0 S5 ^5 J L1 @; @$ L+ }5 O
}
) f4 Y: U# N+ f, x+ b" ^/ n else{
6 b8 p. t9 `, z8 c+ U8 a* T- \" k if (upp_dmai_int_cut > 0){% W% e; { t- M) s, l
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free); ]7 e) a" C# ^$ S/ C! ?' n% N5 i
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);9 X4 n( l1 p4 U& u+ v/ }! c/ S
3 V& `, C0 T8 m
, t! |- U. `8 y5 {7 g
//copy data to upp_recv_list_busy% [. ?$ v; ?0 v+ S) K
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
% C @( D* [: }5 }( r) U8 e9 @. U2 u
7 n6 C, Y7 c- [1 Y+ |6 S* r. S // v3 O X% K( c/ w) T
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);6 l. t6 R! V: o2 ?, y0 X7 \2 o* C. n
: }9 `1 l' y$ R' k: y4 Z) ` //; J1 Z H E- i- _
server->upp_channel_a_recv = false;//
# ], r5 m, G% z n. ~9 a' ^8 r0 o; A5 ?, ^$ }! E0 _. x
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
* Q, P1 c, Q% N: J. t6 s }
8 ?9 \1 `' k5 N( O" ^7 [ }
2 P4 \- i9 j! s% C% Z
* P, Q- Q7 w5 H( S$ T1 n9 |9 M1 R8 ]* E" r) [/ S. ^
return true;) g% K+ L& |. M; J5 I
}% R( v( ]* b3 r0 y( `
1 ~3 E7 g2 p! \% B2 y
static bool server_upp_data_send(Server *server)
k9 s1 H; r2 t9 e! |9 _2 c{
1 d6 j- L* T& D& g7 _ if(ListMP_empty(server->upp_send_list_busy) == FALSE){
1 S t$ Z4 B) c- g DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);( m) l3 ?& U5 K5 Y. H9 H
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
, T; y# D: B/ H char tmp[128] ={0};
! g6 v; L5 O! L- g9 p& z
8 P6 G' `, U0 P0 T0 O server_msg_send(server, APP_CMD_LOG, "upp send: start");
: a$ y4 c+ D( W, J& p' h) ~- I print_log(server, data, 64);
* y9 j2 N6 v2 U
% t n2 J' F- B" R' q { //9 s: p8 y7 A' x& t/ z. E- a0 |( c
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);$ V1 R" J. g d5 M
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);. [4 f! \/ a& w# K
print_log(server, upp_buffer_b, 64);, m8 |+ n$ A1 i4 c
F" W, O+ _! e
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b); E" z: \2 m9 ~3 j' V7 d& l
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
7 `+ T; z8 |3 x: t, k4 u server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;( W N& \. u) F6 a$ Z( J6 A
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;8 Q* B* \4 @1 C" O" ^+ m5 I; t; K, ?: l' E
+ ~6 x; j3 c! [ memset(tmp, 0, sizeof(tmp));
% T9 |, k& z- z% L sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 8 I8 C G# Z7 E7 G% J
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);7 \1 p" _ D% `. E: f
server_msg_send(server, APP_CMD_LOG, tmp);
# }( D+ ^9 G$ V/ ]; p
4 z' T. \" U! A4 k9 @/ V upp_error_count = 0;& T' g3 ]6 G+ H# B
upp_dmaq_int_cut = 0;* W, l' D, c! D# Y) D) g
// fill in data
$ g$ F1 @8 X4 X: W7 H3 g uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); % }1 ^ I a5 y9 v9 U
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
1 R: Q' m% A$ h4 h1 \& t& w$ s/ ^- {# C$ v3 `
// wait send success
6 L6 T3 t+ y% x0 o: a4 x while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
5 z& k% M& X3 h) s7 f# S' E% A$ J. W6 ]$ f: K7 k
// make data node in free list
' u3 o5 I) K R! F) o ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);/ B/ d( w) M0 n8 A
server_msg_send(server, APP_CMD_LOG, "upp send: success");
1 I( R w; T6 ^" j) F( ^ }0 F7 |7 I; |/ Y, x' {7 l) D
return true;6 m! i0 K( O1 e$ u# B
}! ]& r: a1 E! s+ e' G# g* j% v
4 F, a) U |$ X/ Q `' b3 s( h
4 x9 F) i5 b1 D( k6 G% g9 C" `1 M- K+ ~# z( G, [7 r, H
|, x& y' t$ p, d
; D- m9 ~, ?! v+ n3 V5 Z' m |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|