|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
4 X3 b7 W: P" q9 ^$ z0 O: p5 ?
( W3 ^3 p1 ^ A/ r7 j问题描述:: Y( O1 x1 y3 B# C
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:2 U1 g- C( g: n. R1 N2 I( L5 l& j
7 D/ ~2 A7 E* f- s1 M, K; C) Q图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
5 x3 \& h7 E; ?" F$ p0 `" d; D' {! u* z: H
测试结果如下: c; g# L$ d! y& j& s B7 I0 H
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?- M, m# F2 ^: j
3 R3 T- @0 b3 R3 @
) v' T: F2 s: n t+ I5 v备注:
D8 \1 u, W, E! J5 J3 J$ f1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?7 H3 g3 { [8 K+ M6 Q3 m5 G. `- B. z
2、相关代码如下:
. o7 {+ {6 \8 q% j& c( U& h; f//UPP DMA缓冲大小512字节
& a: r" S3 A/ r' j$ N. j$ l6 k#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍( J/ }+ [: \ D' H
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
" A; X/ d$ E) n, e+ O5 w#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)8 R5 u4 h' ^! `7 v
5 U6 m) Z9 z$ J. q8 F* r- `' H4 v% L+ F* S! y1 y
//upp接收、发送buffer
# U6 ~( J" ^! W9 P#pragma DATA_ALIGN(upp_buffer_a, 8). m' f+ o0 S1 v) _ z7 X; g
#pragma DATA_ALIGN(upp_buffer_b, 8): @$ v: _) x- d; F5 M
6 r8 B% q4 p2 j& k
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
4 l$ U8 B% Q; f; junsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];8 R2 }, S$ }9 k3 U7 V
9 `4 x4 V6 E6 I, R( U1 e/ K6 x( y. s
static bool server_upp_data_recv(Server *server)
# w5 g+ l% r) |% p/ Y$ A, n4 \* ^{6 o s+ \" l* b1 t
if(server->upp_channel_a_recv == false) {% t: I3 X0 `) K% G
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
# O; g4 M8 E, ` if(ListMP_empty(server->upp_recv_list_free) == FALSE) {2 Z5 O. ]9 X2 |+ w3 L+ I# E3 }% _
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
4 m: R0 l2 M2 T% s
) X! {) I" Z: t
. p1 U7 O+ v E7 @ memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);/ p& F# R7 [+ U) g! M q
' F% Z5 w; @; Q) \ server->upp_channel_a_recv = true;//+ N/ m3 x s% _' H- J
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);' p! D5 o3 [8 V, U4 n" s
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;. e V0 U( I/ [" c* ^
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
8 k5 P+ q7 o( Z# X0 u3 @ server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
$ i7 u. m& P, h+ S- x( F3 l2 Y8 V) d" b
C" c8 r* _: S& S" t upp_error_count = 0;* w$ I( [) `! Y; R% Z
upp_dmai_int_cut = 0;
$ u0 s) [" W* Q& t1 a5 I! O
" w1 z4 u7 b) O% n$ u // fill in data
7 k8 i8 S' ~. v/ ^; I* S4 v6 {9 T uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);5 H. _% y+ Z4 G3 |9 n& {7 V8 W6 h! b! Z
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");7 L: q& x A7 k8 u+ h0 t
}1 O( Q1 d2 A+ }1 I ~0 Z
}; Z" _: t, b, |
else{
+ }. r: S* c: Q, S if (upp_dmai_int_cut > 0){
5 T" z# K! P6 Y9 { DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);$ E* W2 w& X i7 L
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
* _" Z9 _0 L0 U2 u6 i( {. N
( ~3 D1 N9 U) x* m
5 X* j! \7 y0 b //copy data to upp_recv_list_busy( O8 e; a: _( E; e0 X3 I, \
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
, T/ n) U8 w$ z% D- p& j$ [" M
4 C5 V2 f. \" R& P* }7 @% A //
' \; m8 R7 _) s) o1 o% ? ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
% B4 Z5 a" G8 O
% L ]0 ~( _3 g# V* E //
, J" [2 U! n: Q* l8 i server->upp_channel_a_recv = false;//
/ D; H0 i9 E4 j# k7 w! ]& B8 `* r5 z+ g! M! Q* x
server_msg_send(server, APP_CMD_LOG, "upp recv: success");% n# B7 G s* G
}
2 l1 u5 k# V, k. ~, k# O' K$ Q }) n% f. u( P# i/ A
3 p; x7 L( q" ?; R, c& D
* A2 o3 }4 l3 j. F" {% X# R
return true;" j- B7 G8 Y) \: c/ b) |
}8 F* e8 O0 r3 \: ^. F* R
, r3 o k9 u3 n2 P
static bool server_upp_data_send(Server *server)
}$ y& F# Z- l2 ?, u{
- ?( b: x' c% o/ f1 ? if(ListMP_empty(server->upp_send_list_busy) == FALSE){! Y2 u5 K& k4 n: r
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
/ W3 v2 s1 Z* G5 ?) `/ [; i unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer); i4 u8 b: w; U2 D
char tmp[128] ={0};$ w2 _/ d4 p4 x
# ?8 C* I. M N. V8 T% Y server_msg_send(server, APP_CMD_LOG, "upp send: start");
- A. L, F2 \' J4 ] print_log(server, data, 64);
! m) U$ p/ ], {* b7 w9 k
: h Y. o+ u8 @) y //
1 v/ I s. y3 I3 ? memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);* [6 p1 c: x8 J- d4 ?
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);; S9 Q5 L( S- t, h) \" A- t) Q
print_log(server, upp_buffer_b, 64);
! e2 p3 z2 e8 N1 _- X) U+ W
z1 w9 g8 R) O$ `) P( A) j0 e server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);% M# E' W; w0 t U# U. M* ]( Q
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
! [( O) q- W; z6 V0 d7 u' H server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;1 y+ }1 ?! F: V/ ]6 [- I/ t
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;) d( H- S5 `. f; T2 E& P
4 u% P0 r ~( K) M1 ] memset(tmp, 0, sizeof(tmp));' O1 i2 ]( U* x0 E* l7 J
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 6 A6 [ s- _) p {7 g
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
8 B! |4 O4 O e server_msg_send(server, APP_CMD_LOG, tmp);
. @0 M1 D* A8 _! y
/ e3 N" w* Q1 l' G upp_error_count = 0;
" a* A8 i( \" c3 E: c, t: D upp_dmaq_int_cut = 0;
; K2 |; F6 h3 w2 h, Y( l // fill in data 8 J8 e* q% s5 r% h* I6 I) z" @2 J/ N
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
% S ?7 l' S/ G server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");* A" i Z5 J# a' ]/ ?
+ b& `) W$ \- s7 }) f z2 C' l
// wait send success
$ i4 H) P) [5 t while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 6 I9 B8 c' ^, H# G8 p
; J6 h& Z, G- `. X0 K2 I( _ // make data node in free list
& g* C; ]) E! l) x5 `4 R* a) { ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
' D2 @, V" D( ?+ h X) g% U, D server_msg_send(server, APP_CMD_LOG, "upp send: success");7 J( y& z) O+ H" d x! y0 p; r8 d* c
}( y" y9 a7 s% e1 r0 u6 D( R
return true;
3 E% u5 m6 L- U}
; T/ e' `! T) ?, ?# u. Z- B; x! g% r* ~5 d
1 A4 s2 s% |+ _) l
5 ~2 Y% T! o l1 R+ a6 H1 _
& w. J; |$ z+ N' n- i" k
: _' D K# ?8 \4 d |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|