|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 # G8 q& {7 D* g C* U% b- @
# z, y8 } p: a5 P4 }* ?/ t问题描述:
8 G% p z/ Q7 y* w在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
: n/ F R! d( h5 k3 R; L' H% X$ G! F' n& P2 h
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。" V: ?6 I, u$ c
$ F5 c+ A; J( ^8 ~$ I
测试结果如下:
6 ? t( r& S7 T9 o+ i7 A( R# Q/ o! ~7 c138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
K) g9 c# N+ J. i$ j4 q3 |# I% Z! e2 h* R& l0 K5 E- K
) F5 h3 X# ^: u7 u备注:% O) d' A- y" w& a- L0 }3 M
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
( m, M" H2 @' w$ z6 k* ~- {2、相关代码如下:
8 J3 A$ `5 @4 o- D3 C7 I* N2 \//UPP DMA缓冲大小512字节
/ \) _- t8 G! m) Z' h#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍9 U) n+ L' I+ c$ y S2 F
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
& K6 ]' N+ ^ |" W3 _& Z% d#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)9 B5 ?/ \* u/ a$ Y
% l9 C$ v. Q: P+ B8 ^: @3 j J- l! K
//upp接收、发送buffer
/ l- F/ T7 F1 P: R/ U$ d#pragma DATA_ALIGN(upp_buffer_a, 8)+ E( |0 @2 _$ }9 H, `6 D
#pragma DATA_ALIGN(upp_buffer_b, 8)
7 F7 F- s. |$ }" j) ~
* A9 s4 U) y% O" a) r+ x" ]! p4 Junsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];! E$ B: ]$ Z7 a. t
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
: D/ h9 Q$ q4 \8 a3 J; S1 r
: M. K# l1 f( s# u7 b$ R1 \9 M5 i
" O5 x, ~4 O( J9 Y' o* g' g% c5 ~5 Ustatic bool server_upp_data_recv(Server *server) 2 e$ `' d6 P5 Q- R$ h
{6 Y3 ^* N: w$ i2 N/ ~
if(server->upp_channel_a_recv == false) {
, ?, S3 o. C3 u2 L6 X server_msg_send(server, APP_CMD_LOG, "upp recv: start");
j0 u; V8 z# C; K5 f if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
7 n0 p' C% P* U" T server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");9 X( f7 F w/ c0 n
7 S" R9 l0 B% v$ |* ]0 u
% D" [+ n" n8 a0 J) U2 D memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);1 T% {+ [1 X0 U4 e
7 `+ _' v/ V* u5 E8 p0 a) T server->upp_channel_a_recv = true;//: J% y/ O" K, a' S8 v
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
/ q) r! k* f, N' X; J* v server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
: H4 x1 W2 k/ |) L6 @ server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;- H& y6 E9 p1 _. |! q/ z
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
$ e- m: N5 l6 ~4 T' X2 n
" g# X% W3 a7 v, j9 | upp_error_count = 0;
, x5 m1 p3 t, A" Z. L upp_dmai_int_cut = 0;+ Q& [. H9 b" R
4 u( a# v- Y/ t0 F; t* X( i( r
// fill in data ) z7 y# U$ v- C7 {$ q- M
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
* P+ Q8 |/ `% O& Z) F; L server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
' G( w* P4 H* @* Y* s }
; Y+ x% b, j( H( H" P; `; C }
$ g/ w: ~4 Z+ r else{0 Z. e2 K( @0 Q1 E+ i( g- }
if (upp_dmai_int_cut > 0){( A4 f9 t- [7 ^( l# G+ u& P* G
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);9 d! \" ?' }4 r; F+ a! Y; O( E
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
0 Z0 K9 s1 w$ S% z) O/ `$ c" g1 U
2 e7 R$ y- z. K* E5 L //copy data to upp_recv_list_busy. W9 X$ y: ~# b+ G* V7 P# k4 e. M/ c
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);: e: C5 F* E; r' K0 _
$ p3 a& q p+ k2 e5 C
//: k' [% C3 h& u# p7 V9 b7 B
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);8 Q' [7 M- c+ I, k( k$ I$ ]$ s/ J
9 O# v* @% B- c' Q& _. u //
; e1 \0 y0 B. q$ s8 A3 n( u3 f/ z, ^ server->upp_channel_a_recv = false;//6 q3 M6 y: D8 q3 m1 y2 R2 X! r5 v8 x* s; L
, k- j+ O9 D' M* R# t server_msg_send(server, APP_CMD_LOG, "upp recv: success");
8 R8 U# u+ K. p/ V$ D }. g' ~2 d8 g* n& l
}
/ u [4 }9 v: ?, z8 P, C' k$ l9 L: t! }5 }' u& F
9 s! S8 S j9 `0 ?$ G; o
return true;
4 L! c, Q& w% p% X. F$ E8 `/ d9 \}% U% d% _: v9 A" L' O. n3 n
3 f& B7 w9 i( E8 k" Q
static bool server_upp_data_send(Server *server)
H+ l; G1 O4 A8 Y- Y* t' O' @{
, q9 c) r* v- \% P! B if(ListMP_empty(server->upp_send_list_busy) == FALSE){
* I' t9 @; C' Z DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
1 ~* J5 ]# }8 [( b2 y) y5 U unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
: K' q5 o% l0 v# q5 f6 l char tmp[128] ={0};
6 y8 \" [) R. v
& U( c4 Q1 O, i1 Y7 B3 l server_msg_send(server, APP_CMD_LOG, "upp send: start");8 C7 h2 r3 |( d+ U1 x, A5 \
print_log(server, data, 64);; f$ l' i, v* H$ p9 \3 O7 h7 f! J
6 i; l' H' U, _* a k //
+ P* K4 X( M, E. b d% W V memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);8 U$ u7 Z. j0 j/ b4 Z3 W
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
% d" z3 P" }% ~' v7 A0 e6 v print_log(server, upp_buffer_b, 64);
: _& E; E! J0 v, f2 L5 s7 }
+ }& o$ P8 U+ F$ E2 e9 [4 F server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);; e! x7 } ~6 S
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
. E% J! y' l" Y1 e+ J server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;* e7 Y9 w3 f! M& K' P
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;( @5 p. `- _3 o) u. A( y O5 s/ |
* n8 ?$ P" k; m/ l( ] memset(tmp, 0, sizeof(tmp));6 ^: C( Z5 `' H/ X, X+ Q
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
; R9 J' u- _# X% x `" ~ sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
# x* U- @% [ G9 E server_msg_send(server, APP_CMD_LOG, tmp);" ^9 a7 a0 v5 I2 e9 e
0 W& t8 ^9 n2 `6 d& g9 v
upp_error_count = 0;8 h F: O; l3 ?+ j; v( Y; L
upp_dmaq_int_cut = 0; O4 p3 g/ x- y& n% \
// fill in data
# f. u, j0 I/ |6 I. q6 H! u uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
5 T; |5 @2 L# n server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");* m3 d: }$ G4 G; [( i# q9 l
% o6 ~# o! R& {8 e3 t
// wait send success
9 K+ P5 B9 q3 {" u while (upp_dmaq_int_cut < 1 && upp_error_count == 0); : R/ _5 k' ?9 b6 X, _
* y5 Q, c# P9 ~! } // make data node in free list & [7 ?' s% y0 f
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);# q6 V% f6 D- S7 d
server_msg_send(server, APP_CMD_LOG, "upp send: success");* ?6 u$ I0 j, E- t' b- j9 o
}. X3 Y( S& {7 q$ f: R9 r
return true;/ \: |* ?& v. v, [) U
}
$ Q; T% }, ^% `2 B! Q8 l: q2 U5 t% @5 G: U( c
, K! @4 [! Y' w3 n4 y; ]8 B+ e7 j J7 X0 C2 n; q9 q/ N5 {
5 ^0 j/ M* [" z- ?9 T4 r8 \
" a6 S2 R7 n$ k1 G' q |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|