|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
( [3 ~: c1 R1 x& t1 s
; S3 T8 ^4 r( Q- L( a2 c问题描述:
0 g+ s" q) Z( p+ p) |8 o9 Y在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下: |- {- c1 ]& R2 I! ?2 @
6 c0 P7 j; {" }# L9 { |图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
3 V: K4 ]1 U2 I/ ~! u& l
/ A3 _2 O) D4 k: v测试结果如下:" m! ^* S* {" m n; c% J
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
* N4 v. \) N& | ^0 _; h3 _- W: M( H* m
' T9 Q# K) J$ ^5 u" ]备注:0 G; ?% q) Y! c( G3 E
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
5 \/ C" j2 s& N8 a( ~2、相关代码如下:
! u* g( I3 o, L1 z) W//UPP DMA缓冲大小512字节) m) Y8 g1 s) u8 d6 `
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
, U8 \0 G6 _* ?0 p8 j#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
. T4 K0 ? C5 t! Q#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT). |8 V3 H6 M8 |+ a- O/ q/ o1 m
0 i6 g- r1 e% {! ]& |# `3 ]' k
/ @9 O3 @8 t1 I Y
//upp接收、发送buffer
6 s$ ]* j( q0 f* W#pragma DATA_ALIGN(upp_buffer_a, 8)
, a1 w5 [/ S: y#pragma DATA_ALIGN(upp_buffer_b, 8)0 ^+ a G7 u6 G4 v8 A' N* V
' }: a4 H5 y E runsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];- B+ V4 A, v, I, L: H- S A, G
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];& I$ S h; `3 Q2 h& S4 v
* K" i8 X+ |$ I4 o& }9 n& K
1 R- O3 c* h0 a2 astatic bool server_upp_data_recv(Server *server) $ ~; ]' f# l; h" ?
{7 j' T9 a: k/ W, W# u
if(server->upp_channel_a_recv == false) {1 R! @( I5 F/ q9 M2 C
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
6 J' ]: Q& y" K; N if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
: p9 Z1 s5 Q7 S6 j. q6 W server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");8 x2 d- v& K' F8 j7 `
; V \* W' U2 ?) F' E6 y- G+ V m- w" s& _# ?- O! t9 F; X! {# X
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);" d% q0 i' k- H# F
2 d6 C! f' A% {7 }1 g0 a server->upp_channel_a_recv = true;//( a( {& y9 f8 z, O# Q
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
2 A: ~: V: x: g% f server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;8 l7 P. k: j5 [4 A# n" Z
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;7 O% m; B6 Y5 o3 O
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//( o: b+ B5 R* ~9 A5 Z
0 }. q* J( ]. x
upp_error_count = 0;
- g' `* F1 _, n3 M+ B upp_dmai_int_cut = 0;
) W8 t H5 a1 o7 h }* _9 F; f
3 L+ i, e" U: `7 \# B' m; v // fill in data
9 {' G( M+ w# \% r uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);+ Z- b( @. S- k- M8 _
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");, W6 |0 I6 e% F1 |
}
! N- _5 j, f2 k* ]( F }2 W8 G7 A1 T5 y1 @- m
else{2 r, d/ i/ d" A
if (upp_dmai_int_cut > 0){' K+ N" g4 A' @0 n
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);, L* O; Y2 n. o6 G0 H
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);1 B d/ e5 B T# R4 u8 ^2 x; s
' D, I" s V; J
# s9 ?# y' J5 V+ ~7 K% N2 l) O //copy data to upp_recv_list_busy, `5 a) b6 I, z2 [6 c
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);% I6 v% f2 F9 q( X' K& R
# m' H$ u7 z4 m* c1 ]7 Q
//$ H, c- M; r0 Z4 x3 H' c" D; x) A) [
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
+ S/ m+ q" X4 s. L1 x2 a8 f( a
$ } J2 B4 W0 O //2 w9 p( |8 t/ o8 C
server->upp_channel_a_recv = false;//; x9 i! q1 A$ e1 e g* l+ M
6 ?% ?3 \; m$ n5 N1 a# ^) u
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
4 n: ^* ]0 K2 F# E* V, [ }
4 \) _/ C @3 ]: H- i ~. Y }
~+ j8 w7 p' i3 n, M
+ S& K* ~, r7 U5 t2 t2 I# x
+ h' f* ?$ z0 D' ^9 d return true;
& ?( C: T; J) y- \" m}
# a; D' ~( P- ?/ n6 t9 [5 w; s, a- @# Y/ Z6 C; T9 R$ N, ]
static bool server_upp_data_send(Server *server)
6 Y; F: c; R) S5 N$ S1 C5 d8 D% g; f{! S5 @ d* r& c3 l
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
( T" S) I- Z ^- i9 p DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
8 A: Y, e1 o' u4 N+ h" Q unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);5 L$ _. o. A6 {2 E
char tmp[128] ={0};
2 _* B& T. i( M. i1 Y2 Q
) a% H$ g6 \; R8 n0 r: | server_msg_send(server, APP_CMD_LOG, "upp send: start");
& [' p/ x. o1 X3 g( q7 a+ f print_log(server, data, 64);
: Y3 B2 j) S: N* C
! ?% L: }0 u) w! n: U# C* B6 N //- l4 m& v4 I; G3 A6 H& b7 K
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
: a7 g; u# ]) X memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
8 m- d' u7 E1 V print_log(server, upp_buffer_b, 64);
) g0 v( M; ]# I
0 C# R y. [# j+ I( v( E server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
! B& j5 C6 ^ Q* L server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
' N* d5 P8 c/ q% R7 {7 b' J server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;4 R3 ]( C; o% r, G) o1 e
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
2 h' p$ I& I6 X2 ?! ?
$ ]7 k7 w5 b* A memset(tmp, 0, sizeof(tmp));* `+ H: |1 C! ~, E5 ~
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
& x0 B5 T9 k, F sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);: G! {- @; n# \- ]9 k" B- f' w
server_msg_send(server, APP_CMD_LOG, tmp);
2 }* }: G+ E1 |$ h5 v# a c- F+ g d
3 X7 K p/ N0 z) K0 \* B% ` upp_error_count = 0;! \" u1 b4 @& a) f
upp_dmaq_int_cut = 0;
: A, T; Z0 O' ^: I( m3 p* L // fill in data
. q. g. M4 }* z0 T* S6 n uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); $ d+ G" E v3 ` W% D; y- N8 f
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
6 f8 Q! ?/ V; ^9 b# x
+ U* r* X/ z6 ?' O7 P // wait send success$ n# N* m; d+ [ z |
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
' b# e# g$ e% k7 i, f# Z+ ^& P' B
, d& x1 w5 B6 y // make data node in free list 4 j: h Z1 J: y" D: X9 T7 C. X
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);* X' |) A5 [) o' `$ g' E& r
server_msg_send(server, APP_CMD_LOG, "upp send: success");1 M! O" `* v C: @
}
3 H' j/ b* k _5 H" R- [+ ~ return true;
) d" }! z$ r) x2 o# [% @! o}1 _' ]: a/ [5 ^1 `# O, e7 _
& m& Y% p( P6 v& J
' G- a3 ?% t( \ x1 q% d
& J0 K4 h1 u+ e4 G u D$ ?# U# O
/ Z H0 T7 Y/ b$ D6 {
4 R( o( s4 w3 I6 M* c6 N
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|