|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ' t, U$ u: b! a; J
# x x' i# a" ~" I1 Z问题描述:
6 f$ |: N# x* K# x5 H4 d在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:* s% J& z, m) W4 _3 ]! n
M0 z; E1 m' O# \8 o. u0 e4 f$ K
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。! B7 {! n4 Q1 \
% ^ Z5 @. v" V$ t1 Y
测试结果如下:) Q$ `' ~3 G7 A2 ~ p1 h! S
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?6 m) _) j. w3 W+ x9 n
- \5 |: |$ }' v4 ?. H& `9 b
3 C' @: v# X, b P) L1 U/ s备注:; x& p9 M8 \( n! R' a6 o
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?$ H# N; x- I2 U, A+ }7 i) e0 s
2、相关代码如下:/ r' Y. l* G) E* B9 b0 {3 b
//UPP DMA缓冲大小512字节
' {1 N) r- l$ [6 z; d7 o#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍2 s- y3 {) t7 j3 s
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
/ s6 |+ i8 V5 C) O _8 G#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)2 K, q+ ?9 E: }; r8 R' }# V; Z
: L. J/ _/ \; a% s$ L% B/ }8 {4 k9 _8 P* ]* o, s2 } I% {/ ]
//upp接收、发送buffer
, _' G9 Q! n, P/ q#pragma DATA_ALIGN(upp_buffer_a, 8)- X1 ]3 g3 X7 u2 X2 f' \
#pragma DATA_ALIGN(upp_buffer_b, 8); t: z6 D. Y6 D
9 r1 a/ u4 {6 ?8 i5 Z E- l" w& }, J( xunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
$ q: F1 l, Q+ `- @unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];( ~( j4 m: D2 V7 s; Y; o/ |; S( R
1 \6 @5 u6 c u9 n
, L( y/ E" y4 c6 E9 {% istatic bool server_upp_data_recv(Server *server) % k$ n) y( o- X7 V# R) G3 r3 N
{
, {) W o- Q4 v if(server->upp_channel_a_recv == false) {
# s9 J8 H+ m+ N9 l server_msg_send(server, APP_CMD_LOG, "upp recv: start");
" h7 _) ~( }0 L* k0 K8 _ if(ListMP_empty(server->upp_recv_list_free) == FALSE) {; M: S) i4 B1 |; e0 Z L
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");3 O9 i1 `" j' _) d" @0 t. b; @8 Z- z1 ?
# z" A2 |( }0 p1 E
; f/ O$ t7 S( w1 e, [ memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE); j5 e2 D( a" v. g
3 m' a5 U6 _% `$ ] server->upp_channel_a_recv = true;//
) C& a4 |' V& }2 R! i H1 ^: M server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);% e! r( O, G! z& D" M7 \
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
" A. H% Q0 ?/ \7 G server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
+ x4 Q8 j# o( p( ^$ G7 L8 K server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
3 \1 }, l, X9 G. ]. @$ ^
" d- N) O: ?, T* V% ?, s upp_error_count = 0;
, [2 R) l* l' u3 }, P upp_dmai_int_cut = 0;
0 z; p4 U8 h( k$ j2 i
+ z& ]: i* z ]! u // fill in data
% i6 Q0 ?# z9 H; b* n uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA); i( X U5 w7 K$ E, }: L
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi"); e- R4 F: P$ n) o/ H* f% m
}1 x6 K+ ?; o& M9 w p- _0 p
}
2 |! \2 J# V/ Y2 v+ ^; k else{6 \" f# k+ Y. {! l. G$ B: l
if (upp_dmai_int_cut > 0){
6 c2 }8 }! q, ~1 B DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);: y5 @+ s: n* {9 {( T4 }$ ]* ?& A
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);( ^# B/ M6 u5 L7 W5 [" G6 ^
4 P0 j. H, \6 \$ B: I
' \9 H' U- w; l5 O, G+ s //copy data to upp_recv_list_busy+ e) U) h2 L* [) \
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE); o( y( w8 H. C/ Q; K2 b0 W
! u1 y, U; K8 `4 @5 Z //
- I3 \2 d4 F. {2 G, |$ ] ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
& s! u' i! x5 u# X
6 e# }& d; ~4 \( e5 k //2 M' R% N" }* |/ P2 R: s
server->upp_channel_a_recv = false;/// j& L$ v2 R+ Z" {% T
* G0 h g" K6 d3 o4 O3 M) U
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
2 e' y2 K" Z: [0 C! m0 N }
7 k3 ?+ y$ n. k5 s% V% L }
! |+ H( E" r9 i! ^; I7 m/ z, E1 C; h
0 O; G- j6 _3 k; u2 p3 P return true;
) L9 g, |- |+ p3 R% l( _* x8 W9 z}" D0 \4 J/ W4 I, m+ d, t
/ ~1 ~6 R, Q5 T1 n+ n( y9 v5 [
static bool server_upp_data_send(Server *server)
) t9 i4 p; K1 `7 k0 N5 I{3 N# M& ?+ r* z: @9 G9 n
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
. r2 r% @: K/ R9 a5 } DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
' k1 Y6 ~, h9 U: w& x unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
# T& R5 Y/ f) ^8 h. z4 V, J char tmp[128] ={0};0 t4 \* g0 t( O8 P4 F
! Q) v) B9 D/ ^) d Q- l server_msg_send(server, APP_CMD_LOG, "upp send: start"); N/ F! F+ L; K% v% \5 D# y+ C" H
print_log(server, data, 64);- [# _$ D' v* R4 A0 X# w
1 i% Y3 R! o& d6 R
//
( k+ z2 ^9 K4 l1 K4 D memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);+ O0 H/ r9 P& Z- i" ` `! \
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);; ]1 A! B; j6 M/ T
print_log(server, upp_buffer_b, 64);
8 o T# P0 U5 p4 A5 v$ i+ F
+ G5 @' ?3 O# u* k server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
, ?( Z, h" C9 j: [1 }& [ server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; / R4 J2 S6 T. f* c0 P
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;3 w' U) y2 J N6 I! \$ z" U c
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;! j! X" \+ r1 r3 p: w3 c2 q) @& ?/ ~0 N
4 N& r# ~6 T5 Y- F K8 j memset(tmp, 0, sizeof(tmp));" u3 L2 r2 d, i5 H) q
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
( _1 ?+ \( k: ^ sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
( X0 ]' G B) U, y& O3 n* T% f server_msg_send(server, APP_CMD_LOG, tmp);& f% Z! a) G' J8 f0 B7 U; C& {8 A
h; s- H; D3 x' H" {) N
upp_error_count = 0;
. W* c) O: Q. Z) ]) H- O) a" N& [ upp_dmaq_int_cut = 0;3 Y3 ]" k7 H* X8 a" K( F7 _
// fill in data " C$ Z& e4 \! I! ^0 @; I( }$ {
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 0 T1 ~* G6 R k! Y* x* p! q/ J
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");* A; E2 H! _! V$ v6 Y0 k
' f0 ]1 o. a ]" v% \7 L7 Y
// wait send success* P; H! H' }! f
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
9 G/ | m2 c7 z) l
/ P+ I, ~* v% n( N& Z. k1 L // make data node in free list , e: _! V4 @% V4 s$ @0 m
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
6 W5 y* T( A% @ server_msg_send(server, APP_CMD_LOG, "upp send: success");. U- x" B. j- q( ]
}
( T1 |3 _1 F( t6 ~' C' i" b3 z return true;3 W% F% T g/ r
}2 Z" q% o6 p: o, o
' D* a+ b3 ^: I& H
6 T. i0 R1 j% E1 E y
9 l! t6 }) c2 H+ y
5 E+ w j: q: h' e: N* s4 F! G: z4 p, n0 B$ J
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|