|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 7 F# K' ]2 Z2 s, K
8 S4 n9 F5 _" o* ?& G3 g
问题描述:8 ?7 t/ N# d' K$ C. B: ]2 B }
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
" [$ A0 u" R: w% Q; \
) W$ e% m. i# s4 m" E图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。' O- n( H# A) Q+ Q
8 g6 s. R! \9 C3 c' [+ A2 c/ r+ g测试结果如下:1 h+ J6 Y% c; I, q7 Q
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?9 x: T! t; V0 w$ l! r% J$ p- s
6 T) S% P8 O/ X A
& i8 T) F5 ^* O% M/ L; }备注:6 f+ {; s& N2 I
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?2 u0 Q7 Q* J/ B; ?6 f
2、相关代码如下:
+ f( s( ~9 f9 D- r1 F* s//UPP DMA缓冲大小512字节4 Q1 N' R0 ~ _2 @" ^% v; A/ i
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍 J C" V5 r o2 [7 Z
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
0 r4 {% s+ P" |1 w8 ]; y' v#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
8 S- v _& O N3 V1 d' e' [3 G' [. D, v% J$ {
+ c" E, b! W0 b3 L0 \
//upp接收、发送buffer
/ a" Q3 _6 x" h2 b#pragma DATA_ALIGN(upp_buffer_a, 8)
0 \" c h3 y; j) Z) H: t#pragma DATA_ALIGN(upp_buffer_b, 8); D) ]8 n. w$ q: {7 d1 O' p
5 }- {) r0 N3 N4 \unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
! a; v5 l' T6 m( b' ounsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];1 `$ f, ]& t: g7 s _
3 h( J1 ]2 c% T3 Z) L: {
0 r4 H/ N* U- |8 G: s, [& W/ Q
static bool server_upp_data_recv(Server *server) % J: a6 p8 E% z$ [. o; C* n" f
{4 j1 B8 i5 I2 S8 S1 [+ K, N8 M
if(server->upp_channel_a_recv == false) {: D( M3 x5 w1 m( j) o0 s$ m! ~
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
; V; ~- x# ]- p! u& `+ z if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
, d0 y: S0 x Z% k& @+ C server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
4 i( l# f8 p6 z9 ] C2 A+ {- J6 S1 H# B/ p c ^+ N
/ d& S0 F( i8 s: X/ ] \
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
9 h; i$ b" u# s9 x6 z6 j3 X2 Y$ C8 y
server->upp_channel_a_recv = true;//
5 T1 t7 O/ b& M' R3 N |& j server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);; _. C0 {9 T! w* g8 a) B5 [
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;( [: I& K5 m. S) h; I w8 A V6 n$ I
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;) q; j, O2 L9 E& M* w+ l. J8 N1 l
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//; ~; j' M( i$ ?
( V- }% k7 T" @3 G. A
upp_error_count = 0;/ H; z0 O3 a4 s+ a( Q( h
upp_dmai_int_cut = 0;4 u8 E; f7 Y8 h, j1 Q8 t
- D7 v1 H; S3 H6 b // fill in data
& S- ^& T" b: y7 }- L2 o1 u' g3 t& X uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
}+ B' P3 r p server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");4 |! U4 _- G- {1 D6 J1 G" F/ H1 y6 M
}
' `, T! Z/ N1 Y5 o; b$ y; | }, _$ S" F) M2 b7 v1 |8 k/ p
else{
( H- X" n* p) Q* o if (upp_dmai_int_cut > 0){
6 p4 K& V0 J. O9 l8 H DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);9 F* c) C- J+ M& }/ f u
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
( c" r2 t M2 s' k9 e+ w" Y% N9 H( d0 F+ D; w
- g! ~9 P' a, Z
//copy data to upp_recv_list_busy0 {8 w, l3 \! x0 f" m
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);2 Z2 o% K- q. G/ Y
7 }1 A) k" N" H% e& W4 ?# ?$ w //
& B3 R" x* r9 M4 b ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
$ m: Y! L) }- h5 W8 Y$ X
! A% B) h; X! M) q( z //
; t' i) q' M% F server->upp_channel_a_recv = false;//
! t1 m8 ?4 x( [2 t, V$ n& D* e
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
% c# B* m0 f1 h- y9 V }
* x+ c0 O+ Q8 Z% r+ W/ T }+ F6 s$ V" }5 e. y& b
" {+ \+ E* Q8 B
# p+ `- j h2 t8 ^) t3 ^ return true;& _( c, F R: N" q" M
}
( g5 i) w4 j, e6 {2 Q/ |
% ]% @, F( M$ ?8 ]' @+ X" Zstatic bool server_upp_data_send(Server *server)9 N! h9 b0 s% x
{- N# }$ |" }" N' j
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
- z4 V! s) t9 V: n2 W+ L DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
* ^9 X8 n2 y- U" H2 q' a: _& j1 e unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
6 r* e4 }( Q: d/ F Q% n$ {7 g- B8 A char tmp[128] ={0};
4 j+ F9 s5 C G p+ F( V |/ F1 q& b6 |+ W" [+ B% }
server_msg_send(server, APP_CMD_LOG, "upp send: start");
2 l# A) l( u M6 ~5 O print_log(server, data, 64);
) e( O' A O( C2 q. R4 a' |" B) r; v$ F- A% [ s! K& v
//9 `. g. c, a" J. s
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
0 B" f. v4 {; {$ j$ G, v" | memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);% C1 m( E" [7 h
print_log(server, upp_buffer_b, 64);
9 H9 d+ ^ f( s
9 l' P* z# e; f7 r/ F server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);* u% g$ t# T1 |
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
# P- `9 u- ]8 M- F7 K, M+ g server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
2 I- Q% p0 U3 \ server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;5 f: G6 p. `7 h! W5 [+ ~
( A. g5 { k' a$ W memset(tmp, 0, sizeof(tmp));
7 Y6 w. h# q, b sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ( C9 ?! A8 d) x3 }
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
7 |; u. y! S9 l9 h/ ~- y server_msg_send(server, APP_CMD_LOG, tmp);
0 g7 B4 ~6 Y: o1 i# t( m6 d3 v) M$ X, I* \3 C1 ^; R4 Q
upp_error_count = 0;: U8 L0 @) q# s
upp_dmaq_int_cut = 0;
$ w- F# O/ d0 b2 k // fill in data + i) z0 C/ E1 q) ~9 g
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
* g8 \5 G+ j/ J4 z server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");/ C7 W7 R- ^3 |3 T; p5 | ~
: s& p- b0 g3 a( V6 V1 r // wait send success
5 s9 }/ [# W( c! J) C" w$ z8 @ while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
( r9 v4 z9 o. ^, @$ x4 v2 ^* W0 C
4 ^: U' q0 E! V, ]9 s! y4 M // make data node in free list
* _" w/ X" P2 f. \ ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);. T. r1 @5 C, f" Z& A; G
server_msg_send(server, APP_CMD_LOG, "upp send: success");
0 s- t! ~% P q3 `' F }
& j6 @4 Z$ O, u- ~1 }+ m/ _ return true;
& b& b* V; w. U& c}; A' Y! g1 v& s3 n# s1 |
( ^1 L; J9 P+ `% r: ?# P- w: L
( s$ Q! {7 F3 `9 u& T
# ~( |; X' u# O0 `* c* O; J) J4 i9 R% a2 ~% A
$ h2 U. }4 u6 A, v R$ i0 H
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|