|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
1 K( F8 s& B' E8 J; f/ n
: ?8 Y' ~+ M% W2 P1 R. \问题描述:
. E7 V/ O! m. w" e+ R+ n在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:3 O6 n8 N0 S! W4 c
H- Z/ \5 @. V; I+ @! F6 F- b6 B5 j7 o
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。# F# |& T& L* s# {* e
) G+ y+ U& d/ O6 w l1 f
测试结果如下:
: A9 k# b$ S+ I7 @6 Y/ P, T3 @138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
+ {% r( u2 r9 Q0 B
# _( P+ \6 t$ s \; H, |' C1 J
+ j$ J. {1 w" n" B D备注:
% @4 U- f; F2 K: i8 d+ `5 `1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?% x$ M, Z7 E' ?
2、相关代码如下:( g$ Z2 U4 g& @4 j& C
//UPP DMA缓冲大小512字节
8 U+ s$ ^8 K; V8 N" [0 y#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
R: r* k9 f- [" ]7 l3 y: J#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
$ l2 y5 {: |( C#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)$ B6 [9 P# s+ _- F
& I# H: J4 D4 ^; z; ]
: k% n/ G# l5 a' g2 S% Z: G9 i//upp接收、发送buffer
; _: y& i$ H: B/ p+ U$ P( @; J#pragma DATA_ALIGN(upp_buffer_a, 8)3 m+ r" P% d! G$ W8 z; q
#pragma DATA_ALIGN(upp_buffer_b, 8). w* @* U3 F/ a/ U2 n; N, A, D/ w$ E8 G
$ s& C* s; r( D3 x
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
R# `% \0 T# Z7 V& V, ounsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];; M+ |5 X: z( c$ X; x
2 @( i& _' L& ]
5 I& a3 W9 {: g5 Tstatic bool server_upp_data_recv(Server *server)
! p2 }8 p1 a, ?# l{
; K/ u6 @/ ?' O0 |2 e" @: m if(server->upp_channel_a_recv == false) {9 F( u- v. e! a0 s) K
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
6 g# P4 f, m9 {" z if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
9 B; T; F4 ]; V5 @; W server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");6 g& F# T5 d4 |2 G# ~
# j0 N. ]8 V- S, J
+ l5 C/ B7 h$ l* G memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
% ]! \; N2 E. Z7 r( g2 F6 {6 E& k: c% t. C
server->upp_channel_a_recv = true;//+ B$ W( u- z7 F, X2 ~& q* ^
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);. Y7 y1 P" }3 R* A. c+ t
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;- R( g" F- B. b1 V
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;) H# j9 [$ @* M/ }8 }5 \
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;// i* U9 x c2 u
E" l! N, O2 X( K$ |) x, |4 L* g upp_error_count = 0;
$ J* y: G; r+ t. r0 n6 Y! ^ upp_dmai_int_cut = 0;( u6 z0 X) C, H/ Y& S1 a
+ L: z. J; p7 N' g
// fill in data , p+ V: `5 a5 H& r; X: N5 t$ b
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);3 v7 T7 m! @$ m; e0 w
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
7 Z( p7 i' u3 l/ J" G }8 u1 z& e0 O! d9 _( ?1 X2 P0 _
}
; h/ j/ O- D B8 l/ g else{
- ^/ |! X$ K( s7 ^ if (upp_dmai_int_cut > 0){
$ d) |4 Z! \2 P# G DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);. n! a8 N2 R9 v; M& L
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
l5 B/ G3 Z6 ]( E- d" H- N$ _. ^
& B- v( E2 w( v
' _! Z% S; {$ z0 _+ \& o7 u0 Z) L9 a$ G //copy data to upp_recv_list_busy
! g9 l' Z% b+ P% E memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
& m1 y1 X; A9 z, d' }% U6 D5 b; ^: O# I8 e6 Q( X6 y, O. a- f) Y/ B
//
0 U5 r0 y( H( z/ g ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
0 X6 P @7 ^2 Z7 E5 z, J! a& R
7 K3 D- L* C# a/ y //+ w8 ?# f. w+ v% L- _( T
server->upp_channel_a_recv = false;//& _# b" t9 Z* \# F0 g: {! W% t2 U% `
& v E k) s; }1 P7 c
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
6 L2 z b( W6 u! ? }
9 Z, C' S3 w5 ]0 P1 q }3 m7 i+ b+ Q) n6 t+ j
5 j- r( O3 \: Y2 s
# U7 B4 c: Y, _/ w8 p return true;2 E6 @- u! r5 I8 s
}# p) A8 x! L; P1 ]7 z' E
1 U7 H0 j2 H- x. x2 \( ]: Gstatic bool server_upp_data_send(Server *server)
2 k9 `5 s" z1 j- J{
- P5 S* V; _! J5 _ if(ListMP_empty(server->upp_send_list_busy) == FALSE){8 v! ~" x( g" u
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
3 ^5 _/ T) Y5 ?9 O a! N unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);; Q* z* i5 ~6 L5 Q- D+ K) F: J
char tmp[128] ={0};
# l# S+ L! v0 i1 T
! G5 C/ K+ _9 Y i% ?2 c6 B server_msg_send(server, APP_CMD_LOG, "upp send: start");
" d' r! [# {8 h) [6 R7 S! A print_log(server, data, 64);
' `6 s% r* ^4 Q% l1 z& Z" R* A+ w: e
//4 P. w) c4 c: T% T
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
/ H8 X9 h' u) R4 d* P2 G% W memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);6 o# q ]" C3 u6 B2 s
print_log(server, upp_buffer_b, 64);
2 W, E" w {3 K2 t+ f r' y
* W. x0 R( r( g9 m/ k: c9 w* h server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);/ I2 k, p8 z2 P) u
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ! w& S7 Y/ `2 D
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
7 D6 ] a; s5 }6 `! n6 M1 b8 b, S server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;7 G+ O( |. k' B- @( ~6 q/ {
) F9 ~% x7 R$ ?- N( N
memset(tmp, 0, sizeof(tmp));
% }3 f8 J# F. T8 \2 P- g sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", - \& J, Q) x+ ^" s, E
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
. w" h2 E# l- ^6 e server_msg_send(server, APP_CMD_LOG, tmp);
# R" c* |" L) }* y
. N0 H/ J% R1 i8 o# k' }0 q) L9 P) Q upp_error_count = 0;
: U* B' E. K ^ upp_dmaq_int_cut = 0;
% s, @3 r, X1 n3 B# ^* M // fill in data 7 p7 K& e; W7 J; V/ M
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 6 R* i+ a0 a) I& |1 V+ T( k
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");* I1 G6 p) i: S" A( B
9 o1 @, B4 I$ G, o
// wait send success
: D c6 A. a7 K4 _ while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
, v$ y+ [3 _9 A$ S
6 h3 q% x$ F" E% C& W0 m/ K // make data node in free list L# N2 T: R( H# f. p3 [
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);0 r6 u# K; T) u6 O
server_msg_send(server, APP_CMD_LOG, "upp send: success");
8 N1 I7 C4 I1 D$ k& R1 \; `# B }# u1 f% R0 }+ [! h8 z% ~) ~
return true;
' M- u/ Y' k' V' \; P+ T0 y}
4 L3 u: P- `$ [% B5 m1 n
- Z) @/ J5 _' N# |, o" j# W2 |6 s1 [) y F# U' o* S8 G
2 `4 _6 f- }, q; k }
o5 e6 j2 K/ n$ s/ F! N* ] _4 I( k+ W4 a5 k n
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|