|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 9 X. V) W, N7 z3 R) [9 |& B
6 v+ y/ [5 | U' @ Q问题描述:) u" L( W2 H w q6 k/ X w
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
& U: B, F& c1 v- }" H
- \6 R7 {' I+ }! v图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。' b! S/ b+ ?1 N! ~9 o9 i% [
$ z6 A$ l/ v8 H) g5 w- L: [! D
测试结果如下:
- L+ V3 V6 y( |; ~! D7 x4 T) T138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?, u( v4 Q; R4 [2 _' p
5 ~$ }0 ^3 E# ]
& U/ B: Y5 e7 ~. x3 e, q0 y备注:
# k) O% q# i5 }, t1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
+ i3 y4 F C0 N# Z5 P2、相关代码如下:
+ _- f; K1 C6 u# l0 C+ B! G3 w//UPP DMA缓冲大小512字节6 B$ p! J# R4 r7 n! W
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
8 a+ j- ~" N9 m2 s% ?* q( N; t* ^#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
$ I) d8 |, @/ n/ D#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
) {* v0 a, G. ^( g
* n% L$ X, x3 I& M
7 ~0 j% y- z& j' q+ d/ r" q. s& Z//upp接收、发送buffer
% i) d+ e5 y4 |#pragma DATA_ALIGN(upp_buffer_a, 8)
! l1 x' I/ m1 M#pragma DATA_ALIGN(upp_buffer_b, 8)
) g; c+ p R( Q7 s9 H' ~: z4 p: _" g# T1 y2 b% A& p
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];1 [! z8 k: h+ [. d0 d
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
" i4 M$ e3 Q9 G' _9 W1 |
) N' C8 W( T( I* k/ j# F1 [3 R
9 D7 {- i" \9 U# K3 H% Z/ Z$ B2 _static bool server_upp_data_recv(Server *server)
* G8 ~! Q. Q% F5 u1 a: N; v# L{
7 G) B# H4 p% v+ y+ i! e if(server->upp_channel_a_recv == false) {
- Q* J- ?- R; i4 }/ F- D. u! V server_msg_send(server, APP_CMD_LOG, "upp recv: start");, \# A8 `# l) J' ?9 G: H. w' }
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {6 H7 v( f- ~( [' t* ^( B: R8 b
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");* k! T% ?! i$ @) i/ ^/ [, _" h
1 m3 c2 f, q3 z
, J. q. ^! ?3 k4 A4 S memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);- D$ Z+ J" e& v, z( h7 S# j8 }
) F7 @* v( k* a: H `; {5 I1 i& c server->upp_channel_a_recv = true;//* O7 D6 i, Z2 K. Y; d$ G0 A
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
7 d* B) a! I( P% J* v/ n! B4 Z server->transposeParA.LineCount = UPP_DMA_LINE_COUNT; m I$ v5 u+ U6 S& W n! @
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
% K. J& b( Q, _/ d# U4 C; @ server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
. ]6 {3 C- A4 D+ t+ ^! p, I. [: @3 W9 C r5 t0 F; x
upp_error_count = 0;
& `2 M$ E m7 F. v, |/ Q. q upp_dmai_int_cut = 0;
7 Y/ R$ q. W1 _ f: K! q0 _# J7 U, h: P! [
// fill in data
* H# ~3 t4 q6 O# G7 y: r$ z uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);0 _3 \& q$ }0 f5 g" ^9 s6 |# E8 [
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");- V+ v0 H/ C9 l0 \& A, D) g4 B
}0 U O1 E0 S. L4 g- I" h
}
$ b7 @0 m/ R- J. Q' i: G else{
8 ^6 E6 n( i: c" a& C if (upp_dmai_int_cut > 0){6 S C! W: k! r' B5 D
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);+ G2 g U0 z8 w; ]8 [0 p: J/ M
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
: b: G5 o3 m: T6 s; Z; k$ N s" D: {( i
! F7 l U- Z- M# u+ M
//copy data to upp_recv_list_busy7 q% l# X8 Q+ @; c9 B7 _
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
; j" K! j9 M1 K) a3 Z+ X, ], H' W/ k/ M
//$ p4 I: o4 Y" C- q1 N. Z
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);8 }/ D2 d. N- v9 W
% w* M2 X1 t( ~0 h7 i* ~9 @3 l( o //
+ W2 a% Q) Q$ {" T* m. I: |. ] server->upp_channel_a_recv = false;//
* F1 n' J h% {: S
+ w# y5 T1 U/ a! Q6 |% t3 m) r server_msg_send(server, APP_CMD_LOG, "upp recv: success");
0 z& T: r, i- R7 o+ s }
: }' X0 Q1 O% a! r( w }6 c( K: F* ]; D
4 m( R/ `# a. L& k1 F1 R
, W7 _, S: g3 o4 c6 b# x+ |2 q return true;: C6 i2 [) L: }
}9 x6 b+ K: B. P* Q1 w2 q
7 y3 Y6 U9 B" q8 Z8 v- ^
static bool server_upp_data_send(Server *server)5 ~$ J$ W& U5 E
{0 b8 U2 E" f. `) m* \$ a
if(ListMP_empty(server->upp_send_list_busy) == FALSE){) h4 F1 o& k) F0 {, p
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);8 F( g% y, q, _# K+ n; E
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);; @1 D+ r3 ~/ l! w. V
char tmp[128] ={0};
* I: P, e7 r" y0 [. K
# t+ y' K( z6 } server_msg_send(server, APP_CMD_LOG, "upp send: start");
" L8 t8 i& f. L. X: p, X print_log(server, data, 64);8 E; z A3 L+ G
4 n7 a1 ~& `& f2 y
//
$ G: c; W0 F W, I$ Z8 D2 G) H0 N: Y memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);& c1 F0 h4 ]# H. Q w
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
/ a/ G: f! P8 j3 z4 f1 P# a$ M print_log(server, upp_buffer_b, 64);6 |" C2 J$ d4 S/ ~2 I
+ o5 H' [' X. c/ M, C3 x. A server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
' D3 v* K8 w# P3 m9 b8 G# H$ r server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 7 O, j, Y: L, q9 m1 v
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;! L; T: U" d2 Z4 T( }
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;# r- D" Y$ d5 X- v2 A, z% d
: c3 }, `. v- ` memset(tmp, 0, sizeof(tmp));
* W* W' J/ n# N9 I. P; L1 p- L* ] sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ) I! s- {1 v5 ?$ ?
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);/ L5 L3 N( m0 q% `' G$ _ z
server_msg_send(server, APP_CMD_LOG, tmp);
0 f" c8 T' ?5 x* `" c( v5 w& u! ^- L# ?. d I5 Z' B$ x7 [
upp_error_count = 0;
$ w' _4 Y* Y. z( |, H" c6 R# n# k upp_dmaq_int_cut = 0;
2 w5 X( m# L( z+ ? // fill in data * S# d" ~9 [0 P
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
3 [' P- L0 F' D server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
. I. P* D3 W) A/ L
! \1 X& l6 ~8 y* x) @ // wait send success. ^9 g; D" o9 \2 s' _
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
; `7 W. J! ?/ s2 R/ I7 H# m( O; s, I$ o/ Z$ ]$ F1 M! Y% h" O( O- g
// make data node in free list 3 l% Y1 V' |5 |" Z1 i, h+ u- m3 a
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
+ a- U* p8 y$ a& b) l% m9 H/ U6 ` server_msg_send(server, APP_CMD_LOG, "upp send: success");
* n, @) T3 k! W. B. C }9 G9 n: q) i) N: K
return true;
: L7 t: i. V3 q+ [2 E}( H$ r5 L" K, r) `
4 C4 C% B& F& P+ }+ z
* O" d7 ]- k! h( K" h" `
; P$ l$ W; g( @2 `0 h4 q( q7 a; H, v- n* b" h
/ d+ j! F k! W9 y/ V; |1 S% Y |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|