|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
3 Y7 ]# `2 s7 h! e. ?1 v6 h
, v) h/ h$ {; d8 |5 c+ d问题描述:8 l G. F: b# y! I6 r
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:0 r' @7 c: F+ o, x% r0 w' q- X
% I) h$ ?8 N0 K |% x" q8 a
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。2 j/ m: T* R9 z3 a
/ K$ B& c( t( f5 g& Z! j. g$ Y测试结果如下:
+ l4 h3 e! H: }1 h/ W: u138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
- D; J; N8 C, z: Y C$ t% G, l. c( o
: {* p. L) f5 i备注:7 r9 P: V% l5 c) {/ R' F7 G
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
. E- m6 C! x4 `. ~2、相关代码如下:+ i% g7 ?4 E& W) j/ r8 T$ f
//UPP DMA缓冲大小512字节1 D, z4 }5 y3 r M: h7 I
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍+ Z w9 u8 o8 \$ E1 I
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT! @3 J4 }! b0 R# }4 y( [! ?5 n4 e
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
, G# r: f I: Y, ~9 B1 Y8 q' l. m! j/ s' |+ _- }
" y$ t& U1 x1 i3 _' }0 R9 Z//upp接收、发送buffer7 f; F7 ]* ~) K
#pragma DATA_ALIGN(upp_buffer_a, 8). J4 K. B# f! E
#pragma DATA_ALIGN(upp_buffer_b, 8)
! S1 ?( S1 ^/ K7 i6 x) R" K( R" R4 i- k
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
) g8 C4 }$ n1 |* B- e3 ounsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];. g0 h1 B9 }2 e2 O* d' p
7 o. m3 L6 U! c# ^) {) V9 @( ~; W% _( s9 ^
static bool server_upp_data_recv(Server *server) 5 V7 A9 l/ [5 Y. Y
{3 L5 N6 s1 N' ~2 b" [) I
if(server->upp_channel_a_recv == false) {/ a# A. G! r0 j& K
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
! a. A* y/ c( ]- I if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
7 i+ V2 t! s- q server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");2 o" D" Q5 ?& h
+ A/ C& q* G7 w) T- [5 |$ x0 u
- ~9 s5 R* g& R9 X& d memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
/ f" E# w! d2 i4 a1 W
2 D4 F/ u7 t8 _3 F1 T: m4 c9 @* g server->upp_channel_a_recv = true;//
! y( [# [" |+ M7 K) M server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
% |5 V) Q5 I: ]) M server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;" _8 L8 [" L7 p* Z
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;$ y% W& C' V2 d: [1 e( R
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//! r- P' x4 y1 W6 m! z- |6 W
- f8 Y0 R; P* {0 c N- ]( `! I
upp_error_count = 0;
5 P$ h4 v. d8 b6 N* y( q upp_dmai_int_cut = 0;# C# H9 q( d+ P: v% z
+ a) P% |6 ]( ~5 | // fill in data
1 R/ A0 r5 a! o! L6 x1 ~ uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);2 |$ M# V6 ? G
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
( K+ `, m& _/ p$ Q) T3 z }
8 H! j: W" q9 r. t, K }
% g. @) I' B1 [4 j else{" m5 ]' N8 D/ b b0 \( v7 e% R; E
if (upp_dmai_int_cut > 0){/ c _" C# p' c/ g) \
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);5 ?3 w5 i5 r: Z" N2 x6 |6 b7 m, V
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);! H' p v% R6 z# d, T; q
1 r/ W, E, q6 D! {7 l* F+ j5 Q3 s+ q2 c: A( p* A0 O
//copy data to upp_recv_list_busy
0 D' O9 u" e( R! b* _+ }0 I memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);/ v8 Q' P" n2 ]4 Y' {' s
8 ? d/ s. G# D# W6 P //# S6 g; T0 f8 [( A
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
% |& v& q* ~* K) h- \+ s% {3 x' N4 E, Q
//
4 E3 x! f6 r: _9 b9 I server->upp_channel_a_recv = false;//
9 K% a5 c- G1 J% o- }' G# X5 a$ H; P& i4 O1 \
server_msg_send(server, APP_CMD_LOG, "upp recv: success");4 g, t9 Z. {- S! \
}
$ h4 k4 L. U3 `# Q3 H }
# o& _7 l# o2 [* X2 I% T" l% H+ r+ x) S6 ]& U3 l; y% [
# w# M/ B- g" \( G; M8 ^/ c
return true;
& s! P- V2 M- @0 f) D}7 V2 O3 g' ?7 F" L# A
* {7 m) w5 c: R3 A
static bool server_upp_data_send(Server *server)
/ g3 l& e+ b% Z$ p) N& Y$ H! K{) |4 A: j* A; ?; G9 o' c
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
) N& N/ c8 ]+ `' q5 a DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
; T) M/ ?' |, ~2 s( `7 s2 h. i unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);* n: D8 C5 _, w6 f
char tmp[128] ={0};
7 [3 \3 p2 M; n1 |4 K* @: C) [* B3 Z. b& A3 t' P9 Q6 J
server_msg_send(server, APP_CMD_LOG, "upp send: start");
8 }% f3 j" m7 o1 L& k: }* D print_log(server, data, 64);
. D0 }4 G! i7 l ? w+ u, p5 H5 ?7 b9 a( f( B) I x1 s9 @
/// R$ ]7 u" K/ |3 l* E B- g
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
+ K6 ~7 k9 J3 R4 ~ memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
+ p* m3 X4 e' I8 |* t print_log(server, upp_buffer_b, 64);
! `( C: o0 w7 g& b( `# S9 [; q, ]6 x3 U) d/ o! e* f
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
" r$ R9 a, L* n' ` server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
( a) r( q9 V1 w server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
! N: J8 p2 V; i: r+ a server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
/ `2 {5 c6 Y+ m$ R/ @0 f+ f1 X+ c3 J2 m: N: u0 @+ I
memset(tmp, 0, sizeof(tmp));( J' k) B. \8 v3 D) m7 w
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", . D* u! J3 r; k: _
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
, g! Z0 U2 o9 N0 F server_msg_send(server, APP_CMD_LOG, tmp);
7 G0 C- l$ {2 v. h: c3 J
, c! X4 r9 c- Y1 X% N6 ` upp_error_count = 0;4 L, {9 ^" f" k2 v
upp_dmaq_int_cut = 0;0 p' p3 r* P" ^6 k' G
// fill in data E g# o7 x, o0 c1 T/ Q% o- s2 |
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
/ k4 i4 }1 j6 u server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");% I* F3 {5 F( ` I8 ?
$ ?3 O- x) G5 o2 q9 i
// wait send success
( n; H3 q& I+ {5 I while (upp_dmaq_int_cut < 1 && upp_error_count == 0); & H, W: h. c! y }! I( n
5 w& o I0 V& a. b9 @7 Y9 ]
// make data node in free list
6 x7 [: h) d- R1 L ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);4 E! d+ h: d& w
server_msg_send(server, APP_CMD_LOG, "upp send: success");, E! b j% L8 q8 V H4 L* S: S
}; F* {+ o" c! j2 o# j
return true;
! n |7 w h: N. X. z0 x; g/ |}
# b; @/ @/ L. K& ~$ h, |. y7 [% s0 [2 T/ |2 f
* E8 S4 ~; X9 {; D/ h
; s+ V- ~3 S) u, q) I
7 }' D S# T1 Y% F5 U8 C5 ~- E2 R! I& S
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|