|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ( B; n+ z1 s0 V1 s7 g
8 W% d( f2 w3 R8 ]4 Z( N问题描述: J- ?% G# P7 ?; L Z
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
& s( _: q- q) N% y8 W
$ n. g' A, I; f9 [' L图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
0 Y, \, |) K* {7 m; P! ]8 w/ Z8 n! [7 k ~$ F
测试结果如下: E4 k% h2 V q9 k: n2 E
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?& T+ p; A x% I. ]% |' q& H
! _6 F3 [9 {# P2 h
`, V% P% T- x; k备注:0 a5 n# e2 e& `. C. X
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起? g; n, q) c( @: ]6 w. N
2、相关代码如下:$ F2 E' e, ~; A7 {
//UPP DMA缓冲大小512字节$ R3 v# j+ G+ r4 y7 z8 `, R2 Q$ Q
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
# J4 i" w6 w) g, Y: [: {/ k#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT0 X8 {) d* h \6 z( F/ g' F* S% X
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
8 s9 d b7 B% u7 n- Q% J5 X3 t N# s. P N* H8 m
4 U0 T$ q( @/ ]9 g+ ]//upp接收、发送buffer
1 Q' u R& K6 W$ z* A7 X#pragma DATA_ALIGN(upp_buffer_a, 8)
. i+ e- K: A0 W8 L#pragma DATA_ALIGN(upp_buffer_b, 8)
% ~0 V D6 K/ a4 ?* B- V! z& z# Q0 y* o+ e; G3 U! [3 n* i4 y
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
8 ]! v( j+ q. }5 yunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
" F% _: v* T/ n: E& r
$ [3 A: [: z: K0 \' ~7 _; I% k" w& a3 [2 S% Y& K
static bool server_upp_data_recv(Server *server)
2 N, G0 U* o) C7 C8 R, f& ^{
% W$ t+ i. H: i4 |* h if(server->upp_channel_a_recv == false) {% e/ _" r& r9 S' t6 u: s
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
) J; P) Y4 N; W6 M if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
, @( ]' h- \9 E) |& G server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");0 l$ B/ c: P% e
7 X# P) v! ]! |3 { A" m4 Y* h$ [* r$ f2 P. k0 W
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);2 Q% D0 P. \/ H% d# R' ?# i! d y0 n
4 K5 Q2 ]0 m) }, {0 g1 Z: V
server->upp_channel_a_recv = true;//
, U, {; t9 e+ g9 z9 l server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
' p4 l. Z7 G1 t" f! Z* N server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;+ F0 }! w- U& K, G6 k5 t
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT; V) h% K* l) [# Q1 R
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;/// q1 J6 {$ c5 B+ @. S" x9 C$ e
( P, [+ e D0 x. f% l
upp_error_count = 0;
- Y+ L( ]5 w" v4 U0 B# g; u upp_dmai_int_cut = 0;0 b8 n/ d7 c" ?% _
- c& l3 u; A! T/ h // fill in data
0 x5 A8 `$ i* E9 ]0 ] uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);' c" d( ?9 k7 n- D: D8 e. Y9 O
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");: G5 h( `2 L' x* C) S. U" W
}
. v1 h& x p# F& c4 N( ^. i( L. ` }8 V2 U4 k) V+ }: O$ [
else{
8 r. W4 ~2 I8 g0 I if (upp_dmai_int_cut > 0){( d4 O) ^! K7 S F% a
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);" j& \) u/ }# P S
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);- o1 X6 ^: }' s5 \; z
) I4 B; ?1 ]' h2 F! |, o. ^1 z3 a# m1 Y4 `4 D
//copy data to upp_recv_list_busy
! J9 g0 ~5 u3 [3 J. y) A! c memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);4 _" R! W( M- C% [# ?
' e- k1 P- w2 ]0 ~+ f //& n# v' p) Q6 a
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
1 P3 B0 ^! y9 d w- A' \# y& i- I+ {7 c/ _, Y
//; x' m0 x. P( Y! k1 x% |
server->upp_channel_a_recv = false;//
4 }2 J& a7 k) x( |& f9 e: T; G# P) o5 C
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
& q4 K6 [" u5 O D8 p, l }
7 f. \% _( W' d/ B }' |% s2 m4 p: f3 w
( h3 F8 U) S$ z- K; C% z
5 k9 |9 ^4 m5 i" j" Q! f
return true;6 S/ F% N/ {- L# B, |) H/ W
}
; P. ^& d% j' y, _! @
! U D/ E2 L5 {7 Qstatic bool server_upp_data_send(Server *server); ~* |( v, s2 l, x& S
{( q; N8 b* F+ a4 Y( c
if(ListMP_empty(server->upp_send_list_busy) == FALSE){4 s" y1 B) @9 f3 Y; l# |
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);; r, _: D$ x4 g0 o7 y) D4 ~
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);. h2 S5 o a) K/ x
char tmp[128] ={0};
# e( K- ~" N% c- |2 @7 `' G( d
0 Z) m3 I; x# |) z5 m+ M. s server_msg_send(server, APP_CMD_LOG, "upp send: start");
5 F' J* d" |8 K& J6 w print_log(server, data, 64);! ]+ ]; ]' I7 I1 y: A
7 F7 W/ N) c( r* B //2 U7 B9 M' a% i( p7 k$ L; ~
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
/ b+ K& Q' c6 ^ memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
& L( h# _* F8 o9 e* L print_log(server, upp_buffer_b, 64);
9 c0 f* L( W+ t7 b
) l- @( @: t% n+ k3 h8 |0 l server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
8 I# l5 I1 x3 q" U' O- Y1 l( z$ Q server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
3 l3 S* [5 m: V1 c3 x6 j server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
0 _/ h" b3 D- _* r- g! m server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
- |; E6 h x6 T6 Q" G7 f6 L: z5 r7 _
memset(tmp, 0, sizeof(tmp));
) [+ c* E5 B/ q3 x w! g) J; R% V+ v sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", * R8 X! b* Z( {; n# j
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
! P+ m. }1 T- a# ~& w& ]; r% b+ o server_msg_send(server, APP_CMD_LOG, tmp);, t/ u3 x& m6 F f
2 x; a. W$ `# y7 A! j( g) e1 K
upp_error_count = 0;: ?! O* T/ B9 x3 j `0 E
upp_dmaq_int_cut = 0;) [' h0 Z3 V$ V5 H
// fill in data
5 _9 E8 {4 N# f0 ] uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
- q, f" q8 X( S9 j server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
9 |& m4 S1 r/ T8 `0 k9 R) s0 J/ D5 O/ @" |
// wait send success
8 N2 x* B2 g: X' ^ y5 Q v while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
. X# D& l+ L1 k+ m: P, c
3 V3 N+ W I' v! ^' S* {4 T1 _' a& ? // make data node in free list 0 K: R( B+ t$ I. q* v1 B* W8 ?4 M
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
, j+ Z! I9 N4 ~7 Z server_msg_send(server, APP_CMD_LOG, "upp send: success");
h7 }1 ?* {7 f6 V }* u* ?% Z$ l/ T/ X
return true;; @4 ^- [) ~/ ^, C( B& Q' M0 G7 d
}% e1 z- u- @" K7 d
# X( Y. O1 K0 ~$ Q/ F& P3 a) b7 \% w$ T( c3 h/ n
4 u' t& _4 e5 q0 o
6 t8 S: h" L% Z7 w1 l+ _9 s
1 d% e1 K, @/ v8 U% o: O& x+ w |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|