|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
- k$ Z7 s ~: I% @( M
2 L6 X m1 n' n$ V" i6 _$ l7 H+ C问题描述:/ \4 O7 z9 p/ y( `$ s9 Q9 d
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
! ]1 m# k# U# } F5 x, j9 [7 }1 f W1 P8 K9 m+ J
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
# r0 K. ~6 ~3 S+ W- |8 }( |
. Y. Q, b% k/ ]0 |: D/ M测试结果如下:
3 @! r0 Y* T' C" V4 ]138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
. ^, a- t1 |) z U& Y9 @* V4 Y' D% l$ K0 O6 l8 s6 R
& l3 o) C6 W- R备注:
i" h ~% [/ l1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?' c4 `, m$ z, q- x! T, k( b
2、相关代码如下:
9 @8 [ W7 S+ b# s& a//UPP DMA缓冲大小512字节/ W/ t J9 I& Y; D Z% T9 p G, ^& u
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍+ B7 N$ |7 v* [9 O" \! V0 u
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
1 A% {$ F! C% ~, W- ~8 b4 v2 D#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)0 U# w& N& B8 a; q. R2 q0 s8 T$ e" ~
; Q5 B1 s k; J4 R' Z
0 Y& D" Y9 w# S9 c8 n5 {//upp接收、发送buffer& f& E5 Q% {- ^8 R7 K4 _+ D5 P3 _, w
#pragma DATA_ALIGN(upp_buffer_a, 8)+ }5 b0 {# m5 c/ p$ Q
#pragma DATA_ALIGN(upp_buffer_b, 8)8 ^. K7 }" w0 C$ \3 ]% g' Z
: w- }. }/ q/ b7 l
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];* K* a# b2 H6 w0 J
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
$ s1 a7 D* j# N( w# | C2 s; ]# Z! Q$ D& |9 r! {: k, v6 @# G7 d) d3 v' J
+ E- e) S2 R/ L, I$ w
static bool server_upp_data_recv(Server *server) " X. s0 Z7 n5 Y$ p: \0 f9 U
{
9 k% E. W! y2 F3 x( l9 t; d if(server->upp_channel_a_recv == false) {
" r, A0 ]' k3 l server_msg_send(server, APP_CMD_LOG, "upp recv: start");8 b( @' c. ]) T
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {7 L& _! K* Y0 ?9 o- P
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
6 z1 `4 P8 f) O, X2 B. C' q3 ~9 m4 T8 i+ j9 C: W
+ a" \" n6 Q, W; `4 `% w memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
5 ~5 @6 Y; h# u0 ~4 x
/ m# R d; B- q8 k5 T# I$ a M/ m server->upp_channel_a_recv = true;//( N& u# N$ w& c% T- {
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);$ T+ |" i1 ^ y- L' Z
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
2 {6 c: Q7 p6 W server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;$ R" K) k0 n1 [
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
7 _# I/ e. a/ [$ n) T% q. D7 S- U7 n; ?" x2 }
upp_error_count = 0;$ G8 b6 `8 Q" A
upp_dmai_int_cut = 0;2 B& B, E$ K2 j0 o& w8 s; `
1 S, w" S+ n& \ // fill in data - d" h( K, N8 G, ^$ L( l
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);5 \& @+ k2 k; m/ I
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
# d; b4 J6 e; s- ?/ z7 W- \ }0 ?% V2 {2 X" B, s
}
3 ? ?$ W/ d. ~# X" n _ else{
/ K8 V# k& w3 b3 v# V8 E& r if (upp_dmai_int_cut > 0){
3 w8 Y+ ^ t" U% W9 x7 o+ k DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
! W$ D( s& {# Z8 K Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer); L7 V0 o- E( Z- F) F0 K6 o
8 ? J2 y, D% A# S
) \+ r; N5 [; D
//copy data to upp_recv_list_busy
+ f4 J- x! s- _ memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);+ i p0 c. X0 `
7 Q" A- V( B- b7 K/ k/ G //" s# ?& S4 x+ a
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
; w1 }% b7 W E* X0 W
2 ?% l3 p) t0 ~/ B4 W0 v% ^ //
( G$ V7 t- V) S j2 C server->upp_channel_a_recv = false;//
3 J$ d" Q8 |' ~! Q- N6 O- {) Z( |% o9 d. V% [2 l+ k# D
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
# C ^9 T) Q3 B& c }
3 X+ @& g- e t) V2 F }+ m9 s" _* L" |4 |
, p5 G5 v9 D6 Y' P: h9 W5 j' h
! i0 \) B0 a+ D% U; U
return true;
6 c) g7 d: C6 {, a}8 t" h" S3 g# a/ o* f W0 a/ @. g
( r3 }. X! |) V4 _+ l3 u9 ?$ E& f
static bool server_upp_data_send(Server *server)/ H5 |9 g# [8 M2 I0 }! R- ~
{; a/ I4 k& J, {) x2 j
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
5 n% Q/ q( ]$ j/ s/ I DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
4 {7 l0 a9 s( Y3 v. e1 L: N c1 a unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);2 `, C0 G2 Y' J" U1 Y J5 q
char tmp[128] ={0};$ f5 e) a5 t; F3 k3 H
# y. e" K' F) @ R+ v. m x1 |) S server_msg_send(server, APP_CMD_LOG, "upp send: start");" T+ q4 K0 S- f1 p' ?
print_log(server, data, 64);& P( A) F; L d. q4 t
9 |" d7 d& Q4 L9 ] //
9 K# p. U) z/ u+ ]8 n6 i. ^ memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);: C- q2 b9 c6 }. W# Z$ _9 z; N) E- k
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
: N7 F. p- M! ^0 @$ O1 ^* o+ a print_log(server, upp_buffer_b, 64);
1 \$ y+ F4 B/ Y' z1 ]1 x7 ?
4 V; u/ \& {1 y! b server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);: d2 D- i" ]1 |/ D- c
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
2 Y8 ]0 j' X* Z8 V server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;: X( r3 R" K7 p' Q9 |
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;* R( j. V8 Q7 M7 z# L
1 P7 Y5 i; O. D @8 Y- t7 y ~# L$ p memset(tmp, 0, sizeof(tmp));
- ^+ ^1 w, O5 v* n$ L- d sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
9 e( J8 h$ G5 u) E sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);6 \* h: g: c9 a
server_msg_send(server, APP_CMD_LOG, tmp);
( D0 W" t5 j% B- Q# m
4 B7 ^0 A' G& |, y upp_error_count = 0;" X9 Z s* q) l1 Q* z8 i
upp_dmaq_int_cut = 0;0 k2 E& |' ]8 g
// fill in data 2 N2 W% g7 [3 q
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); / ^; L% v# |+ C5 Y
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");$ W' I" U$ H* m! ?0 r
3 f( X' d1 F2 G C // wait send success6 c6 V9 J2 l7 f! K; Z. W% ?
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
/ i& G2 u; T; q1 Y W
1 K8 X: f& r6 R( ?. R; @& ` // make data node in free list 9 G+ J c0 R; D$ ~, M& e6 d* H
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);. e, V) s* W2 B% g- n
server_msg_send(server, APP_CMD_LOG, "upp send: success");
, R* ]0 x3 l% C }- N( c% G' B+ D1 |% m; e; V4 q
return true;9 e9 d# c1 q4 ~3 |3 N* Z
}& Z0 l+ F/ u& V) h- {1 [! N' H/ N/ L
$ U$ G) J6 W1 H( o, b* l8 W# u1 U4 w4 t0 Q8 c
3 Z0 Y7 I, A: @
$ _, s, v6 {4 k+ T% s2 C
3 C6 a* e3 U& Z3 e& v |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|