|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 & e- u) x8 `4 {1 i9 o
- C8 l" M9 u f% |5 r4 F问题描述:! l ^3 E) A8 o
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
5 Y# ]. L$ b' s3 h1 F$ Z: k6 b$ b' v/ Z3 D/ l
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。# p! Q# H) R$ a% L1 O
' i* R% i% G ~测试结果如下:' D( W1 D3 \9 D8 f$ n
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
2 y6 Q1 B! {$ z* ?" X m/ C. i) H/ ^* [1 h" p; T
" V: d( U o# K- g) E' F备注:8 m" J- V3 K- T
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?" c& c$ f& h, h- `
2、相关代码如下:
& B6 R: U: Q! F1 ^ ?9 M7 s//UPP DMA缓冲大小512字节
1 v; m/ a1 Z* s5 B N, e#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍2 V. O3 c) \- H' A5 Q: i
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
+ N# D) }+ U7 L#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
I/ Z. \: g" k( c6 Q) d2 Z+ U/ P. t7 _4 `; S% }& p
; g ~9 |6 Q4 E3 S! Y2 j
//upp接收、发送buffer
+ U+ w" N( r0 J: D#pragma DATA_ALIGN(upp_buffer_a, 8)
! k: j7 S) ]- T. S! n/ n* q. l#pragma DATA_ALIGN(upp_buffer_b, 8)9 q5 ?& u6 d0 v- p$ @% y
) C1 H8 J' K# i* Vunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
/ [! B6 Z1 I/ z* F" hunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];3 x4 V# U. y0 |% Y6 Z3 Z5 H
* `; D( Y) r4 H* M' W4 f: J8 u
# @ { I+ ]$ ^! ^- A; y; m+ hstatic bool server_upp_data_recv(Server *server)
7 A7 g3 y k) L* ]0 m7 y{4 W* f0 W7 V+ L3 v5 v: v, ^1 Q" \
if(server->upp_channel_a_recv == false) {# w& x1 g: w x( \ F: h+ |
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
7 }$ K( N% K& ]$ r if(ListMP_empty(server->upp_recv_list_free) == FALSE) {# l) ]# f( l7 ?% j
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");7 r( j% c) Q! s! _: p9 e/ [
& G N/ m6 s; V9 l( B" k' _0 v; n1 D9 H
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);$ Y! A% G, {% x' M" F, W
# l/ x r9 F6 e: s! d4 b server->upp_channel_a_recv = true;// {7 o; m: s- `5 c0 W- e
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
$ I2 r! } B" R& B server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
$ O7 @. u/ \9 C server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;6 f8 d$ ^ n( H9 c+ _
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;/// L% m, U" Z& r
0 \3 P: [4 q) x. h8 ^+ R: y2 _ upp_error_count = 0;' O: I: c8 l0 P! Y* I
upp_dmai_int_cut = 0;$ l/ Z2 a2 _9 s" I, g/ G% p1 q" a
0 T: v, N, ], w! ] // fill in data ! e4 L* r+ a# a" G- x+ |4 l
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
% ]4 q' \ b' { server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");, e' p7 D3 p# y. _/ ^( p7 ]( F0 N. }
}
' k) e: N& `, `; ^7 }# I* ` }( F; u9 F" P, _6 ?: m- G: z
else{
& S u2 u& r0 Q8 a if (upp_dmai_int_cut > 0){
7 L) M6 J+ o$ q. U DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);; Z7 t6 Z8 V2 f1 E7 D
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
5 ] N' n# v; v \/ d* E/ _! G9 Y9 H# A3 J% m Q( K
) A- r( |) j1 }, `7 i# ~/ x //copy data to upp_recv_list_busy) E, d* O: h1 r
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE); y# ]; `# O# a! O
2 C; q5 e K5 K9 W9 A8 H- I
//9 ^: f2 |. s2 V6 k) Y6 u
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);7 b2 @9 [ z3 u; ^6 ]& N" w
% x) n _7 ?5 B( y! g7 H: g
//6 Y' f0 K1 T. C& ^6 O" x1 P2 t
server->upp_channel_a_recv = false;//4 \8 k* H3 ~$ b: }
6 l) |" C. f- Z4 X, \+ q server_msg_send(server, APP_CMD_LOG, "upp recv: success");
Q7 y( r4 x& ^0 Q2 Q. P }
. p- k; d6 N/ _' l. V1 O1 |* _$ \ }! E# g; y1 T1 C, R3 Y
5 f' L* f9 V/ X' y- x$ b: D5 m M
% f+ P+ ~! l: x2 M& _ return true;# y) w, g. S" V2 O
}( l8 ^; [. p0 p% E$ ?
7 O$ Y+ Z9 ? T1 p- U! y6 e+ n( b
static bool server_upp_data_send(Server *server)
$ n; \; i/ J, N{7 x. |- k. t5 T$ h5 T* J
if(ListMP_empty(server->upp_send_list_busy) == FALSE){' f& {9 k7 Y* q+ ~ T O
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
# ^4 g h S! @" t2 X+ z unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);) @! g; l: V( m- W
char tmp[128] ={0};3 M. o, G1 w8 j$ u. N8 M9 y
8 N, i( A# a! s/ G' ]* J
server_msg_send(server, APP_CMD_LOG, "upp send: start");
3 k' u; o: o- z' G% Z- X5 i. ]! b print_log(server, data, 64);: G0 S" A2 u5 B6 p; _1 ^$ v+ ]) p
M9 \* _* P( Q ~" K# e0 A //
3 K4 S6 m H( K8 G$ P memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);& X5 k+ q7 N" @" h/ _
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
% P. ]4 C$ V4 y) v$ P print_log(server, upp_buffer_b, 64);
8 b( R1 @, _3 i- ? V& c
4 j# l' j8 d$ c0 f% a | server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);) y: H# O9 p- W
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ' y2 D7 y2 p' I7 g W3 t
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
. z5 p# j P8 ]4 D7 z/ c server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;" `/ e4 @/ K/ }9 U" r0 R
7 K f) Q5 Y. k4 _' f
memset(tmp, 0, sizeof(tmp));
1 J( A6 [* r2 H/ B2 E4 Q sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
7 Y/ C1 V9 @/ L4 X" q sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);; b/ |" A" a2 s. o
server_msg_send(server, APP_CMD_LOG, tmp);
3 x1 ?! x* i9 _, l# l7 K
, N5 e$ }+ {# B' c1 o n8 k upp_error_count = 0;
. s! Q& F0 w3 ` upp_dmaq_int_cut = 0;. m1 o- N0 K* a! x8 e4 _. N8 x
// fill in data / Q2 i3 b# ?% j8 b6 ` W
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 3 a9 t' B; Q9 a
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");' L- @* ~( [# e2 ]; r6 k. E
1 E5 u) }& H1 d5 }* ]
// wait send success4 r2 j0 s) I: j$ q
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
& ^" ]; s$ _) E! c3 l. I1 G$ \) ]% F; n% J3 Q9 n1 ^% j
// make data node in free list
( k. i3 c; F/ T$ v ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);6 [& M% K' V; W
server_msg_send(server, APP_CMD_LOG, "upp send: success");) H. H1 o# z0 Y9 t6 G1 E
}
( M: g1 `; _# d# ^! B5 X6 [) [# { return true;5 e$ X+ E# |2 f! n
}5 p3 I' s. `# N& a1 ~3 n( V
9 Y# x" i* ^+ Q- U! s
, Y c- C1 P; A Y% @
( G* P6 n: }/ _& l4 P% _$ X! b( [: H8 F9 k0 x
+ U, M3 @% a( e% c1 V- ^ q
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|