|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
3 U/ U9 p" q3 x
+ y; T0 U2 X, w/ P3 L! h2 `" ]" n问题描述:
1 y: }4 g8 d2 Q9 h在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:( O; h& B' A5 i
! o, W- z2 i! A; O# O- }7 D
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
& Y* G4 d, A7 m7 Q' b7 y1 h5 h; k. p) a( r. e
测试结果如下:
$ m# u! N# N( ^; F8 c138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?6 O( x ?; F& g; g L
$ ?' T& l1 ~9 _/ G1 ^* m
" n) G4 |! h# c7 F
备注:
3 ~3 ]+ W$ r# B2 W, |5 O5 |1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
$ ?! v. c% V# J- ~; _2、相关代码如下:, o0 A" v5 Y) X
//UPP DMA缓冲大小512字节
; _8 o; }. f5 y% i% C, @. b#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
2 t( ]( J! p" F! U6 A2 c" F" P#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
* c) {& \0 o' s9 `7 W#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)% d! R o3 J' W* P
K& L% j( w# u) b1 M. C9 w9 u' g% S7 O0 s3 F9 |' C+ Q v
//upp接收、发送buffer
+ p! t) a; i9 r6 Q5 ~5 L6 ^' c#pragma DATA_ALIGN(upp_buffer_a, 8)
0 I" J8 e: v# _) `2 d#pragma DATA_ALIGN(upp_buffer_b, 8)
: `; P. S0 D D+ |/ p h- v& {" k+ _( i: j/ Q3 d% M; }* P
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];( ?& o2 L" Q7 L( B
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];$ W2 c7 g" w, E5 q K
" l; D4 ]: f. M4 _* X
! n9 Q9 ^% ~. k Z4 Y- wstatic bool server_upp_data_recv(Server *server) 6 V1 o% G |3 T4 F/ {3 c
{( }% o3 l- E" Q1 i3 |
if(server->upp_channel_a_recv == false) {9 c9 q- |1 @ @, s3 w
server_msg_send(server, APP_CMD_LOG, "upp recv: start");, G4 X$ U, G( z# G5 H; a
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {( _& L: j5 E' F% ~* j" i* K
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
1 [. N: m) ?. z0 x7 ~" ], J: g" N4 f: {- x6 X- S: s
3 a6 P9 w8 Z" w( D) `# t: f( `. q memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);9 B1 C2 ^$ g* `9 [1 i, y: j( q2 W
! g) N. H# o% J q! S5 j
server->upp_channel_a_recv = true;//- N- n, G( S1 v+ X- |2 d$ g6 Y
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
4 e& c3 s- Y/ t2 ]3 o server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;6 f4 }2 M4 h: o: _
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
8 V8 K( w0 L9 {4 e/ V% t server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//$ M6 A" Y; }& l) f. T9 B( a3 l
4 @- L4 Q0 u: F* h0 n( a
upp_error_count = 0;
- T4 r4 A0 s9 o0 B# G, v# B upp_dmai_int_cut = 0;, t' t5 t4 Z$ B9 d" `$ f. w+ u
( H' L7 @ F- Y. ^0 q // fill in data 5 L' I! ^/ s1 Q. P" |
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
7 L+ [% X% d4 O4 U server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");, g. K4 {& H3 t/ m0 j
}
6 W* ]& m; _' M: ?6 ^. Y: [9 j }( _# Y* b+ C' g) x
else{
# S' _7 n& A. _; c c% {, k if (upp_dmai_int_cut > 0){
5 T: H/ O' n% i DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
3 E1 S% E! R3 p) m* S Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
* X' g) q# ^ s
4 f1 K- z7 @; I& ?6 e) G
" N6 A+ u4 E: k0 C% p //copy data to upp_recv_list_busy/ D% A( J' H7 n9 S8 \: W. |/ Y
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
" B9 A, c3 I }4 o# c5 Z1 m- C& e6 h2 d
/// i* w% [" x G6 U }' T, \
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);7 r, Y C) U) l3 C: l, S; E1 I
; H Y0 L6 _. z ^$ A9 `( j
//
# e, f3 C5 H) a server->upp_channel_a_recv = false;//
8 E/ |) L3 l) Z. g8 t8 d4 M8 L4 u+ ]1 H& h
server_msg_send(server, APP_CMD_LOG, "upp recv: success");. Q# |. j9 X' g" S. ^ M$ Z9 H& W8 ]# C& _ c
}
! {) Z8 E# A; E7 T+ ?3 p, Q }. @; G ^, d2 A: U
3 m+ w: q0 E3 {% y$ X3 f
k: t8 z0 O) Q2 B- ~ return true;( q$ `; q, H! S6 t0 l
}4 r, k; j! q) p/ o X2 O) j
% }4 ]% d8 v& X; p$ I9 f
static bool server_upp_data_send(Server *server)
4 ]+ C0 B c) k3 D{
( b. E& J( M% G0 Q6 I. y' h if(ListMP_empty(server->upp_send_list_busy) == FALSE){8 b, W1 g3 q6 e0 K; c( k$ {3 p9 l
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);. j1 A6 `, g1 t) Z& _7 c2 c
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
! ~$ A8 L. O1 o( Z$ g char tmp[128] ={0};( R& j$ m+ O- R+ N |/ W& A+ @
1 }0 K5 B& q! s3 r server_msg_send(server, APP_CMD_LOG, "upp send: start");- O$ I7 [) C- i1 Q
print_log(server, data, 64);
& x) L" L: j8 b9 E. v
- W4 B, S- u$ `6 x //
I) E6 @" [6 a. G* c* Q memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
9 H, p# e0 \: i9 N1 f memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
. g" i! s- t! i* g+ k print_log(server, upp_buffer_b, 64);
# P5 o, C0 b0 g1 R* K h
9 i/ n* R2 x6 J* k server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);+ i" U3 p( _: [, W
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
8 J0 m( n1 s# O8 M server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;: z: P _2 X' x1 d) G, X0 X
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;2 S, ^: Q U% _ [( m3 v1 V
7 ~% |7 M( \% h9 f7 \# r
memset(tmp, 0, sizeof(tmp)); h0 T5 q: n, u
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
; F" t' ]7 G* {0 u2 n sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
5 W" H6 F, ~0 c, |9 Z7 o# X% l" H server_msg_send(server, APP_CMD_LOG, tmp);
9 ]% X$ K1 E% A4 | d( y
. l% V* Q: B2 U4 ]1 r upp_error_count = 0;1 W8 V( r% R1 k4 s* d4 M
upp_dmaq_int_cut = 0;
; f5 S. M! ^9 e- \# t' o // fill in data
" h4 l9 O0 K0 x3 S1 M5 y uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
4 D9 [! I' z0 A0 [+ U/ q5 ~ server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");% n# p% j5 B2 b3 v j9 Y6 |
6 r. W. B9 u1 n$ C/ z
// wait send success' u6 m( o* g; M4 r
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
0 V' J+ W }( |( R$ u8 q8 J1 e% i- q
// make data node in free list ' B% R2 V- k2 c% i$ W
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);1 Z2 _$ t1 {# o0 j1 ^" y
server_msg_send(server, APP_CMD_LOG, "upp send: success");
% V+ G( O# i$ |% b9 @; Q }
$ R5 f# z$ L& R4 k/ k' m return true;; B5 h9 M. i% _. U( R- ]" n
}9 V6 t* @" f9 F5 I. I6 J1 ^3 z6 Q: v) z
# h- [0 K8 w: Y3 N% w% `9 f7 _1 }. m- F# \/ W! T; Z8 r
( q6 ~3 `/ |; M
6 A7 U' M$ W! V5 X/ x3 i" H) n2 P- I- k- P/ l1 F0 ?; k: V$ L
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|