|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
/ ^! f- i) A6 l5 u9 M1 \0 u$ _; n( w: w6 ~, D
问题描述:" P( ]" m1 Z* { G0 }& _9 N
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
: z( b3 J6 ~- j1 Y& m4 W& h9 R6 w/ ]) t( K* o6 f
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。! Y% D5 ~$ N( l6 L# w( D7 p
0 q- ?/ o6 q) R! {# D
测试结果如下:7 x+ [$ l0 u1 S# h
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?& f" d( I% u. J( h2 r1 j
t& ?9 ?6 D# V
8 g0 B. Q5 i$ @
备注:. M9 z' q/ y* n9 p- t( T( u2 V3 {( F
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?. H$ g$ S* d' Y" \: C9 \
2、相关代码如下:
* E3 w3 _, ]% n. t3 ]' Z- q//UPP DMA缓冲大小512字节
8 ~- c7 h' U6 w% h9 e" o# n: ]#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍+ g# \* x6 Z" r5 m1 V4 ^; O) P% H
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
5 K6 k. J. a; Z3 R1 ?#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
1 h1 q) a2 k* S7 G) s
6 f3 k# R( q( g& @7 P: `7 p$ u3 [4 n. J6 C+ t, A/ m
//upp接收、发送buffer6 _/ |% W ]7 q/ n$ M
#pragma DATA_ALIGN(upp_buffer_a, 8)
1 T1 N$ r# G5 A- Y#pragma DATA_ALIGN(upp_buffer_b, 8)
3 U- r0 p# P# L d% e
- |/ r6 ^6 o+ j" |: ~+ ^, Vunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
! n. Y; n6 F# m$ P* ]unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];1 K5 J* i( b) n, A
$ c( s5 i; f$ a7 z, C9 z) b; ]4 K* i. y: n
static bool server_upp_data_recv(Server *server)
% ` E! s0 Q' i{
( [2 R/ @) t9 V8 L! ?8 U1 l if(server->upp_channel_a_recv == false) {, L7 f$ r# y) L& L* N
server_msg_send(server, APP_CMD_LOG, "upp recv: start");: s6 C5 A4 R6 G4 h* a" y. ]5 m
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
6 z' P" u. x5 A) P7 V( h$ P0 D server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");- G5 i0 H3 n, e- g
# I$ k7 l# s0 ^9 i
# G; p3 p# `0 q
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);: T9 [0 d! v7 h, j
8 ^" x& m- n% l' R3 z6 d& M9 {8 U; c
server->upp_channel_a_recv = true;/// k" ~) y2 R- K/ G% A+ ]
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);0 s$ I( n* Q6 J; y
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
* @% U5 p( n7 v# h server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;$ B+ P# T$ r$ }$ |( {
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
+ R' X. Y$ L% n/ V3 ]8 l+ m
& U! p2 K7 \! [0 F9 |( c2 T+ b upp_error_count = 0;
! a% [- O2 h" @0 q; b" O! @ upp_dmai_int_cut = 0;
7 L6 k4 Y1 d! t6 x5 F
2 V, s# y8 M' r" d u& k // fill in data % t, O) V8 b, t! m: W
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);* U5 E6 B) N$ q. x& b \
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
" m5 x0 B/ V: a }: ^9 ^' B- L0 p5 l: p1 f
}$ Z. z4 z- c! x% H9 T3 _2 B
else{) B& n3 p( P! ]. q. F4 C
if (upp_dmai_int_cut > 0){
6 K# Y, _6 o9 m- W# R( C+ X! y) l DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
1 u$ ~: i. d; F5 O0 r Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);/ i+ s' i, ?& `: j5 j- L. a5 z
" S( z, l0 U" \2 t& M1 P' _# c
" Q8 |" N1 L7 h8 N //copy data to upp_recv_list_busy
$ z; P2 d& x3 Q memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
9 {# x$ V& X8 t) a! ]: P
4 m5 [+ {: N, \6 E0 |; K //( J$ ] w; ^' {. e" [
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);3 K- |. i9 g, ]% l# \; j1 n" }7 R: ]" b
7 j4 @: a' x' k //7 J$ f7 M) q( O7 ^2 n8 J
server->upp_channel_a_recv = false;//! [& S) f8 T5 G5 E, b2 W% w
+ N; J8 f5 P( p+ K, h
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
; r7 A' ]! W, W }. ?, [! ]! q4 t, ]# g
}
/ \! ?& m# A- `4 b; a0 Q7 G" @+ Q5 G# h3 \5 I/ S" b" N
* f( N! ?; \+ v1 x/ _ return true;4 |* }2 S7 X9 v! I
}6 B7 Y) x3 y0 a7 ?& N. T
2 i% i9 f$ ]: S0 a( mstatic bool server_upp_data_send(Server *server)
* m. r& q1 x; a( O# }. Q2 Z{/ V7 O% j$ z6 {+ A" i) R9 C' Q
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
5 h, L% s- p4 T2 t8 b7 g DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);) C# Y* @; V6 a6 p: d
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);5 R. i$ r% R. J. K* [
char tmp[128] ={0};
3 [) _$ X' z& G
1 O) p% ]1 P7 m$ g. _7 C server_msg_send(server, APP_CMD_LOG, "upp send: start");3 C1 {1 v$ [* F, x4 [; P* D$ E
print_log(server, data, 64);. ?/ f, ^( }8 M
7 l3 }/ i; u# }
//3 D @! }8 z; q1 [
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
1 W2 ?' t. Y4 W: {! h/ w7 s memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);* ?5 J8 q/ A2 o" ?6 b9 K; q! l2 j
print_log(server, upp_buffer_b, 64);
; R5 l; h1 H$ @# V3 e" ~4 n* |" W6 K. `/ N, x& X% m
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
' z( q& |4 H- Q8 V& ]$ B0 y server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
( f5 o( x( t; g server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
& f6 f) |6 F( I/ P* g6 L5 L server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;+ f/ z. n w. n: N6 [6 ]
9 g5 X: n6 P; F% ]/ j5 | memset(tmp, 0, sizeof(tmp));
2 K2 W! z# J0 k; Z sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
4 ]- g% i& Y, c- q4 x sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);+ I ^0 j9 u/ S
server_msg_send(server, APP_CMD_LOG, tmp);* U( s2 x3 `6 H
5 }; y) @3 I) p4 O! N upp_error_count = 0;
& o- a+ V' K# d$ M upp_dmaq_int_cut = 0; w6 M1 A: ]& Z/ ?
// fill in data
$ H, V6 o# C. k; n1 _0 l; O6 W/ G. I4 D* O uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
7 I: [5 y: \- X8 ^/ {. s8 h9 H# c0 J server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
3 w) `! i+ n: }2 B$ ?+ ]" v5 o. E+ O0 w% q3 n) [+ ?
// wait send success: }% S3 Q' N i9 h" K6 k* P" D
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
5 G2 U6 f* b& V* [. S P3 H2 ], O% S! D2 C& P
// make data node in free list 2 ~3 s$ L+ b K$ w: o1 d
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
4 s6 L1 c: N0 f: c T; W6 k Z server_msg_send(server, APP_CMD_LOG, "upp send: success"); I' U3 Y5 Q4 j% h
}
+ ]) y6 O6 J8 E0 }& j6 f return true;
- y% u# E# I; a% o m}
% H1 `, r; F: ~; O3 D) Z: X) s @7 s+ d+ k- Q
: r8 G" ]' h* b& H
9 t5 X$ ?, l" m. N8 o' ]3 w s+ D2 I& F
# ] j2 t. C2 ^3 i9 s- m |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|