|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
1 a9 A+ `& e4 _0 W. r9 I0 _; V3 ~3 q; A7 @1 _1 w* s
问题描述:4 B0 ?" X' _3 U+ [" P
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:$ c/ S* X* E s+ s( J" \
: T6 _8 r1 c4 A0 m6 E) K
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
- i) ~* y2 P5 e( A7 G( }7 b1 ^1 d; S" ?, T
测试结果如下:
* g1 F2 E* {: h/ t6 t; F138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?( `8 k7 b) `) q
9 W3 _; W. K* ?- J5 |* K5 S
6 A9 T1 w/ X N# S! @3 ~' W0 t
备注:! }8 ~) Z& Z( Q# D, i' t! v
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
7 Y1 f/ M0 ^/ @1 E7 z6 L# [* W% O2、相关代码如下:
# g$ Q0 y0 c, E( z, z0 K" ^//UPP DMA缓冲大小512字节
! {( W T: ]& S! w7 ~1 W/ {. ~' I#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍( l/ V3 K7 O" N* {! n& T
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT! a2 [9 W+ n- T+ o+ m M
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
2 n/ T, C i9 g# K/ w( R. u: Y; X- y* [0 D0 I8 e! r
( h; g5 ^. t; ~: V1 K//upp接收、发送buffer
0 X5 V5 v0 o3 V; ?$ m4 x#pragma DATA_ALIGN(upp_buffer_a, 8)
8 O3 r) W4 v1 B, S3 @#pragma DATA_ALIGN(upp_buffer_b, 8)3 X( x6 s" `% G3 F y5 E1 a2 f$ e" T
5 S6 j5 c7 Q! nunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];5 M' p7 y0 L& d
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
. y O1 a- `1 A" h0 w/ I" ~: V6 [2 r6 k
3 Z5 K5 r3 \& F6 G/ _4 H
static bool server_upp_data_recv(Server *server) / q! [; E9 `! B& j' d9 I
{* M O- R! @+ r4 ~1 X& z; h: ^1 L- C
if(server->upp_channel_a_recv == false) {5 ?+ L: B$ i, t4 ]0 S4 T1 A9 i/ @
server_msg_send(server, APP_CMD_LOG, "upp recv: start");* M" D3 d; L C! z
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
f+ A; A$ K# z; j- N) j* ~ server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
2 O1 }# ~( ~; D0 d8 b! n9 e9 a a, {' K. J3 X3 F
3 j( b2 d" g/ K, `$ { memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
* t9 C" `3 {( Z# ?% Y' p/ i
# O0 d" b* i, W0 l2 P8 L/ S, H server->upp_channel_a_recv = true;//+ E! `" Q, n, N1 n* @& Z
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);4 v( E% }- J% E8 e
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;$ E# p/ W/ {! K# e) r' N9 T
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;9 G$ u( r; x4 g' S$ u
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//% }0 M4 k7 S6 Y) d+ H. ~/ r
1 O. x: p9 R0 e. f3 S; ?6 h
upp_error_count = 0;7 ^1 M) z, q4 W8 g
upp_dmai_int_cut = 0;/ D: Y+ Q! F P& A7 n
, _* k/ W+ R( W1 p
// fill in data " E4 z) [. e. w+ P2 B u/ _
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
. z9 v& o5 @3 ], B* x server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");5 ?6 W) G$ Z8 P- z2 I, s6 J
}
: y4 A7 U8 j4 W }) W5 ~$ x* z8 e' S- H2 y
else{
3 o! B8 ~* F( T4 r- n if (upp_dmai_int_cut > 0){# g4 e0 n6 Y; h% X
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
5 P) ^% l. F# l Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
P+ R' p! G v! O( K5 n; `" W4 r. B* n
5 _; W; S# c0 F \! a% \! J
//copy data to upp_recv_list_busy
2 w( C, b3 c" I: F$ O5 C: u memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
6 Q' K" ^3 B8 i! D: _( V3 M+ y& \9 H) J
//2 P2 r" |' \ ~0 E: R" v; Y
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);! a \( {' ?. ~- Y* e. G* c
: b% Q0 }, E: M //
3 I) S- o) Q& w# q% ^0 G: Y% V, t server->upp_channel_a_recv = false;//
' v1 u$ w1 X/ q, \3 ]; C0 g# i+ G* {6 {2 D3 y- t; ]3 { a9 W* d' L
server_msg_send(server, APP_CMD_LOG, "upp recv: success");) I6 I1 h- P4 B$ `$ N+ z
}
3 s, q z, l. l& b8 t5 r4 x }
8 I3 [; n/ g, Q( E- \; c: U+ _8 c* _; E% g
% e; e$ V+ h" t w1 y
return true;$ S, A& n/ {# [, E* A a
}
) H: o! f7 i, c7 d. z/ k2 K2 \% }2 h0 `( h0 W6 ?
static bool server_upp_data_send(Server *server)
# D8 e. [/ s' {{; f# O- }7 V6 O ^7 R" Q2 }* ~7 }
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
* ~) t# B0 R8 _, Q- i DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);/ a2 U2 ~/ D9 y& }8 @6 }
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
, @( a8 A! c" z: Z+ m% A char tmp[128] ={0};
6 J8 P1 s9 E4 V+ P
9 P0 i2 n6 p0 S2 d1 B* x4 F2 | server_msg_send(server, APP_CMD_LOG, "upp send: start");4 W# V. G- ]2 t) E# n+ ?7 N
print_log(server, data, 64);
* w- j7 L( G( ~) D4 @: d
3 r, M& d4 J3 A0 ] d5 i w v //
4 a' }( P. O/ b6 m0 w- O( d& f$ h memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
4 v( r/ B% q6 }" A3 m6 w memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);0 X' `* p1 b: y9 ?
print_log(server, upp_buffer_b, 64);; p/ _) Z: k% M+ Y! Q3 h
8 M: @( N: e( N$ `) G: l% Y
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);! q' l2 ]& U( g/ _, S$ v% Y5 v
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
1 d. g& @9 |5 y1 y9 ] server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
, G, ]1 i# @( g9 M3 ?9 x$ D/ x" j server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
0 P4 @0 n3 \ d1 S1 V4 y6 ]+ \8 o( X: O
memset(tmp, 0, sizeof(tmp));/ X$ I4 x( j( |, K" U/ J
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 9 G6 P3 }, X% C2 W
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);/ t8 f( ^) J# [
server_msg_send(server, APP_CMD_LOG, tmp);
* _' G) T4 ]1 N% ]! A# d
3 K! i+ S/ | ^) } upp_error_count = 0;
8 A4 Y1 d) }, N& f- ?6 e6 w; o% e upp_dmaq_int_cut = 0;
, X. z+ H% p) ?1 |* A' ~1 G F" J // fill in data
- T K/ q1 c0 V uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 0 u& K% T, A2 O) t# [7 Z9 K
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
) c# D3 v6 K9 i; U9 D* F. k% {' e9 H/ ]' R- k+ q# h; ~
// wait send success
s4 F6 W9 O+ a+ l! Y2 b/ r while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ; w& M) D* H* G: x7 h* D5 L! B: v
( H$ ?) N6 A( \4 D* t
// make data node in free list
. Y4 U9 ]% t# x) f9 y/ ~ ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);) C' h* r9 S; Y g( {* r' c
server_msg_send(server, APP_CMD_LOG, "upp send: success");
9 t& G! b. d) C9 X" i" u) N# S% E' @. I }8 |6 ~" a( q. t7 Z
return true;: g- R4 A, m3 `
}9 X/ c2 m1 |; B' E1 \, F/ m
! ?# l% f. \9 v+ k, w$ i7 H+ ~9 k$ u1 b8 U3 J1 G2 Q/ O& o
' @, {: b& R: x" T
+ G/ J6 s, \4 Q: L/ b$ P. Q, e3 Z+ t* b J- d! z% W! U
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|