|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
8 F# a/ W } D' Y W
1 g( T3 E" v3 A0 p问题描述:' _2 g& \; K* j7 {* |6 e" R9 b
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:& v) [9 _3 t+ E" z- ~% j- V
k$ m1 z; q8 N5 {8 y) S图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。- F; \8 h7 M! X
) _ m$ t* e* g& B) q% F8 {
测试结果如下:
( w" L# p: U3 d138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?( D) P6 L5 n+ m2 X" ]
8 A) u- i& L5 Z
# Y- ^# `" J! g% p v v备注:
8 B; ^3 V2 M9 r4 ]; b" ?* x1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?3 x0 r. l' h3 l8 }+ W4 k. T( [
2、相关代码如下:! d3 X( d" I) p
//UPP DMA缓冲大小512字节/ \& n }0 o% ^7 T8 K4 F
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍5 K, U& t7 d' W% b& G
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
9 Y- j; w6 q/ P- m& r% a#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
9 K) \; v7 ~: Y1 `
$ C/ m9 K# k! c/ s0 C) f
! ~, f4 h, a- i//upp接收、发送buffer6 \2 X. D8 ]9 T$ L' t/ E- ~
#pragma DATA_ALIGN(upp_buffer_a, 8)& L3 {1 h+ x$ O& ]7 {0 |
#pragma DATA_ALIGN(upp_buffer_b, 8)1 Q: D U0 Q0 ]9 F( _
) e: S6 E! x5 P g7 `; _unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];1 q* X$ i" ]% q, S! F! _4 @
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
& q$ P$ @9 D: A+ h
. e$ w! Q3 s. |* ]; a2 q! ^# T$ ?0 o2 {) O/ `
static bool server_upp_data_recv(Server *server)
* Z! |& {; r' C. T1 e{- L; ]& J; J2 c. z5 k4 |7 U+ l* S# p
if(server->upp_channel_a_recv == false) {
3 H! b4 U( d, P server_msg_send(server, APP_CMD_LOG, "upp recv: start");! B; m- n% \# p! l4 w/ z5 ^
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
! \) y+ V' H3 r. m4 V server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");5 U7 H/ q2 j! m" L" S
# ] ^* k6 z2 `; B) G/ `$ ?* c3 _2 i4 i. _) s
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
y1 }) V+ w; |$ N n, t0 A9 K" ?/ g) R3 T0 f& n. X/ g% N$ M
server->upp_channel_a_recv = true;//
2 R/ R m6 B9 V6 k1 G server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
4 q R9 ]1 I: F* Y3 A: ` server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
. w$ Y7 [0 ?9 C& r server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;+ @8 V* W# t, ?
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
7 y' r) {7 X L+ j. @7 a0 e
3 R* B, t3 F( X! ]8 f upp_error_count = 0;
; l* D1 H& m. o. j: a upp_dmai_int_cut = 0;# i9 a# S1 Q; a G# |
. F% t; ]- U+ y$ h! W // fill in data 8 r1 n, I" D9 v& |+ V
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);/ y2 S4 ?3 Y! [* c: L
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");5 R5 m; k9 y/ V6 p
}1 }# Z& ?! z6 T! G3 O0 R N
}
0 `# G. ?6 }. U( Y+ u/ C else{: g3 m$ o9 _6 M/ J) X$ q& G
if (upp_dmai_int_cut > 0){
6 t2 ]- J; k7 B. F( ` DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
6 B0 G% s) S3 j4 _: P Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);7 |8 n1 P, T" ^7 N; R* X" x4 R
4 f* u4 r: R" [# v" \/ S% ?2 d! v1 U% A2 A A4 B1 @
//copy data to upp_recv_list_busy" o/ p7 f; Q0 d B/ s: G. ?+ @
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);( A; |4 F+ g0 h) i- W6 S I& {3 F
& R3 E1 ~4 v- K" J8 o( k2 D$ D //1 J$ O- z4 a" `/ _2 `! [0 c
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);) d& \+ m {' W# I1 v
& b8 Z! j2 t; T$ j; Y6 l! L' g
// p8 |8 J. P Y8 V& D
server->upp_channel_a_recv = false;//( b5 d2 s6 ]% q( k( S6 o
, j H' `' F( K" a" A+ b6 ]+ n
server_msg_send(server, APP_CMD_LOG, "upp recv: success");7 O2 E) N: _8 V( N7 p8 `2 P3 R
}* M4 W! B# x# j- k2 E0 ?3 `
}
, C5 }8 q7 O5 y h1 B( p& v- ^4 V8 ^; T$ V' |; [
) W% ]. a9 V3 i6 D return true;& k. ^+ s8 Z" `( k9 }
}
4 N' o' d) E$ y0 c
2 L7 ~. c g* F) h- Istatic bool server_upp_data_send(Server *server)
& u+ R- @" M2 W# E. \{" |, T0 P, g) n% K. Y1 o* Z
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
" t. R* h; O' G$ G2 B8 u$ J2 s DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
! Q1 D9 d3 u2 N unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);) i/ b, D' M7 O5 g: i
char tmp[128] ={0};
1 A) q- H2 @1 g6 B1 A! _+ Z' J( t3 }! r8 d4 X- h( y/ \0 y0 x
server_msg_send(server, APP_CMD_LOG, "upp send: start");9 x$ [0 w& |+ ]
print_log(server, data, 64);
R$ G" A% P/ ^
/ z+ [- e- R( x4 C9 v //
0 p8 }1 M9 H7 }2 o! Z: {/ A8 d3 s& P memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);. x+ M$ G$ f+ C$ x. \5 z+ j
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
1 s, ~/ b, x; j; ?! u0 _ print_log(server, upp_buffer_b, 64);8 b# p% E& M9 n. i8 ]9 A
/ C4 z+ x2 Z! m2 t; I1 d
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);8 a* j5 d1 W2 N8 ~6 [
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; + x! t: N# |0 \; _: `
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;! ?* \' Z& y2 u4 L
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
H! B% ` F% u0 o
, j9 X- @& I/ s; P- ?# n2 R memset(tmp, 0, sizeof(tmp));9 O: \( O; s' C5 k+ Q: q' N0 {0 W
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 7 P* b0 E3 M8 T8 ?4 h/ E d
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
/ r, M4 R/ x5 G& C$ f server_msg_send(server, APP_CMD_LOG, tmp);' z0 k" |# L% [- {# E5 Y8 E1 M
+ Y. `0 ?! D) U( o
upp_error_count = 0;: u W) Q C# p: k+ L
upp_dmaq_int_cut = 0;
0 G b. q/ R4 | // fill in data
/ z& ]: M' R. [% F6 K. ]8 i" a0 ~ uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
, S. k+ M& | ]2 M$ M server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");( |+ a$ s0 T2 i, l7 `9 `2 |' h d6 m
+ J4 s- a- M4 b5 Q) j
// wait send success) v M. v( F9 e2 X
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); $ c! a( J" T V
+ n! T$ v ^0 C) R/ E
// make data node in free list
% \* Y( C, f( y5 `1 B9 c& D9 k- b ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);" U7 ?8 X& B: |; |- l
server_msg_send(server, APP_CMD_LOG, "upp send: success");
2 e4 m4 D" A( Y) W0 i# { }
# T; F8 A1 t2 x! ]" d& u; ]$ O return true;
# W/ a- E4 I D}+ E: Y: p# H' _1 p5 l7 W
* B) n0 o6 X0 l8 O& ]* Y( n9 C( W
, o f: t9 L2 H! n5 y/ s1 J# b
+ A9 j; Q9 N- m. K V: K$ ^) v( i8 E/ M: l
+ P4 c& `/ E- \4 L8 x9 l4 J |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|