|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ' m6 |/ F3 W! [1 x) f( A
' T. h& U- ^8 B7 y& d# U问题描述:
1 Y. R$ n* j3 {在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:! i! e2 p6 W" E) O. l w0 V
: e& P" p. m3 m: t图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。: L! |8 s) |+ m4 D6 E: V V9 m
$ q- @# w: L: ]3 ^! _ Y& L测试结果如下:
5 J, O9 e6 m( d2 o138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
! V; O: c. l: b: A* J/ ^+ Y9 d9 N8 \9 N' L3 O* ^& r* W6 X
: V- s8 w. y% l1 i8 ]备注:. a8 T! L5 ~1 q7 b, `$ o! |0 z3 H9 P7 Q
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
! Y* W, u8 j }( p* p2、相关代码如下:/ ~* E; z% V* u6 H) ^7 J
//UPP DMA缓冲大小512字节
5 X0 F2 B$ ]: T8 t, q1 Q#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍% N2 p w1 K9 F7 R5 {( v. S
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
# O, E3 ]1 G+ K* L: d0 ^#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)7 ?5 s8 C% i) p7 n' I! A+ f2 g
' ]. X. }3 v7 u2 R
, B8 u( f0 p4 c+ a4 X8 [# r7 q//upp接收、发送buffer
- x- M7 V! L$ k) {& A$ \#pragma DATA_ALIGN(upp_buffer_a, 8)
$ o ], X+ ?! \* I9 |" W#pragma DATA_ALIGN(upp_buffer_b, 8)" K# Q S/ A4 i: K. [: {
+ c( x, G8 X/ `) r k r1 w, C6 i
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];. E- K z: P7 u. t" M" t1 }' Z
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];& n! F4 ~6 F+ ?! s$ s& P
1 T+ s! u( Z7 t$ E
% g/ K* b+ b& u8 f1 A
static bool server_upp_data_recv(Server *server) 5 S& A! t `! A) ^* W
{3 A2 b2 R( ^5 O9 g( j" l; \
if(server->upp_channel_a_recv == false) {9 v0 S' b2 Y- L @
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
7 p U& Q9 |& G if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
v2 [; Z. c7 d: w5 e1 H server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
- _+ C. m8 e; i- _) p. L' l& { W6 w* @; W+ f6 P! ?' p
P0 z' G+ }) c h& } memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);2 a5 v; J4 K: M5 ^4 e; K4 ?# B
% p3 y8 v: v: A8 M" T( Y server->upp_channel_a_recv = true;//
: d h. N9 Q. N6 L3 s( P2 r, ` server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
5 Q' [2 z, L0 C6 Z/ F: h server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;* Y& E5 G& V8 }) \# M
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
" W( a8 S" z- S) P5 }. k; t server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
: e/ a3 |6 s( k; e, h2 ]6 p
2 x# F. ~$ F$ c: z1 X5 `' x: g2 Y upp_error_count = 0;+ A$ D- B! N6 ~# g! j
upp_dmai_int_cut = 0;& O$ r0 Z. A" y$ W1 g5 C
6 H7 M5 ?) x2 j8 L- o
// fill in data
/ J9 f- {2 ~8 c6 `* q; j. x ~ uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
2 ^9 [' D6 m! q% |" _ server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");$ q9 ^1 C( f7 b3 |( R
}
1 v7 k8 h. ] r5 Q% J }
- T2 d; A4 A- D$ `. z! ]$ z0 U else{
; n4 U" j0 [& }! p; W8 { if (upp_dmai_int_cut > 0){3 e z, E2 k9 k; m' d( q; I
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);. V% E- `" I1 t0 E0 a5 K9 k% S
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);9 }4 E* Y1 _$ ]# P& X3 j
. E& n" M0 U& z$ s. Q+ G7 w) R: y5 F% ?4 p* {9 C6 K6 z2 [
//copy data to upp_recv_list_busy
) f" k' A: m2 n3 z1 b+ {5 W memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);. S0 J# }" v! ^% k* t, ^
& G2 i; D& a" L( `! p% s' N //
7 G9 G- R* X& f A/ R3 q; O) [' z ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);; x) z6 \6 W- L2 K" b; F1 m* L) @
; o! E/ n1 g% D& O, Z: d //
. j5 F. y/ A. J5 b- y server->upp_channel_a_recv = false;// ]! |. k2 N. b# K- a% [. a6 W
$ Y# i' r# P' \) a server_msg_send(server, APP_CMD_LOG, "upp recv: success");
/ r0 y/ o: c/ u5 i; m* h }
" i9 d% T4 j- P: U }3 V3 r) j& R; Y$ K
8 Y: `; w) O7 m- U$ ]; O: C
) R9 ~" a0 O. @8 k2 n return true;
* Z, d4 x4 s0 x7 b# x {+ S}
& w: Y* R% I. q# d3 D& b! i
; h) b( n* Z- A' K# Kstatic bool server_upp_data_send(Server *server)
; G5 j* B8 G& f5 C: |8 R) I- S{1 R- E. }- d0 [* F. @
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
, X1 q3 e+ g# @. J DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
8 o, m. o1 T% K: v& | unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);* A+ ?0 X+ U& w8 @/ l: u4 ^" H
char tmp[128] ={0};9 A6 Y! C* y! V/ q1 u7 K! A' n
3 a6 }9 N# C9 m0 y! e server_msg_send(server, APP_CMD_LOG, "upp send: start");
7 v9 J# \4 E( F* q% s! l' J, F print_log(server, data, 64);
( B$ c/ Z1 C0 o5 x7 D8 z- B
+ F* ], Q. j2 d6 u; c //
9 S1 j7 K2 Q, X& U% x5 V; Z memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);! F" c' S6 D7 P8 _: y8 m
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
! O* m/ X7 z5 T( B$ V1 q print_log(server, upp_buffer_b, 64);
- R5 P1 G2 s9 L+ t2 c2 T! ~8 s$ k; N# F
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
( j3 X# p3 L. u$ m+ Q server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ! C: q" l% @- U6 a1 D8 X* H3 ]% P( t
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;7 n1 H4 o) V, q L- w
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
, } l! F2 `! K2 Q" q8 `: x f$ L2 o, Q
memset(tmp, 0, sizeof(tmp));6 K8 Y0 v- q, o F
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
, |& N" b; q9 P0 S3 a- ]& ~" P sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);) G6 m0 o& \# @9 E m
server_msg_send(server, APP_CMD_LOG, tmp);
9 E3 o- u# [; n
7 V: r9 K, b4 a4 ~' k7 q, E3 X upp_error_count = 0;
8 W; h9 W5 g" L2 v4 y( M" R: N upp_dmaq_int_cut = 0;# V# X- h3 b, ]2 }$ K& u
// fill in data 0 Z% F2 c6 g0 Y5 ^6 d7 ~8 S
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
( x9 N! a; s7 I' p9 e6 t- r3 Y server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
8 g3 C, e; i1 j8 l3 I. v. R. X( f- N0 W) U9 l
// wait send success/ ^/ n' \: s- h. b0 ?) L! D
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
' z$ U, J$ p- q$ x
# J3 S8 S. b4 p6 [4 H1 D% u // make data node in free list ! c7 `7 d1 G% J' @' m) S
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
% y) Z0 q" [- J r, W5 g server_msg_send(server, APP_CMD_LOG, "upp send: success");
$ e- @, o8 Y- F/ X' T }; a3 w {' U4 b a
return true;6 i, L& O! j2 ^3 z
}8 |" o$ o% e2 X3 N* C: C6 z
4 c8 d. [1 c) F: W
% o! G2 R( h# z8 L& {" \6 ~6 ^
/ S: v3 u8 T( k ?: S5 _- R4 Y9 w. f6 m( _; N5 D3 S0 p: R* Q+ A3 X4 Q: L
w* U, {$ w4 u$ r |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|