|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
+ x( z- K2 W* y# U, k
" F2 Y% Z) S' \- ?2 g问题描述:" f8 T7 {+ c/ R( [- O
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
1 q1 t4 R& ~" i8 b8 `& g: [& Y6 X' o8 F# j8 f
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
( J4 X; r& X0 d1 O
z& o3 ^4 `: S测试结果如下:2 g5 D9 X+ Z0 t( w1 J! F
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
6 v4 Y! C* C7 l, Y C& b% ]" Q( m6 J8 B; M
, l; u$ @1 [4 ?- ]1 h备注:" b$ [( a& H: O- e% t/ Y
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
6 L1 t, y: w o7 l% L* j Q2、相关代码如下:& [) u7 Y2 F3 K# K" {: t& z
//UPP DMA缓冲大小512字节
) A$ g, U& M$ a. Q9 s5 K, ^% a#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍) Z. Q" b( w+ f) v% {
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
+ V0 b! e3 L# h2 Q) s3 f#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
9 _( V# q) ?8 p
. S7 r& J: o7 @" [7 h
! Z9 u$ g. O$ R& r( X//upp接收、发送buffer5 M3 C4 X* t$ q7 ~) n- M: {% y, r$ @- [
#pragma DATA_ALIGN(upp_buffer_a, 8)
5 g0 y) K0 K3 d#pragma DATA_ALIGN(upp_buffer_b, 8)
6 z# k' I7 G8 e6 R1 Q. D' L% h1 O2 e
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
- f0 W0 n: a1 q( [# H7 uunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
" |& W2 h) r/ F- ^3 ~
! }7 D6 c1 P6 Y8 R/ ], C. J
3 e# L; k5 i3 r1 l4 xstatic bool server_upp_data_recv(Server *server)
; N: E5 c$ I. K( F8 r{
) Z9 e! ~, b; e; F if(server->upp_channel_a_recv == false) {
$ O! _2 p- A+ X. W( D) @* a server_msg_send(server, APP_CMD_LOG, "upp recv: start");
# x5 X. j) u8 G& B1 w if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
8 K3 ?$ \) Z; R9 X" t server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
/ a4 p7 Q$ _: h, a
) @! z; l, g- U$ I) X$ c. v: W3 p2 f, g3 S
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
$ H& V' R$ F. C$ [; V Q
2 L# r7 J; D0 J8 H1 o server->upp_channel_a_recv = true;//- F8 p) w4 }7 K L- Q
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);1 O9 P; b/ V* \5 Q
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;) N" \; Q# }" W! z* G! _
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;: b' i& v3 x5 v9 |" S: R1 M. v7 Q
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//1 I8 k- z" M1 B6 ~
2 J, t: n; Z9 `+ a
upp_error_count = 0;
- v! Q% w( [( ?7 g1 D upp_dmai_int_cut = 0;& q+ J- b6 H7 M- [! |/ [6 ~
M2 m1 N8 |: u- R0 `- V/ p
// fill in data
) A, v$ N% P8 _% N uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);' A7 s. j3 |; Q
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");* |! ?- N% V \
}7 o9 Z+ f; T0 D/ b: ]! Q
}* b' ]+ x+ ^) A6 s0 U- H! y; W! L
else{# V* z- S, q9 Q1 e3 F6 P
if (upp_dmai_int_cut > 0){
. d# V. g, k, T" q! b( y DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
! [) C, b3 a8 y0 q6 L6 r Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);$ w& C7 E2 o" M! u
2 A0 Y2 J7 V# m
! w6 t& \; T3 J8 k& C/ d //copy data to upp_recv_list_busy* i& G! ?# z- H0 h% F
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);* z. p; i9 L/ K
% n$ S8 e% V. k" r
//
8 a$ x- T* F6 \: L! A% z ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);' I1 S) @9 N6 X7 X2 c( M
$ s4 {- m1 q2 r( i/ [/ U& v
//
( }3 h0 Y( f: T# d$ B' z server->upp_channel_a_recv = false;//4 F4 P3 C( ~5 Z! q. x1 N
: p( y" `4 n8 P server_msg_send(server, APP_CMD_LOG, "upp recv: success");
# s# ^ H0 G, y9 W0 ^3 l( H }
2 w- A" v9 K( K- S! x7 N- ^3 n }
4 H2 |* P; a7 X. [2 D7 A8 ^
+ N. I s8 T; S% N. P; z% B m0 P8 L6 I& Z! d6 L% }5 u
return true;( s3 M& x0 s( n, ?4 n1 r( Y, G; a9 g
}' U R' n/ n+ E
( T1 Z, a( o: {static bool server_upp_data_send(Server *server)- |3 f- Q P6 s x. f
{1 V" t" p$ a8 V, o
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
* {# {' y0 N5 X! O, S& L$ Z2 L6 V% l( K DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
5 h2 H) s2 h8 O- ~+ [1 Y& Z1 [ unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);( w, P& I; F6 a$ t# X
char tmp[128] ={0};
1 N, g& ?9 ?- I. c, l$ ?) y! u! v2 k. s
server_msg_send(server, APP_CMD_LOG, "upp send: start");5 ?$ n2 N2 Y3 \0 c& D" w' ]2 B
print_log(server, data, 64);7 l# ?- U* A/ v; C( I' d2 f
. K" U2 z* G7 ]. e( A$ F# y //# e% t6 `1 m& x+ F8 Q
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
: k6 i0 \4 c5 l) f6 U memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
$ v. t9 X& w9 n2 e! s2 J. D: a: H print_log(server, upp_buffer_b, 64);3 W, W' P4 [, r7 V% m
6 p ~4 D/ M. k2 w9 V server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);$ m/ W: e8 v; V- q+ W6 j: ]; N
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
" g) _. k0 {; W$ |: l server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;+ p6 [# y b$ X! J
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
; R2 u7 r9 H a4 j4 Z" f
6 {; `1 w+ _9 A' o2 [: S memset(tmp, 0, sizeof(tmp));
# g' K: u. L- m$ Z sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
: }+ U: n' Y) r/ r5 S, d' W sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
( }5 r. o# w6 g( H$ v5 B j server_msg_send(server, APP_CMD_LOG, tmp);5 F3 L& M5 h; W0 C) R% _) I
3 l' c/ [& X% o/ f upp_error_count = 0;
5 n; Q8 K& S n9 @; h7 x) h upp_dmaq_int_cut = 0;
' x, S6 @( w5 M0 d% A6 `; M: J5 u( t // fill in data
2 u; ^& j* z7 |( j( q% G* G uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); & a+ C7 N( l4 u/ } J
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");% Z8 m% {& R" ]& W0 W4 a
- ~: X) J/ A8 Y
// wait send success+ X9 m/ U: n9 m. o3 Q9 J( t
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 6 x K0 F5 g/ a) M# v/ {8 h$ ^
+ {. W, ?' m# {/ b& G // make data node in free list
6 _# {/ l, ^: P) }0 H ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
& c- X. u( x/ {" [ _7 a server_msg_send(server, APP_CMD_LOG, "upp send: success");/ G4 s6 |. M$ w. @% u1 w; b1 c/ i
}& A" W# G4 o4 [& G/ Q, h
return true;
& {! D4 Y1 M; c0 x9 |8 k0 y}
' x9 E! Q) \$ i1 I/ F
& P, f6 x$ Y1 e5 N
5 P! X% U' J. n0 L
& m' ?9 J! `$ W! T3 U2 @
9 f* l8 p( d! z
4 }$ R' j4 ]4 G9 W |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|