|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 5 Q* w* X1 g: U' @2 B
* l8 Y* S, b' f( V+ _" e, ~) R问题描述:
! ~9 H z6 \$ ~在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:, P1 k$ U, L2 \% @1 c
; E2 X0 ~% K6 T图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
) t8 x0 e' [! r& f2 E. j+ x" U2 d. p: Q. a! i3 ~+ i! ?
测试结果如下:
0 y) Q$ [ r+ h. S! z8 R: K138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?1 P+ {" D: P& s ^+ d! ~
) N# m) Z+ |: w
! L1 n6 t+ l+ ]3 @备注:& b- o K4 l6 F- [
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?+ w$ q/ ~% t' g, b, l' L9 b/ a3 P! B
2、相关代码如下:$ D* C9 e0 m9 o1 n9 e, o
//UPP DMA缓冲大小512字节% L, v( @7 p; @/ o* |- ?( f
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍: a, G6 W( ]5 o4 e& N
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT7 o5 Z+ I8 V! o* w V- D1 A
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT); Q( u7 i4 T2 W! {: ]$ H% I- H
2 `0 o! h$ s( n v
/ ?. }, e: x: H& R8 t. w//upp接收、发送buffer
# F' t# c E, Q2 C" Q3 L7 p#pragma DATA_ALIGN(upp_buffer_a, 8)
. e* L2 O* Q T' u! U#pragma DATA_ALIGN(upp_buffer_b, 8)/ c6 F* d$ r1 u( ^6 B5 E
+ S! G/ w1 u% p i' bunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];3 X- P! D2 T( r$ ^& o b3 i
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
& [$ _& W3 c y9 R% I/ G$ X ^+ o1 O! t# K' x8 J$ N% m
6 ^7 \( i' O: u3 n- h$ O5 ^3 G
static bool server_upp_data_recv(Server *server) 8 ^& A. j6 \3 X1 r9 w
{
( a g0 t& r$ z0 M if(server->upp_channel_a_recv == false) {* [1 p$ ]' G- {. _7 R& B2 f6 o
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
. n/ _% }: a0 h3 ]- {7 J" Y if(ListMP_empty(server->upp_recv_list_free) == FALSE) {1 K% J4 c5 h8 d. C& W" x: ~
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
z3 w$ K, s, Q
: s3 o! [+ T0 B) D h* P$ q
% q7 g9 K& W0 E/ d: Z. { memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);6 y: G+ m0 R# c
: i6 C# `2 D) P# h. p. y server->upp_channel_a_recv = true;//
- V( z" N- ?$ z server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
* E+ J3 j4 h6 ]7 Q; S server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
8 ^! o5 \$ v. w8 U1 z. x: _8 I server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;! l4 k# V6 @% I5 _
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//; h7 @( \$ ~8 R# D1 }7 N
0 ?% W6 _7 `) _& o( Y) y: C upp_error_count = 0;
; n* ~' l8 w4 o. x upp_dmai_int_cut = 0;
7 Y* c" b; S: W. X7 W# K4 p( _( t$ r: {+ @9 k8 Q
// fill in data
) o+ K0 s* {6 A uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
8 m0 F3 i9 B+ x1 `0 ~ server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");4 W- K/ b- S; L) B& O2 p
}. b5 H# l) o4 p& a5 `
}
0 F. Z( @( `6 m else{
$ z3 a) Z/ L& c# m) c; H2 q K if (upp_dmai_int_cut > 0){
% X& g4 h2 a/ x) \# C DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);; O: @9 X1 @; a. Q: [% p
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);4 x, V& O/ D3 R8 H- ?
2 _" P& v8 T8 w( u- {
% r5 Y1 O/ h H
//copy data to upp_recv_list_busy
/ D% n9 f( i# C4 e+ H- }7 L3 N memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);% ^& F6 E5 ]* T0 O
8 x9 r/ ^ c) p/ e, I) z) V
//" \3 k% J' H/ c% ?9 ^; x
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
O4 e+ c0 ^) p+ X8 }; n& K. r) K' S# C
//5 Q# u, j4 K; }
server->upp_channel_a_recv = false;//% ]- S; b/ S7 }
5 ]8 b% s8 |4 X
server_msg_send(server, APP_CMD_LOG, "upp recv: success");; h/ u7 x1 R- R' U/ k/ _
}* I+ M- [7 E! B% ?
}) Y1 Q( ~$ o+ m9 I: C
- v4 C4 r+ N9 j9 i" N
/ o# n0 l- f9 }) M% M return true;
) }' e' o" B6 a0 r+ |' R. r. Q}
4 r5 z- }6 \$ p7 {' m) j, W
+ V* ^: j2 d" O+ T* Jstatic bool server_upp_data_send(Server *server)
; }% c' L9 y6 J: b/ b{
9 m5 t! ^2 ^) T& ?* r$ p2 } if(ListMP_empty(server->upp_send_list_busy) == FALSE){
1 i2 w/ M9 Z( u* f( d4 Q- z5 m+ ?+ X DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
$ g5 s h0 p0 Y( l8 G1 O. Z unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);% Q. n$ y5 k9 y, k) A, k5 @
char tmp[128] ={0};
9 T( p2 j8 ^+ T1 A- ^& O$ q
5 E% Z9 W, c9 | server_msg_send(server, APP_CMD_LOG, "upp send: start");
0 s2 |% a7 Y. V! T' x print_log(server, data, 64);
& o9 j" _: s+ M
- V, r/ l+ p& b6 F, n- o //. d0 I& D4 B% n4 B; j% K3 N& S+ k
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
+ e& u6 ]& s* y+ i9 ~8 |% s+ M memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);1 R* _! ]' g3 }# s7 u& |! W
print_log(server, upp_buffer_b, 64);
& r: Y d1 C/ t, G2 Q9 @
9 {( ^6 {# F( i* N! k8 N server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);/ p8 W/ ~1 H+ g! |0 u
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ( B# {8 |$ n1 K+ ~- y3 M
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;, u6 T* t9 k( |7 W% E+ Z0 [
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;: K, `$ e) j, J9 }% o3 t6 X1 \
( b8 O2 c: e: N# Q [
memset(tmp, 0, sizeof(tmp));6 K6 B7 z0 R. P3 e/ X& y( ?
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
' W4 G9 K( E* l/ I/ h( M c' X sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
0 }& R# c: h: T& t4 O* E server_msg_send(server, APP_CMD_LOG, tmp);
" J/ ~ y7 `% O# x9 p/ o% w1 n. A4 a3 h2 c4 `. V5 x' m' B; m
upp_error_count = 0;6 B1 l$ I/ o/ X; u0 g7 n, ?: c3 Y! h" f+ V$ M
upp_dmaq_int_cut = 0;# p" k! \- E; Z+ F
// fill in data % p1 u7 b# A; ]7 w/ |$ {1 Z3 k6 o
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
0 N3 e) e. h, R server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
6 R9 N1 P1 Y, G+ D! I! I1 J* q9 j: |2 h5 a, b! K
// wait send success9 o% m! D, K" P9 g1 c$ c) @4 z* J' k
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
9 h- v# O1 U) p( ?' N! w) k
! S+ g' A/ c4 }8 m/ l9 u // make data node in free list : p9 h+ i Z' \# i% K) V# w
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
" K, S7 z- { i" O server_msg_send(server, APP_CMD_LOG, "upp send: success");( D! ^9 F7 N# i
}
( A. }7 x: k; {) C return true;8 o \) s. _8 a7 S1 N# F% w
}0 ^1 k# C7 ^* b/ g: [
3 x( V& \( d6 c" W; c
6 a8 v0 N! r1 K# M1 m# [& m
+ C! l' y, y7 e {2 z) m7 M
. `; |# u) c5 t" k+ D/ j& R7 a2 z! G' P
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|