|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 - y6 v0 U' Z& H N
7 y$ F! D% C4 w# o) X# f
问题描述:
/ |$ k7 X$ F) V4 s" a6 P在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
, D, C/ b9 Y V5 @) F4 ~9 J4 M
# ^0 l' i* F1 t3 C+ @$ u图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。+ g/ A, r6 a( l! |4 T
$ o( Y: S- T4 B1 x4 U, G
测试结果如下:/ y' F) n: J# c$ N9 }
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的? q" N8 Y4 \* }1 t, \
( b A ~1 V3 h4 `) }4 k" o, j! Z, ]2 L4 T
备注:( K( C* ]! S( _7 U! ^" g0 r
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
. Z! Q2 O+ {( {9 ]$ ~+ t' y$ y# L1 o2、相关代码如下:
5 }6 u2 u, ~8 N$ k4 v) }, E ~) R//UPP DMA缓冲大小512字节
. d( F+ `9 ~1 T- i! K/ k* |/ p#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
7 o$ B- g# Q) `; C* J! m: f+ @1 x0 X#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT: v6 T9 r; D, P( F! U
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)( `4 [) J; l6 {0 w7 J
* h; i$ m6 ~4 E) Q* B2 q5 J+ b
; L$ {2 W9 V& [6 @( N3 Q S' U
//upp接收、发送buffer$ T0 I4 C4 E8 G0 u# [/ U
#pragma DATA_ALIGN(upp_buffer_a, 8)9 _8 \# V+ J- b+ n+ O; c( O
#pragma DATA_ALIGN(upp_buffer_b, 8)
$ n; d+ L6 B# {" T, f
+ j1 ?5 \+ a# b1 Y; A$ H2 P% munsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
# r% n1 K7 x2 Q3 |8 ^; dunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];, p: ]4 I" N& N) Y) B( @
. z# [$ G/ k' }( Z" h9 K
" c; I; I7 ~/ L: q1 x2 h3 r- e
static bool server_upp_data_recv(Server *server)
2 Z6 K9 q Y: g. \9 F, T{- a* W0 R, n% c% V& h. Q9 B( E y
if(server->upp_channel_a_recv == false) {
" L$ c( L8 z1 \+ E5 y F server_msg_send(server, APP_CMD_LOG, "upp recv: start");- E# V+ _! f* o" I5 `+ b
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {3 l; o) W7 ]$ @, ?; u2 F
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
. A% V# ~) M5 U( G6 c/ S8 |
) ]7 O% e1 Z. q
# y) K; q- w! Z; l# l/ ^ memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
* x: v3 ~1 Z, ~0 {9 Y" t
/ u9 A0 D7 `# u6 p% D6 J server->upp_channel_a_recv = true;//- p& D! |& r1 o6 N
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);* w+ u# ]8 }; F0 ~7 {5 L- r) T
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
' q( j9 B# N! o$ Y% ` server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
$ @" Y1 e, W9 M8 w" C' C( k server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//+ Y4 e- V/ x; Y! o# F) s9 G* ~
% |6 ^# J' M; I( b* F; i upp_error_count = 0;
p+ _) ]$ v) W |2 M1 {6 ^ J2 a upp_dmai_int_cut = 0;
/ x. F" u9 A( L$ `$ a5 C5 h9 E9 H( f0 Q* R, f4 a
// fill in data # O$ o/ K) j+ ]7 H# J% e, `7 x/ [
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
0 `: d; Y8 i) z) S) n server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
: h" z S% s& c: ? Q) o }8 |, K6 {; h5 q& w4 }
}
) s- M: C# t# D1 A$ t, ? else{
) [3 m8 _6 [9 \. F( e) n2 ` if (upp_dmai_int_cut > 0){! s1 w. q7 Z6 o
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
4 B- Q1 Q4 g% v# [& |& V+ n, {) A Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);' Z+ E9 G. \1 ?& [( @0 i: l3 h. ]
5 e4 l, z0 Z0 f1 Q
: Y4 M/ ?: I' f( s. W //copy data to upp_recv_list_busy
, Q) g9 ~; k- `; R9 @ memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);5 G- u1 ^0 m/ n) ]
! o# e0 K1 h# ^+ n
//
0 T0 f; W( H8 M, |# {# i ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);7 W% k+ }& p* p" W. y& M7 S
1 z9 S5 ~, S. g' J3 x
//
- y2 l# w& K/ c$ I6 o' } server->upp_channel_a_recv = false;//
' g; U. J, V) S/ E, k
% c) Y7 |% Q0 M server_msg_send(server, APP_CMD_LOG, "upp recv: success");2 }$ i( W: ~' i7 ?+ J
}
% g2 u9 E" t1 `) D! S1 ] }
2 U# o/ V$ h9 T7 _- S3 `+ _5 \
c9 B$ c1 Y$ u3 F1 `+ h2 [' Z6 _5 E: G$ o
return true;
; {) a" m+ }4 o8 Z}/ O: F( ?- {! \
* J2 r+ {& B4 Ostatic bool server_upp_data_send(Server *server)
( I/ d. w B" }{
; i/ E% l* D" z if(ListMP_empty(server->upp_send_list_busy) == FALSE){
$ v2 r! k6 p' @6 V2 P DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);/ }: w9 C( G# V8 L: \" v2 j
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);2 K6 k9 K4 e! l' Z; y
char tmp[128] ={0};- V0 @! v/ @+ k$ j1 f
1 V9 B9 S/ S9 q" d1 P# _ server_msg_send(server, APP_CMD_LOG, "upp send: start");( W! j U7 ~8 m6 l. j; x
print_log(server, data, 64);5 w, ?9 R3 Z$ n6 U
9 }/ t( Q# n0 d$ z6 E //
) K" D7 B2 Y/ i8 I+ w9 D% e5 A memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);" W7 d/ i1 H2 Z& I
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);5 n# g& k7 M1 K- U
print_log(server, upp_buffer_b, 64);
2 l6 v. q4 b5 ]5 C! B- ]' C' R' j% n9 F) v/ h2 p- V B! i
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
3 X5 Q9 z0 h! \& P; \, O/ b server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; * `2 }; M! c9 L6 V8 e/ ]
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;0 \/ u- n+ i& I; u u
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
: N: e% q. b* d9 Q* [
. y8 i0 ^) r# ^$ _. R memset(tmp, 0, sizeof(tmp));$ n4 S! w; n% ]* f$ L
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", $ E, t A: R2 S4 R$ C: ~+ H" \
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);5 r ~9 P* n% |. I/ K$ g
server_msg_send(server, APP_CMD_LOG, tmp);
) Y" w. F; ~$ |1 R. j. z' `& ]: [! f* p9 |. i3 B
upp_error_count = 0;1 a' u; q R, ^- ~# @ w. p
upp_dmaq_int_cut = 0;
l) ~! L. v, w( J# S: J2 z // fill in data
, \1 I. V6 h7 V9 @ uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ( X8 ?! {1 L/ Z5 F% S+ C
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
) ~, E# r; Y5 l! ?4 L. |3 h4 Q- D/ v0 U/ `* V; N' e& Y/ d8 h
// wait send success
$ S6 z2 E* B5 \1 h: T1 B3 k while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 3 M% w8 q# ?& s& i
" Y v# [- l" f0 d+ I E
// make data node in free list
1 f5 C# Q) q, E* T ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
5 q9 B# e7 @$ z2 e0 N* L7 d X8 ~# _ server_msg_send(server, APP_CMD_LOG, "upp send: success");- j. Y5 |. I; V* }9 D- E. ?
}; ]1 A6 X5 P- @' x
return true;
7 x6 k: }4 U1 i" ~/ T( o5 L}
' d9 [: Y( ^- E
, r. E- O7 _3 E
- z& Z8 E2 X% s7 i4 t9 {$ J/ b @6 k9 S/ V- V
6 p7 C8 }6 G H& f7 O
+ W% J$ F W# {4 k; F$ r |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|