|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 - ?2 m& {) U2 R! V; Q* I
& N* I! \5 K, n3 x+ V0 g' \+ K
问题描述:
# E, L0 ]) i( S A' Y: r L, T) \在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:; O: M0 b. U$ G. E+ K
8 o% P* _2 c# U# T; e! Y
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。: k& X9 l) z3 Q h
, v; R* o' N! L I) q
测试结果如下:& V$ J) y0 _/ `0 Z
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
: ~' x/ a* Q2 B- V6 c
/ ?+ X% v; z/ l$ e% r
6 r/ J+ t$ R) h. W8 ?备注:
" e( f* m) u8 `9 q: ?$ w1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?3 [- o5 C# I2 a5 K
2、相关代码如下:
0 j1 b/ a: a" u5 ]5 B$ [//UPP DMA缓冲大小512字节2 {9 p! @( g7 t/ k+ o( m3 w
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
% d/ |% b" Y G4 }: r' Q' D#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
( \/ |6 q( J. l5 I#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)5 \$ Z d4 H0 m4 I$ r
6 P9 L" G; J) Q' g Y; |) M2 f+ S
//upp接收、发送buffer
6 Q8 K( G" e: | a; y2 j2 L#pragma DATA_ALIGN(upp_buffer_a, 8)9 r+ t6 a) I. K$ }
#pragma DATA_ALIGN(upp_buffer_b, 8)
. \+ ~/ L7 O# K' n
: d0 a. n. |) T# s1 }( eunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];7 O; C! ~; a) p6 I1 ^& c7 W% o5 F
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];% ?6 b+ U4 r; _
, T# n+ A! A: y! ]
$ B7 [1 M# J6 p: y/ ~static bool server_upp_data_recv(Server *server)
/ j6 B0 _: M+ A: t8 E{- F1 {" i, _" o; q
if(server->upp_channel_a_recv == false) {- o9 c' k8 h2 I' `/ m" ~
server_msg_send(server, APP_CMD_LOG, "upp recv: start");- p+ o0 ?) q- |. _; x d V
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
6 ~# u3 S% b& r- c5 ` server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
8 j6 t3 _9 }. ]9 X4 }
* L' D8 e1 G6 k
. a" x! z& S1 b; i' Q" a- X' s memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);1 F" {% X+ e6 M! {4 ~
# o/ K8 B! b) R6 c' c" J server->upp_channel_a_recv = true;//% L% S# M( n) Y+ Z
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);! Z ?. {! B8 ^+ l# [, N% j
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;. B3 R; M, `8 @
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;$ e% C) Y) o! K8 v
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
( b/ K# l5 H5 \8 W9 x5 F$ q" ]) ^( a: E. t5 D6 S: H
upp_error_count = 0; B# {! q$ A7 ]- W. J
upp_dmai_int_cut = 0;5 ~; z4 v* G1 j, m& m+ h
# ]" Q2 [' }9 w% a
// fill in data
( O! h3 k$ |8 C& T5 Q" B uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);# T3 r) S# }$ \, J% r8 m$ }# l
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");5 e' w5 Q- C' _" k# s
}
5 }4 D |+ A7 z. X }0 n2 x: {& h! C% w
else{" Y2 G! c! K% s- h& N
if (upp_dmai_int_cut > 0){
( }" S5 }4 {* N. n DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);8 v; J3 [0 F2 }8 s" {/ p1 K: E
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);) ~6 ?9 p: m: x% e' g5 P0 `, @
3 j" G/ J( _) x$ d
3 i" [" g# b: @* N& y1 ` z! n7 ? //copy data to upp_recv_list_busy
: W% K7 c! `9 {! q memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
# M# i1 S+ {6 J9 @$ O+ H! U# z% V' \, b3 e' W9 ]
//3 w) {( ]% H: d
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
% l G/ t% c, h! p: P7 z2 K6 y7 ]% S! `0 m& R
//
+ M ^5 u2 K" x& w8 T' O; b server->upp_channel_a_recv = false;//- f5 h! h' D- y9 N/ t! }3 b8 ]3 \
4 w" `. Q7 y$ w
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
" e* ]4 E& ?9 H }2 ]' y% j' f! _% k
}0 M. J9 E+ ?2 q# m
& |6 }. O3 W% Q
) E% U- @: s. p
return true;. q' {9 h! U3 m5 z$ m2 f% g
}8 o t1 j( h; Y" u G& F
- F: @' L9 F- S" r6 A8 wstatic bool server_upp_data_send(Server *server)
- `+ @0 u4 L \$ }) c; `2 N{& y" R' Y' A; C0 Q' D
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
- b4 r$ D8 M: H: J, k$ u DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
# v# J/ V* }4 P; Z0 w# f; d( E8 j unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
) {3 I/ S' `: Q& z! c, R: s char tmp[128] ={0};
% g+ w' e: Q. o) N5 @" P: ?
$ b3 k8 W- P. z* l& T( w8 ^ server_msg_send(server, APP_CMD_LOG, "upp send: start");8 ^* Z5 F/ F |) w8 A: J; t: U: }
print_log(server, data, 64);* l+ k1 h& X7 e( B5 [
7 }# P8 l' S; w" Z. i# a. Y
//
* i# h# {2 ?& c W. c/ x memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);2 v: e1 P0 p) [1 W( h9 T5 p
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
/ B) _4 k6 _* [ print_log(server, upp_buffer_b, 64);- D) j3 T) a" I) L$ R2 W$ Y4 f- q$ ?
( y r W+ A+ i. @4 I2 v
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);3 F5 A% J: U9 }% E# w; ?
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 8 J; ?. ~, j. [1 L' a
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;) f6 y- D9 r* J* Z# P& E" l
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;0 r+ o! g2 v5 _3 h! n, J# U# A0 v
2 F( K6 u' b: C% H* t8 c8 L; [6 @6 R memset(tmp, 0, sizeof(tmp));
& q( v o$ j- m* Z/ l) j# L sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
1 K% L" t$ p2 {: I- ^! A9 B sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);, Z( `+ ]/ T5 J: Z
server_msg_send(server, APP_CMD_LOG, tmp);
- d- q( f2 v; [/ p2 X
3 T1 _8 n. Z9 i1 X+ }( \ upp_error_count = 0;
6 @! u" v5 ]5 Q) [ upp_dmaq_int_cut = 0;
2 q8 X. o! u: x; b5 Z* u$ M: L! ? // fill in data
& q$ O9 L# E8 l1 a uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
; ^8 i6 y8 H9 u8 J3 t server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
2 g" ~" o. ^; D0 b3 |
( |$ ]. ~$ s# R* `9 a2 e // wait send success, \2 h( q1 a1 K8 E, z
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); J t. m4 \7 L. }5 k
' ~0 F2 ~. \# I) F: H3 ~8 O
// make data node in free list
7 W2 ~' F4 @# \( C7 R8 ~8 b ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
, Y) d/ P) G( B# b$ r9 m server_msg_send(server, APP_CMD_LOG, "upp send: success");! G E1 D$ H+ X) R. P5 ]( e
}
1 P: l/ H0 A* \5 D1 d S g return true;
3 d( R" _- H/ j, i}
% P" |! u8 p' O" N4 |# |- W5 @- v- [# A
6 u4 {5 a7 r- b7 _5 s. J
+ t5 I t$ T! l/ p, }! p* u
. H C$ b& o8 o. ~0 O1 ~
5 l: e/ ]: P! E" h2 @: I- f: e4 c3 \ |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|