|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 7 a+ J. V" l% f; Q% O0 Z
7 o3 G& j3 a$ k6 X问题描述:
, r: m* Q$ f! ?3 r( P在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:, M3 P, `& t/ M
# l# b. }- m9 v% V( Y0 C/ O# M
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。2 D. Y8 Z8 \9 i
4 t2 [* s' E7 \5 ~; [! P
测试结果如下:
1 k! l! e) I+ L1 R$ {; I+ y* g138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
) D: F7 |4 d. v( f2 C( j, F! F7 f$ u
7 E& M+ e" L0 D1 C% }6 L, q
- H/ {2 a5 L+ d- c; C) R6 g备注:& S; K. ?2 g- j& p
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
- m/ q) }3 v1 N, J3 }& v( f+ ]) {2、相关代码如下:
. a5 q* I/ _, `//UPP DMA缓冲大小512字节' Q6 ^( U, ^' O" f: _: K
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍2 B0 x# N5 h( {9 Z0 @2 G
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
# v' \7 o" b: t6 U* D#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
7 |( `# @0 d+ s4 x1 @5 V* B; t7 c6 g$ ?
6 T' x" H6 z. }' X$ ~//upp接收、发送buffer1 v6 h6 B6 ]2 \5 X# s
#pragma DATA_ALIGN(upp_buffer_a, 8)
0 l) [1 I* e; \7 }2 @#pragma DATA_ALIGN(upp_buffer_b, 8): Z- f1 u3 S7 E1 Q" O' @) n- m
) Z* P' K3 g: `3 I
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
. ?& B. d1 \: @- ^5 Z( `unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];& I' l: e% J: x X
! v: C9 Y# C+ V: _- g( s7 b. Q
; G5 q& `1 m( i' t6 J* [$ sstatic bool server_upp_data_recv(Server *server) ) _- c1 `, D3 G( M e
{ c8 s( }4 Y c2 R1 O; r
if(server->upp_channel_a_recv == false) {4 a e' K: e/ E! {0 D: h
server_msg_send(server, APP_CMD_LOG, "upp recv: start");: Z$ T( y+ \: M( n
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {) n0 R) V2 v' u& v( a r) r8 J
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");0 f) d+ e* [9 o0 Z
' l: y9 e$ ~; v8 ^( a2 j
$ |/ ]' m% a7 f% I9 W memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);, D# O* K& l% e) Q+ I8 J, y
& ]2 J# X2 y9 C+ v. c server->upp_channel_a_recv = true;//
1 F) Z" y) `0 t: i) ]. V- G server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);, L1 \8 V. d" L$ v
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
& m* J3 ^* |. c, s% C! I; l4 c server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;) { S* ^* n6 `1 m/ ?
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//1 O5 f$ `; \1 S# i5 H
& Z1 i3 z& O' T3 {4 ^: h2 x0 n; s# g upp_error_count = 0;
5 P7 e1 y5 A6 k8 T, D0 B5 q upp_dmai_int_cut = 0;7 T0 I3 p7 X+ c2 c! e1 M
. n: z" T5 j3 }3 I0 \4 {# P: L0 X
// fill in data " W3 D$ b5 e0 t, j1 H& C7 v
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);! \/ I' ^( K: B4 D+ {
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
R1 d! t+ d! E+ y }
) y* L' Q( S0 c% L- | `! \ }& T1 [2 I! Q( h2 k0 D) |& i
else{# j- o5 b( ]4 K+ n E
if (upp_dmai_int_cut > 0){
; g+ {+ R( p4 d- t DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);& [; C. A; N; d. w$ o* ?8 S* }; F& t
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
" A3 C' u1 l) [- t7 J/ N+ K
, E B6 l( D* e! l3 e: x( r& m& f8 q' ]
//copy data to upp_recv_list_busy( w, w0 t9 g( X8 q1 c
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
+ w, _5 a. m" `3 v6 u
$ y8 l D1 Y) Q" N4 {+ H //& U7 [: a* Q6 }; Y3 I1 q+ A5 s
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node); D* o( W% P& N
9 D3 `5 P, w( G
//4 t" }# W$ X: V/ C# s% V5 L. }
server->upp_channel_a_recv = false;//9 m, b M4 F' y6 O/ v3 X6 b5 [- W
1 y- V2 w) Q9 G$ j4 G
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
, Z F8 l9 y1 Y( r" w: C5 n$ E }! ~( l- B9 ]- B2 M$ p Y
}
" i' E4 A2 Z6 C; G2 a: o2 ~
1 l( e% m; O/ u2 r
4 m+ h5 C) A% E+ T( l return true;
( W: t& G7 h6 {2 g6 H" a}( b* X7 e' q3 e0 U) F N
4 E8 u1 S) \8 c; Y# h6 M& ^1 e1 qstatic bool server_upp_data_send(Server *server)3 v' J' M' t2 V" V
{
3 [& Y5 c: U2 P if(ListMP_empty(server->upp_send_list_busy) == FALSE){
" H6 F, A& X0 Q& W2 A DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);! V0 P& d m- M5 z
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);" n* i- R N4 T; y5 a
char tmp[128] ={0};
5 q3 d: ?. Q9 d. r! |0 ?7 E) F* i: _! N. i2 z
server_msg_send(server, APP_CMD_LOG, "upp send: start");3 i6 `0 |9 A$ J6 P6 f/ \% Q
print_log(server, data, 64);
5 |+ c( t2 P9 O
; j i8 m/ h$ L //
4 U1 @8 P& b z# J memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
% _5 l0 A' r I8 _9 A0 ]9 A) Y- P memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
/ n6 e' b; A6 `. h" P6 w# S print_log(server, upp_buffer_b, 64);
1 x! t5 `& y& J( `6 I' |' d$ |9 D7 M% X& h g7 O$ Q6 b" \! q9 Z
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
7 ^3 s$ e; d1 _3 }9 o+ B( k server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ) t9 d% `7 {) m! x
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;" u+ g4 r* }7 T# t
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
5 G0 p) T, F' ]( |& U% ?, b/ j$ E" j3 l7 T; ^4 g5 B
memset(tmp, 0, sizeof(tmp));
. C$ z0 C; F3 r; }" [7 l sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 7 e- B& Y+ x4 f# m5 j
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
) k9 c2 M- d/ u( A: F server_msg_send(server, APP_CMD_LOG, tmp);/ R+ d2 j. `% b; c
3 a1 s+ `& [) J+ g+ j0 ~
upp_error_count = 0;
+ _5 l5 e& s( }$ h9 W5 [8 } upp_dmaq_int_cut = 0;5 m% y" u7 [! s6 [
// fill in data
4 P, N# `& |( c0 F9 A uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
: g C" F/ C! W. X server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
7 o |' e0 T2 L: T k4 J$ q9 A
2 X" W, Z0 {" w, ^7 c; K // wait send success
: f6 G6 \# V: k9 e8 a$ u5 ~+ {8 y, A while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
2 L8 [* d& X7 ?/ ^8 v2 ?" d
8 L1 d) I; a$ @2 S' v1 ` // make data node in free list
( b7 Z& D4 Z! C7 I7 p ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
# B3 i5 {) t3 T6 E# q% v server_msg_send(server, APP_CMD_LOG, "upp send: success");
5 H/ p! H' l8 l- `& B }
- A6 A' \7 u4 F. E' ~: Z$ f return true;
9 u8 L* ^* i) D/ ^}
+ p" ? _* W, \& @) P0 S7 A: @. S6 ~2 u
6 n m8 q: x* X
7 X3 h0 a3 {2 y/ m! L3 p7 V. Z6 z+ v- c9 z6 p& ^ p9 M2 Q
# L2 t- _; Z+ _- D |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|