|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 " p" P- T4 s) |9 f2 G& M5 F
3 v% H5 N2 B6 F' t3 ]( Y+ x" `
问题描述:' Z0 q4 r8 X& n; [3 T& s
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
2 {3 M6 |; b1 T. Q! v+ ~# y; Q! u# U% ]! j' _1 H. [8 Z4 f0 m
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。* a4 R, m+ F8 V7 e
/ M+ ` n5 j$ l# {" P$ T
测试结果如下:3 [0 u' B0 s- K' v: s
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的? N0 x* \- [7 _8 Z; r
2 e* l) i( K5 O; V7 ^6 o) k$ R" T) a" P
4 I; I# i+ ] a) Y" Y" y! T备注:' u* }, H1 u4 }0 O) C
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?* m" x5 z9 K7 L/ S8 K# F; Q. P: t
2、相关代码如下:
' E# j, |: s5 |3 N( U/ ^//UPP DMA缓冲大小512字节8 v* e8 f1 E0 D7 \. A( @
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
6 A3 z: Z+ [5 M% J7 p! p3 _#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT# {" [7 O/ D2 `7 x1 C3 R0 I6 Z
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
8 f9 b w1 s! U' h* i; q2 s
. Y( I, U0 \- T8 F! G6 O( t
- u/ V1 C9 I' O, C6 i3 V6 l3 ~) v//upp接收、发送buffer. y6 D! ^" e# F* x& t+ c
#pragma DATA_ALIGN(upp_buffer_a, 8)$ p6 E @+ [( L8 b) \2 c
#pragma DATA_ALIGN(upp_buffer_b, 8)
_% V& Y O5 E/ a
3 d, _# v& n$ r" I/ M) Eunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
, Q) O% P) D* Q% z% @/ Xunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE]; ?2 d* c4 L" O7 q; ]" R8 W# T
- u+ |! V- \7 G! J/ D6 C
# B, p: B: _! I& ^
static bool server_upp_data_recv(Server *server)
9 n" d! q7 \) r) A$ f{
% F9 o* @6 Z$ R7 _9 h6 D4 L if(server->upp_channel_a_recv == false) {
5 R- u. N" Y9 [9 ] server_msg_send(server, APP_CMD_LOG, "upp recv: start");5 g+ ~) J" `! Q# k% e: Y) w, }% E6 @$ s
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
6 M) X) s, `9 d, C6 @ server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
8 p2 v+ c2 ?' t
8 p' e w9 ~: L) N% n1 {. q' E
- D4 T' l- ]# k5 Y" `6 Q0 B memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);3 z- d" R/ p$ |5 W) a
$ F/ _, ~- ^3 h! r; E' [0 s
server->upp_channel_a_recv = true;//
; s' B8 S+ y4 c' [. V }8 S+ z server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
* a1 e9 M* }0 N0 g server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
4 a# _( n2 o, m server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;' C/ B( t% t, _7 `
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
3 W- p5 U1 L0 Y' D# J- u
" X; F& {/ {- z1 P: g( z upp_error_count = 0;
7 C% p9 N3 V( U; L6 L' ~ upp_dmai_int_cut = 0;
9 h9 b( X+ R( g2 |+ y3 j( P9 `" k$ m) a# r
// fill in data
; c# `# Y/ ^) H uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);) ~4 G9 r- _; S l9 z4 S" Z& \ g
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
7 K1 B- J$ I. S4 e: [: c }( G+ g/ E# S1 A: a Q$ v5 w
}9 y$ Y. Z' p! X. A1 `
else{
?; H) Z) F3 _2 _1 _ if (upp_dmai_int_cut > 0){) _/ J2 v, x6 i6 `' A P
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);& f% Z7 i8 n, Y) ~
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
2 ?& t4 u8 g4 W, }
5 v5 f+ _$ K7 D; b0 d0 x6 f9 ?5 _
, J5 q6 \/ S+ p( {& f //copy data to upp_recv_list_busy
5 B! i3 _' a/ m: c memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);' \4 o+ W$ A$ M- C
/ ]# A, c3 _" ^* K8 D" P( m5 V //
6 |, ~5 i& B l) K, O* V ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node); z( U5 M% |1 _2 h" @7 i
: q+ P" @% S0 f: q
//- h) O- r* J6 {7 ?! k: A
server->upp_channel_a_recv = false;//( }9 Z5 g7 s* M* N
. q" ^5 _1 C, x ]4 I* M* Z3 C server_msg_send(server, APP_CMD_LOG, "upp recv: success");
5 }2 P3 W6 W' C' f/ { }5 {, X7 ~, j. u1 Q" }( _
}
) @5 z* L9 ]: R! v" Z2 c# K) ^8 s% @6 v) m2 a4 @
i3 `# e) {% f return true; C0 d5 L- G( }
}
3 E3 o4 K* _; M6 `7 j
* f ~ ~7 E1 Cstatic bool server_upp_data_send(Server *server)
, V. |+ a- t# h1 V# z& o{
[7 Y! E% h- ?! @7 ^% Y if(ListMP_empty(server->upp_send_list_busy) == FALSE){
' W/ _$ j" u& c, o& w# _: L2 H! U DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
r* D% j, R6 A# b unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);- ^" ]6 {7 B* K5 |6 r
char tmp[128] ={0};' v5 g) @ g2 m6 M2 {
6 J- Y& B% o6 L server_msg_send(server, APP_CMD_LOG, "upp send: start");7 P9 m/ B3 T0 \" M Y
print_log(server, data, 64);
. k- _/ e( v* h3 O" I% t1 _+ \8 c c! _! o& P% l* }4 Q0 C6 V
//4 \* L+ B3 @* A' ~. g; o7 O' m
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);) D6 W# g. w3 O% F% k
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
6 F$ i/ h& J/ |9 {+ ], x print_log(server, upp_buffer_b, 64);
$ Y7 C" ?% u4 R+ X. H# A4 b) z' Y) z+ g" R$ @# c
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
; m2 G8 C$ o/ B& T7 K server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; , x( O& b4 J# A
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;! N g! A! P+ T% r
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
( a2 K+ M8 Q4 \ I8 I; Q, E; }1 }$ f, a5 z( \8 _
memset(tmp, 0, sizeof(tmp));
5 q" S$ U9 }3 d5 H sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
' q& d1 Z' P7 o) _9 [ sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
5 s4 L3 i/ m: |6 _5 a# D5 X server_msg_send(server, APP_CMD_LOG, tmp);. `( j& x ?6 V, {* R; n
9 g" [+ b- c ]& j6 r8 ~- b C6 }
upp_error_count = 0;
4 K/ j1 U6 k) F upp_dmaq_int_cut = 0;, h+ ?+ w3 T& a% e8 h/ J
// fill in data
( b. Q4 T7 @7 p, Q+ W4 A7 k+ ] uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
+ I& ^0 l: h, I% S$ k" g& H server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
, J( z" p: V* J+ X) K3 G% |/ M" y' ~5 Z7 u2 z+ Q
// wait send success5 A' J3 @" K. m* a4 \
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
- G2 y& I: _; |5 p5 a+ s+ z% P# Z+ b& b, I5 C8 V; {
// make data node in free list
+ a! c" y/ y. P% k ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
: b3 a' ]. B! X) h, G+ v server_msg_send(server, APP_CMD_LOG, "upp send: success");1 Q7 p t' U; K* s3 w
}
3 z( a: o" p! x6 j& W) q& |4 c t return true;
3 H! \ V0 D1 v: w) n}* \: G0 W2 \: M! P) `
- r3 x' r2 |- S0 [6 k. @5 H
( d/ B" w' m4 |0 f
7 a5 ^ f5 \5 n( ~& V' u' V
( a# L {5 t. {* Q
9 S0 k+ y6 D0 h: f+ Z T
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|