|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 1 f" h' z5 x& U/ `& i6 `- v
x' [; x) k) a) W% u( f问题描述:. i' V7 H* Q9 j, V" {, N' O
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
7 ]* x o3 K. O- w8 @% X+ D( h& L; ]% p* U& C/ |* Z( E+ O- \! b
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
2 p9 t9 M9 I; L8 u: x1 y
, a# H0 d/ D1 s5 I2 ^测试结果如下:- p' C) y" E1 p% x
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?- p3 w# z, P1 D2 `3 c& r
% V2 f4 j+ U" Q$ s% v+ N. Q+ g) {& n6 B! f8 J+ g# i* S- @8 X
备注:5 r# b5 b3 g& t5 C) [1 t
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
T1 r9 h* S& G( B2、相关代码如下:! e: Z' p( ~/ j& m' f
//UPP DMA缓冲大小512字节
8 r6 F( t( K. Q! x; r9 a& p3 Z#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
, h* h7 B- ~# b1 G- B! ~4 l#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
, d* U8 u- _. X#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
7 N/ j; w2 C3 U9 i, x' k
, H, V7 d! Q- S3 {/ |% w( d: B7 T7 X
//upp接收、发送buffer
; T8 A7 P+ C9 T5 Q( a+ B#pragma DATA_ALIGN(upp_buffer_a, 8)1 m6 f( e5 V% P7 Y4 I: o$ k: J
#pragma DATA_ALIGN(upp_buffer_b, 8)
1 g% G, `7 a& ^% `5 F, S+ X, _6 ~2 k7 Y5 V Z) @1 O) x
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];) E) W5 F8 g0 s
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
# |3 Z( |& k, T s) E$ Y1 J: Z) ~2 R
$ z" y7 F, f4 ~ @! n
static bool server_upp_data_recv(Server *server) 2 }& h2 Q4 e5 e* F
{# C0 g2 |6 r, p# B% k ^. |
if(server->upp_channel_a_recv == false) {* f. D) P5 t3 m& T8 L3 I. s! \+ X
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
& w( S( l' o2 C8 l9 i7 F. Q if(ListMP_empty(server->upp_recv_list_free) == FALSE) {+ S7 r7 [# o" F: { V( L0 v
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");5 e2 m. @: q. m- R
C. S4 `" ?$ i) X6 L, V3 y2 j* O v
7 D) o6 W. G* ?, ?
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);' f* w2 b) u7 b; k
3 y- T5 g$ L" t% R# I, e server->upp_channel_a_recv = true;//
" c+ J9 ~4 ]+ H2 M4 a: D' _ server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);5 C: @0 M+ n, g$ m, w! m
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
0 |7 s1 m" J' T3 B6 A9 A* b server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
. f6 I! j) n+ f; y3 j+ H2 ] server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
; ~( K1 `1 j) O( |( Z( W
6 i9 s% `, H. ] upp_error_count = 0;0 T; i9 L& {- A2 H, C/ V
upp_dmai_int_cut = 0;
3 f- V- P) {' [7 c" Z# v: [: S# U" y7 ^. U4 `% e: w+ v4 v1 [- t
// fill in data
. M6 ~# h, A- G3 |- f9 @# R6 D uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
. y3 J, Q9 x6 Q5 [ G3 |4 {8 P server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
+ o/ g8 l' ~: m& @ } {. { R0 v S
}; U( e4 ]+ Z$ i8 v
else{
6 D" m, Q% c9 _' [4 I4 j if (upp_dmai_int_cut > 0){# z, u' {$ U$ `$ [1 Y+ i9 J1 m
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
. z+ Y" ]5 [' w k Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);- P, o8 Z% g" P0 t
0 A( e8 X2 [& w+ w- M" U/ u
2 J: W( r/ p7 A0 O) Z
//copy data to upp_recv_list_busy: B3 W; U- f8 s& z( [
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);% D$ e* d! J6 S7 O% G2 b7 W& P7 o
% }+ G, A2 s6 ~% J9 s$ P, g! C
//7 ?1 t3 n, S4 T8 J
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
* Q- [) r% Q2 D, K) [) m [; A7 I4 o; }
//
7 c) Y0 b3 A1 k( Q a) c0 p2 | server->upp_channel_a_recv = false;//
/ z7 O, B2 _. f" X! g" U o% O7 L! L: G3 g: A
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
: j, i' V7 j5 e8 `4 m( R# z/ i }# A8 L1 |1 r5 @; C7 [5 ~& m8 ~
}
! G5 Y# E, H3 c' U. `3 u
. _2 u- ~& O% m/ p! K5 n- p4 e, `& ^3 M. z! ~# z
return true;7 `3 d, Q) s+ X5 ~5 `0 P
}
2 l. U- w( [' Y/ b9 t: W
3 N, B) a2 d% W0 ostatic bool server_upp_data_send(Server *server) ^% A& A8 `; g, p
{ E1 u) F* a1 A( c! t; y: a( _
if(ListMP_empty(server->upp_send_list_busy) == FALSE){. E/ w0 V" g$ g6 u$ {
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);( ?. ` w5 k& J1 ]
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);- H! ^3 t/ x0 B' H8 U
char tmp[128] ={0};& x9 s2 B% L" y& Y
7 k+ G! E9 }& h4 x1 K8 R
server_msg_send(server, APP_CMD_LOG, "upp send: start");
0 O0 t: _1 y Q9 ^0 e) \ K print_log(server, data, 64);9 z+ S8 i( C( X% H/ p
2 w' U' z8 L; T7 Q4 `
//
, I5 w7 S: C1 R8 @1 ` memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);- s" v3 P! i5 t1 J& K9 L: M
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);- l' j; g' y' p$ M; [
print_log(server, upp_buffer_b, 64);0 |3 w& h( J7 w
& z1 w" c$ Y ^$ V& m. S) p1 l server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);. i9 b+ I# ~+ _3 j
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ) \5 V F! Y; `
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;1 s5 g0 [# E2 r+ z- z
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;/ p" p1 c5 X2 [3 X
: X( X% r/ g9 ~
memset(tmp, 0, sizeof(tmp));
2 ~: ]: y8 p+ n8 } ] sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
1 p$ t1 W- }2 ]( x! F8 _ sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);/ M4 I7 R$ `( G. x; [2 Z
server_msg_send(server, APP_CMD_LOG, tmp);
$ E) C" n) g: d. ~2 `0 q! [& \( ]+ ]' h+ B, P+ m
upp_error_count = 0;
4 B, @7 h% j& B5 s& U7 w; f upp_dmaq_int_cut = 0;; g" D! ]1 t; O( @9 R7 l. D
// fill in data & S6 M1 m1 x3 m7 [$ ~
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
7 G7 O6 m! Q, O, B* N5 H5 u1 f' ? server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
# T n s) K* e8 _' a. }$ _ K5 n+ a6 {# c& |# A4 A
// wait send success0 b5 v8 u$ E) E5 B a1 P
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
% ^% D7 s$ k5 L( L# j5 z
* J/ ~& c! r9 i! }, y8 E# W // make data node in free list
# ^% ]$ r2 m, \4 X/ e, H ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);5 e& t4 h M& g; Y. T3 J9 b, Y
server_msg_send(server, APP_CMD_LOG, "upp send: success");6 k: u0 ~! R$ s
}
# S j) x. M1 v1 A1 Y return true;
4 W# V, r1 ~/ y7 Q- Q}* K5 z0 Y3 U/ a7 J7 D$ B% b
. g \, g; }7 V2 s1 C; T( ?- J- }$ Q5 ]! a
# A7 G+ X- r5 i C- m
2 o; E4 o8 s8 y+ S1 o2 M6 M# L9 p7 |
0 h) e6 n- S4 X1 v; ~
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|