|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 u: l5 A6 V$ L+ u
% e/ X, B$ S2 {9 o1 Y5 h5 }: x问题描述:) R0 U4 k6 e! u+ \2 t
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
% v4 a6 Y4 |: e/ j0 _' B
: `: i8 K1 D# u图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。. i" g6 F% I, W, U
0 b7 e$ U' V6 C: {" }1 M6 l测试结果如下:
. Q" G |3 P- H/ o7 I. R138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?, V. i/ N' p% B% [& h
$ h) R3 `4 v% `2 H7 k6 s$ B% h) m
备注:
3 |/ m. ^: N+ i' X1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
* @0 `8 r! w) G& F2、相关代码如下:
: C+ ]; L h1 f9 p8 W//UPP DMA缓冲大小512字节
4 _9 `7 z# V+ [3 u1 m6 A1 _2 a6 O#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
, g" f* a; [. j$ ?& v#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
' W2 k* h+ D0 ] a. x6 t% ^#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
% b3 N' x# X6 g: t' C* o# G) n/ K) z7 f8 i+ T
z5 s, Q$ O6 f' i8 w
//upp接收、发送buffer
% e8 K. T% C; ~' \8 r, I#pragma DATA_ALIGN(upp_buffer_a, 8); L7 @5 P4 \; Y& u5 V1 g
#pragma DATA_ALIGN(upp_buffer_b, 8)/ J8 Q5 y( [8 y2 }
& J& ~+ d+ _4 l: ]' \& i( A
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
3 w+ c1 M. a. Aunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
0 ~" _, Z. p5 q y8 O" K* X' @! r: O6 P- y( O9 ?! I0 H$ d
! f. o3 W. f0 ^0 n, m
static bool server_upp_data_recv(Server *server) " u; `9 N# B# x! C
{ }+ @ K# z5 x- |4 I9 g5 t! D8 p
if(server->upp_channel_a_recv == false) {3 N1 ]/ g% D9 H- G) j2 {) P4 P$ K" U
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
) g; `2 J4 T" Q0 V+ U3 h if(ListMP_empty(server->upp_recv_list_free) == FALSE) { }* P7 K+ Q' p$ P- x
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");; ~9 I1 Q5 y9 t D/ P
. w' N6 K. R3 u
" Q7 m7 v% R0 L" m) y' s memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);( z4 r6 |) ^8 {: f- |
. p/ T+ }" k6 Q, }) Y- o
server->upp_channel_a_recv = true;// W8 E! }3 `; w( j7 z) t' @4 t
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
! t3 \2 d* T# j$ A: Y server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;% p q# `- M! `
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;$ }2 j6 n# T: k
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
7 B' Y% p+ \" |) G
) b7 v% m; v( ~& `5 w6 z- Q upp_error_count = 0;
' B# ]2 n8 _8 C$ e' v upp_dmai_int_cut = 0;
+ D3 V# {- I9 A. o# v3 B5 \" ^3 B% ~' W f, j( b* J) u* f) Z
// fill in data
" a8 a- m5 G) n% _! H; U; S uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);- ~8 o" s' F6 F2 F5 G* [3 z
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
( w# U( U( R2 H4 v }/ Y; A: r0 f) \1 X( e
}
d* _ y8 f" G1 J. g else{
6 @; e" Y5 u' t0 [, | if (upp_dmai_int_cut > 0){
3 d4 s: D7 R5 s' K$ K2 I* s DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
; c. v& z* @& l& q' \ Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
+ h8 c1 Z, s& V" d$ R- T P/ P; Q$ U/ l! n0 n L& Q
- V* P {# m! l //copy data to upp_recv_list_busy
- W, A. ]6 E5 l( ?" O Q2 K- \ memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);$ l' L2 t o4 e1 f7 z, k; }
$ U1 R6 D8 m" e! A$ d //' C9 J* f! L+ I
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
7 Z: G5 l0 C' n+ Z/ W
9 f+ g3 R1 K; S/ [ //7 b6 O5 H7 F& K4 S/ s7 G& l; d2 V
server->upp_channel_a_recv = false;//, u8 [ |, K: |& ~
- y, s4 V( R- Y8 }" T3 {) a server_msg_send(server, APP_CMD_LOG, "upp recv: success");! B1 c& g. x2 j3 m. P z
}
8 B4 P: H) D1 u, l' o$ D }, I; |6 Y8 X# S* B+ B1 W4 x& z
c# v, [4 C7 W ] r
/ Q. \( P, Y1 U: T/ i8 y return true;
: U3 k; {& }- E0 t}
# Y/ @! u, n$ Y4 S, u
/ C2 R- Q" |& Pstatic bool server_upp_data_send(Server *server)* m3 d. T( K2 v3 \* b6 J
{
& y6 ]% ?% Q7 X% G$ c1 ? if(ListMP_empty(server->upp_send_list_busy) == FALSE){
% B, q: C3 W' U3 _: y DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);; G* y4 u& _* @0 k
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
* G4 |0 a2 Z: b0 {: T char tmp[128] ={0};
0 l! ^. {* m. _" K
8 `7 ^: J3 a, \# j8 x, ?1 Y+ l! l& j server_msg_send(server, APP_CMD_LOG, "upp send: start");
' ?( Z u0 }. {5 H$ c print_log(server, data, 64);
. E2 x8 |9 t3 J0 N
( V- p4 }: R; Y" F" f" D //
- T2 ]' A# B0 N% r1 G! Q memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);+ D. V4 z& S2 u% S+ `* |$ d* C
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);+ H+ f4 }! |3 G
print_log(server, upp_buffer_b, 64);
+ B4 z: S, Y/ q; |+ e+ K9 U+ `& e! M
: g; T: ?; u& {" N, [ server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);$ X$ L$ M' B, u: ^2 h6 I
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
+ B; [% x4 u! W6 } server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
2 `# J8 n& L g server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
* Z* P' d) @0 Z5 Z8 }4 z7 Q7 P0 W/ `7 B6 e8 o( v# y
memset(tmp, 0, sizeof(tmp));" k& B6 O6 Y* {7 P" L" Z
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
$ C) K, c( O8 C2 ~- C& G' t0 f sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);* W3 _. Y: s+ \; W3 `
server_msg_send(server, APP_CMD_LOG, tmp);
. H" B1 C" [- N$ e# A% c5 Q8 _. E7 X" ?9 [
upp_error_count = 0;
9 _- b, W( C& Q! h upp_dmaq_int_cut = 0;
7 T1 s+ Q% `2 E( t; X. z // fill in data 7 }; \1 v: O, |7 {
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
* E% z) n- l1 a2 e7 p" V3 ? server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");. F6 I$ I2 @# M2 f V) k9 E
5 |* ^4 r* z# U9 ` l4 z // wait send success5 e: X2 i8 J. q( I, g) O2 P+ E
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ' [$ A- F2 p' V& A2 G& z7 U
! |- x9 c% N# I, A, T7 j // make data node in free list 2 ~" R; H" [3 |& q2 k
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);' Q5 m0 |# D D
server_msg_send(server, APP_CMD_LOG, "upp send: success");$ g7 S: j i9 r3 w! n- ]
}4 M& |8 T8 P5 n, b T
return true;# Q D4 \4 Z# ~, I. ~, k
}( l* G7 b8 `: `& @: m
+ i/ L9 E+ D/ m) M! Y5 Z1 V2 d" y3 ~" z) Y$ b- ]3 S0 ^3 Y
- B5 K, r& q1 s2 M2 A3 T
7 v7 O. z; \# O5 P- D, f6 w7 F
* R& j6 q: W! z# w5 ? G |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|