|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 8 F6 z- ]4 w) P- a8 `
# P/ X' A: i0 P, H0 W3 K
问题描述:- Q2 K. k& c; v* k
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:% \0 f; A9 ~2 F& d. }8 s! ~6 X4 f
( R& x. y6 U9 E; i
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。 F3 i' G" V% C* e( d2 O% H
f/ f8 }2 G% b' a5 e
测试结果如下:( w5 T q, p, `
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
/ s' c+ Y# h9 @: f8 x) U
! q( W7 _$ s( m& I
( d9 L1 t( x8 T8 O备注: s+ i+ [4 U S
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?# c! j8 E$ y8 o; m
2、相关代码如下:
2 R/ V D$ M6 Z3 P7 A) l2 w' C! x//UPP DMA缓冲大小512字节
! i V& f7 D) G: {. d+ e#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
" s6 j; Y% ?. o2 s v# O0 {#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
' d: Z3 e2 ?4 r' N. b) ? l#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)& S3 P" Y" l( I) a8 i( L4 h, |1 H- g
: f8 n7 ^; m! T& o$ ]5 C/ h$ K! W0 L+ E
//upp接收、发送buffer
* ], w( J3 m" U. e/ J8 t/ r8 M C#pragma DATA_ALIGN(upp_buffer_a, 8)
' |# j% }9 X! E2 q8 e#pragma DATA_ALIGN(upp_buffer_b, 8)* ]3 @: B# u6 Y4 J2 G; U
3 ]& l1 j1 l7 F7 c( |) `unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
0 x0 _, u" z/ |3 l6 eunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
# V g9 `5 H: h& ` x0 y- \
$ r ~- D/ \ p/ F7 ]# i8 ]6 n: P5 G0 D1 s5 l
static bool server_upp_data_recv(Server *server)
5 d- K' \( Y: `6 K; y/ g{
0 q0 K7 n9 V, k6 L ` if(server->upp_channel_a_recv == false) {
" P, K5 r$ T! w: P7 z server_msg_send(server, APP_CMD_LOG, "upp recv: start");
, E2 I3 o4 B" L if(ListMP_empty(server->upp_recv_list_free) == FALSE) {( x6 g; {7 i% C
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
* O' A$ h( H) j* Y! _8 `7 j. r, O( I: u+ h& Y% l% c1 i
# \8 `6 V8 U: r1 M E memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);) h( u2 t! X0 [: ^" N, U4 o" D7 y
+ J9 O: c- C9 ?2 ]
server->upp_channel_a_recv = true;//
8 h/ u* V, Z x1 m$ E$ Z2 ?4 m, r. D' j server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
* T, C, E8 {2 X4 F6 a* d L server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
* k0 ~: f( ] Z+ u server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;9 h' t# y( B. f8 B
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
* V) u0 ^# n2 z9 o
) N7 b I3 ^4 o' ^, a+ S upp_error_count = 0;
/ }* b8 S4 z. n! \9 e upp_dmai_int_cut = 0;% k' G8 g1 t% Z$ S
. K: Q! `/ i7 E2 x5 r) {
// fill in data 5 y% _! S0 ^- G; w9 r C. {
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);# b, f& l: l4 s2 V& J- C
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
" h6 ^- ?( k9 y1 ^ }
# P' {. `, ]7 S0 ^/ U5 K }
; f3 ]- Z6 o+ E8 B4 ` else{
" o8 }+ E$ B) r5 ]$ Q if (upp_dmai_int_cut > 0){
5 A& Z1 D' h6 g7 G: \ DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
& R/ y% Y8 q0 k6 B* w Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);+ y0 b7 A" o/ ]# w0 f
# p: \; U/ b* B5 T/ |. Q! @9 ?5 Y$ w( }
! d. Q' x1 X. e0 U7 i& b
//copy data to upp_recv_list_busy R, Q5 C2 R9 ~; X
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
, ]5 E, Y! P/ A! y2 z+ }& r0 ?* j) k# w3 l% A; e
//& p& k% Y, N$ G+ n, N
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
/ m7 U' T! X- [7 y$ `9 L+ H% x( T, A: P( P2 q* k0 ~# b
//5 s4 ?9 K- F* p) y: a: N
server->upp_channel_a_recv = false;//9 {) `3 R: I a7 a9 D& U" c5 f
: q, {( e, U7 g5 O server_msg_send(server, APP_CMD_LOG, "upp recv: success");
0 g; ~8 S! w. m" E }. S+ @+ u: x0 z5 V
}
9 |4 x0 K+ b+ a. i+ W8 o/ }7 {4 f4 @
& w' o8 ]' H5 c. e
return true;
+ H3 j5 N7 A( ~( j}
. N/ m$ {7 T6 B! M7 o
" U+ i- n( F' I6 s0 C" Ustatic bool server_upp_data_send(Server *server)4 ^* ?+ V" A7 g2 t& g( o" b! Y6 m
{
2 ~% \4 A) n% u6 m if(ListMP_empty(server->upp_send_list_busy) == FALSE){
m* H/ D4 T' ?) p& ?! v DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
$ f4 c: i( Z3 P; [# u+ d unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);3 E8 ?- g; L' R" @
char tmp[128] ={0};
6 `6 u( N' B7 K. u
; j0 [8 Y2 x' D4 r1 o4 w server_msg_send(server, APP_CMD_LOG, "upp send: start");
. _( ]- }7 C# y+ C3 D print_log(server, data, 64);2 u) w& B0 J) A" [. j' C
2 C' t, G, J4 s1 N4 c# t //
) W; A% g* B! ^6 k5 W memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
) c4 e8 }0 `9 V w2 r memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);: r' s n2 k7 D' m% q, E' M
print_log(server, upp_buffer_b, 64);
6 P- c6 B) D. p3 C( f" L R
+ j" e. ], d) Q! d. Z, I3 x4 }/ h server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
4 `/ W& p' h* Z f) `9 J0 m2 S server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ' u# K+ f' e+ E6 W3 a) D
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
E I3 N r) g3 n5 \2 j1 u4 } server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
; `: C9 m+ c' p" p/ e
8 A, D4 Y3 V; Z) T% X+ }& ]+ m memset(tmp, 0, sizeof(tmp));
# r4 Z3 u# B/ P8 C5 ~( q sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", - k+ ]0 | `( f7 g: s) {, n: s7 u' D: L
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
+ t' [* _/ Q( F7 b server_msg_send(server, APP_CMD_LOG, tmp); `" u7 `2 M" e' C# {9 O
* s: k' @6 q/ g/ P" i5 [ upp_error_count = 0;3 K$ m: B4 n% f7 T9 M
upp_dmaq_int_cut = 0;
7 e/ s* C! Y$ S5 X // fill in data
2 @' M, ~4 P* |5 O- A uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
) `- z4 O y1 ?. i$ I server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");: Y& i0 P$ R7 }9 i" l& m
* H* ^7 ?5 \1 a) A$ p3 z' O$ P0 s
// wait send success Y/ ]* m$ s. ^9 _1 q, N
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 7 X9 Q! H* S% M- v- J7 r
) Z. V2 i4 w2 ?: y4 }% ] // make data node in free list
. e$ s2 t ^6 X D& y ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
9 s; r; I2 d1 J# f$ Y server_msg_send(server, APP_CMD_LOG, "upp send: success");
& ]2 ]9 r" z3 t$ U ]" ] }
; |! V/ h: w; {& r4 j- m k8 A$ Z return true;/ O7 O }( f. N k q$ C
}$ M ^$ h( X) Y* [3 Z
2 v% a/ V6 i# i
& v+ U, W( ^8 q7 X+ n( }7 B' C( x" L4 z9 Q8 O( U
, M, D _( ~' n$ M& @& X4 h) f% T3 h/ J* s
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|