|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 / Q$ Q, R' c# l
* w6 O2 T+ b8 F2 D. y问题描述:
# M5 P! ]; |+ e# }+ d, z0 [0 t3 i在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:3 Y* t, s3 C3 a1 Z
9 Y! }/ }% Q# a/ G! u7 }6 }
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。& K1 }4 L$ D6 o* N
' O9 x7 B' v$ h测试结果如下:; H( O$ J" U+ }! Z, y
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?) {2 Y6 D/ x0 j5 c7 L0 N
& G1 v- S* R1 y9 R/ O' ?" p
. P( t9 y9 Y. s( F& R* m. s2 S备注:
# t, i$ V( [6 b' `7 W' _1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?# A: W4 r% O- D
2、相关代码如下:
1 f* Z- `8 y$ \//UPP DMA缓冲大小512字节
& o4 A" S# s- J0 `9 w# a#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍1 X/ l; s2 h* M# O- u
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
6 ?7 U/ a% j+ R# ]7 `5 ~#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT); i2 Q' j* @! b
Y- {) n6 d b8 P$ L; v. g
9 e+ z M D. l- F+ b- M' G
//upp接收、发送buffer1 y* M- C7 ^- b: z. w$ ~% Q
#pragma DATA_ALIGN(upp_buffer_a, 8)
% F: J' V9 j1 Q, g) ~" r( F#pragma DATA_ALIGN(upp_buffer_b, 8)* s; O% m$ e) m+ d
. q/ C' }) p) Gunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
5 @! p. H% i0 X) z w2 munsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];/ u8 _ ^+ p1 b6 R9 r) a2 }9 ~
9 l7 d9 Z3 G. N$ Y: T" e# R
B8 w# r* ^; {$ q( j* }
static bool server_upp_data_recv(Server *server)
3 y' o2 [* B/ }8 l{
: l* j- r1 f1 o& ^7 v* G0 _& B if(server->upp_channel_a_recv == false) {
% f9 d! R2 j" Z B server_msg_send(server, APP_CMD_LOG, "upp recv: start");
' S1 f5 `4 n1 R( G; ` if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
+ J% k" V% g, Q/ N server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");# w6 r r# b# y3 P
5 v# d# C1 J" D/ j* w4 g( k V, d1 C
! q8 m+ h3 ]! O memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);1 O" C% `+ c ^7 S. c
4 r1 o+ n- Z s) ^7 n' s7 u# Q
server->upp_channel_a_recv = true;//5 C8 U( g) A `
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);" {" X. e* Y" K2 C" v7 B2 d% L) z7 v
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;; }2 U! d: ~! i) J( ?+ p/ Z
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;" ]9 u7 L: ]$ Q& Q. i
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
1 {' q! w) V$ v. ~$ J- ~7 x
5 [5 l2 ]( P* g. k& h# N upp_error_count = 0;% `7 [4 u* Z4 P
upp_dmai_int_cut = 0;; N4 g* E/ r2 L8 K' k2 Q6 ]% ]0 x8 i
' ^' T5 F, o2 H( O
// fill in data ( J6 C* B. C: P2 x& q
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
4 i4 U' p2 d. M; K; r8 L" y7 u9 \ server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");1 P! B; A) R; S+ \. ?. v
}
8 w* _: N9 Q$ r1 m3 | }
' t8 H. T7 o9 z- U& r% N$ W) w1 F else{$ o. ?6 y Q8 I
if (upp_dmai_int_cut > 0){
5 _7 t; J ^' U6 P0 M& f DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
6 C' e8 L" `) R$ V$ p Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
- K2 a# o: j# z4 L* e: W! i. Q& R G( }* }/ n; {
/ j0 J; D- t* o' f0 l1 | I //copy data to upp_recv_list_busy
" I) P( j$ R u. a0 F memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);8 D! s5 w8 I7 r* G
5 F& F/ |0 [9 n. \- D/ l
//
$ L1 d6 d& G8 v* q1 o ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);6 D9 l+ e. `1 ~9 W- i% L
0 q6 L- Z4 Z5 ?' Y1 _" l- `* Y3 a //& K) G' X; s4 ~5 |8 v# u( S. g
server->upp_channel_a_recv = false;//
5 L6 }6 ?( K5 [8 i0 p6 G0 ?9 R6 N1 u4 v" K& b& o4 M
server_msg_send(server, APP_CMD_LOG, "upp recv: success");; `, n: y, _) Y* P$ ^/ S
}
/ Z- G1 \ X; H( R+ D }
; ^' Q/ y- n8 ?2 [3 c
$ v! w7 D. E" D5 y' g0 I# ]. j: z3 H: q4 D
return true;+ H* N! o% s7 K, {6 r* G B5 R; o
}
" k; o! E4 d% x! l9 {8 z( G, i* `: u! M" I9 Z
static bool server_upp_data_send(Server *server): n% _! s: x* l2 U- A* v6 I% w
{9 p. C8 `5 S) c$ n& |- a- g0 Y
if(ListMP_empty(server->upp_send_list_busy) == FALSE){+ r$ ~3 d- q4 k
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
* }1 m7 L9 i( H( e; [ unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer); Q! k6 v( L. f& z, S
char tmp[128] ={0};% g% K5 A& U) x' t( _
! k2 p% |) B+ ^+ k1 p9 |6 h
server_msg_send(server, APP_CMD_LOG, "upp send: start");
* o+ L; b4 F+ L2 n) j: ?- i print_log(server, data, 64);
* e5 b! r' ]8 y! M% }; J5 `1 n c$ S- I/ @* o: D, q
//
$ W% o( g+ t( l3 R1 a# |0 k memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
8 t+ ^/ V) \# d8 Y& a6 q L memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
, m9 {# v# }- Z print_log(server, upp_buffer_b, 64);
# s* s7 A' q- D+ Q+ I; U' r; Z! [8 c I. u- W ~/ p& d, o ]" \
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
3 a& b3 I& J6 @4 d6 {/ i% m server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; / K, g5 H# l9 G
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
- @$ \- G$ x7 I% V server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT; x0 A: e. r& W+ x( Z7 Y4 G4 Z
& s+ {, r6 k* |5 \, K* G4 c) ^
memset(tmp, 0, sizeof(tmp));; B& G# W5 t) [! }
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 4 l3 d. \/ f1 x8 j$ s
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);4 {+ D$ x9 e; j
server_msg_send(server, APP_CMD_LOG, tmp);2 U, X8 @% T! r( j
, p% p' _$ l. ~* u/ D
upp_error_count = 0;8 s7 v# L7 |' e# I3 Z
upp_dmaq_int_cut = 0;( x. O$ E9 V, G
// fill in data 5 b" {: c. A# W5 N- q
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); + W8 A2 O, M" _/ v% L
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");, ?/ n& f$ w |' h! C
( [4 S1 I# u; k! ^+ r, q! P, X3 A: X // wait send success
) T: ~2 y0 v% e& J, z) Q) w while (upp_dmaq_int_cut < 1 && upp_error_count == 0); $ l: I8 w F1 ~! F- W8 @
! y/ W" {3 V. g' x( }3 z, [ // make data node in free list ( h0 L' A' a, ]! U4 {
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);5 u6 b/ v: l0 i7 }9 I7 g5 P( _
server_msg_send(server, APP_CMD_LOG, "upp send: success");
. ]8 P) j- j/ z# C$ g+ Z5 U3 p }
; l% ~: K5 g9 | return true;
7 x# s9 B+ {9 V% x}
9 F; h( m V; K
0 }: q5 v6 n: b8 _, a+ i& b. E l# Q/ j1 m
) n# q7 d/ f: z% H& T, C2 n$ A) N( ~ }
3 t, p" H# o- u8 } |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|