|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
]$ `% j/ i4 \: F7 U: m1 [$ V
- G! j5 J) I/ }. ?) T) X& ^% U问题描述:
; B& b' N' _5 \. i" R7 e在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:& T( o0 [$ J3 V5 \
) P0 @% H3 W4 @3 C3 h
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。1 }0 B* S: C9 \, n+ }
5 R z" N9 \3 T" N! L8 r
测试结果如下:9 A$ j9 F) `& C& W! p
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
( \( l! o# [+ `
! d5 o3 Q3 u1 C! ]9 g; _( K, X" `4 w2 ]) z2 I3 f2 F
备注:( I5 S, w, M6 |$ R: T
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
9 h1 w3 C; ^, N2、相关代码如下:, r* \2 g7 e- D9 N1 D' e# H5 U
//UPP DMA缓冲大小512字节
; S1 u( @9 T, M. l#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
V: D0 W t% ^0 C. r' E#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT4 `: G1 W" a3 V0 s1 e+ ~
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
. u Z+ J' p+ F/ @1 U; \
. |6 z3 m$ r' w! a+ G. I* P4 b/ H# P; `) w: m
//upp接收、发送buffer% |1 f0 a+ t: R `' P
#pragma DATA_ALIGN(upp_buffer_a, 8)# L9 h0 [$ f: U) R; h2 q! `) L
#pragma DATA_ALIGN(upp_buffer_b, 8)
: a# r9 ^6 |( F& ?
, U- Q! s K/ f% e6 |unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];) n* I. J$ t% B* z9 w
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];5 n# o" }) p0 e j. J4 Q( [# A0 ^
1 Y+ _$ k2 t& ^3 ~9 p: X& u, L5 s: O, `& W9 x4 s6 N
static bool server_upp_data_recv(Server *server) " X) a2 J" t |
{4 J1 l4 L+ B! b1 n" \$ `
if(server->upp_channel_a_recv == false) {. _6 L* z" Z2 q) p3 Y
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
& _' R' k- C9 H. }( H2 t0 K! C if(ListMP_empty(server->upp_recv_list_free) == FALSE) {1 Z' n/ k* a3 u5 W+ P; S% E
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");* }: p! {/ F) w
# c9 i0 U+ x& H; P) V( h/ v# b
% k2 c# X/ [4 V$ T
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE); `0 g% H! l' Z/ j. n* i
( t# e+ g% X, W, Q server->upp_channel_a_recv = true;//
3 y2 c) B' t7 J9 i/ B( L server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
/ f7 s: B9 X( m server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;9 F9 s/ U3 l& S, S) A& A0 V5 Q* R
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;/ [2 ~& [% g2 c& d+ |
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
5 ~% t: F7 L/ n: k% g. t# J" }9 r1 ^6 { o
upp_error_count = 0;) s C: ?. ~% M$ Z& G: a0 `. S
upp_dmai_int_cut = 0;7 z% L J/ ^, N- A# C
+ _- X4 K+ }/ E# F: u8 { // fill in data 2 E- J: v" _% \
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
/ N7 e6 D7 y$ T$ c9 j5 C server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
/ G* ^% ^/ F$ J1 A$ C9 w" a& y9 u }
/ m% p; J0 L- E& K0 J }; t( I7 }. T% _0 b
else{ F o: J9 z3 D' x4 [. |
if (upp_dmai_int_cut > 0){( s9 X8 O. D: W$ Y, d2 q
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
8 \7 O! F/ R" h Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);3 F, ?$ ` u4 z. B
" l8 Z: Q9 }( G$ m
+ ]' j- B2 l2 p$ V //copy data to upp_recv_list_busy- T2 B0 q1 ^+ @* r3 T
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);: j" X2 o6 g; Z7 S+ b& V& M, X
- D' o4 E V$ A; P/ L6 v, \$ ^" G
//
3 }5 X1 {7 G* V8 a: G/ [ ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
+ i, G- D4 ] `4 u2 i% Q$ p! r* e" b& z+ q, P$ }
//9 V+ \3 L: f" h9 g9 o3 z6 |+ k
server->upp_channel_a_recv = false;//- }! ?7 m) F$ F' o2 E
% v7 T- Z9 i+ D server_msg_send(server, APP_CMD_LOG, "upp recv: success");
. ~" z; u: z. v5 a: V# M }6 e1 I, k; v7 [) J# y4 [% U4 {; q
}, I. T9 b1 l, A& [4 }
: e# \: f4 o9 v5 \! ~! I% K/ d' o5 H
return true;
! y" M3 M: \: O# z u}
6 ?6 o. d$ _# x* l+ e
" f/ o( I* ]/ U$ E `static bool server_upp_data_send(Server *server)
! W4 D8 Z, |6 D; U3 G{/ E) |7 ^. Y9 e! U9 X
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
* n; r' I+ j1 W8 P DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);5 {4 O9 @+ n1 t
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);6 j3 U& P7 e, ^" S
char tmp[128] ={0};
& f+ U a8 r) x
! q, y" D+ c {% o server_msg_send(server, APP_CMD_LOG, "upp send: start");' z2 Z+ B. x/ Q3 m
print_log(server, data, 64); b1 v$ r. m3 G/ t6 \$ E. W& ?5 R
+ Z" c- C4 t- y( \- D. I8 M9 [ //
" ?+ z' a2 f! Y& s$ \* o! Z3 ? memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
7 k! M, [" P9 T memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);3 i" K8 M0 E; S2 s2 x0 P
print_log(server, upp_buffer_b, 64);
- } r1 R& @- R( q/ f& ~0 ?7 m2 h8 u' f: u" V+ p1 k
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
& i- N2 V1 A2 Z7 R) l( \0 m server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 1 r# B1 f/ l3 ^7 d
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;! @2 B9 y' C5 V4 {1 R* l( I8 b) S
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;# p& \6 v! d; d$ X
! \* i3 s! q* ~- N. d7 V memset(tmp, 0, sizeof(tmp));
/ @) k! K0 } P9 z- ?3 w1 [ sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", * g) Z' M+ g+ O% m
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);" J3 x- X$ f* ~7 K
server_msg_send(server, APP_CMD_LOG, tmp);" O. h' ]3 g6 f7 H+ _% ?
: F- Q' h/ a$ `1 y: `; P2 o1 y upp_error_count = 0;
2 L! R7 r! n- s/ G! T1 @ upp_dmaq_int_cut = 0;- E; m: [& A* P* u% \. X- \. q
// fill in data 1 E" n) J6 M/ V4 O9 c* O
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
" _; E Z, B6 u3 d9 S server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");$ [) j( H# s7 \4 m1 J( d; R" u- f
! e5 d8 ^5 B* R' j% x
// wait send success
2 x5 K' A2 F% e# x while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
# P, }2 `9 M* J) p. `0 b1 I6 x+ {- s0 E6 @! Z* {2 v9 ?2 V! x0 S6 [6 t
// make data node in free list
2 K1 K4 V! s8 N% [* t' r! O ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);7 ^6 k) w% H4 y0 T! n T
server_msg_send(server, APP_CMD_LOG, "upp send: success");. |! \* l1 Z4 V. R: `
}
" S% }- ~6 q, `: [' u- N, M! W return true;6 l2 {/ I L2 P% a/ T5 v8 H' q
}
$ C4 G M; F' n: m/ U0 Q/ Y6 E4 ?( N) v0 x
& w) R7 U, {2 N5 u* ?
$ C1 @& p- N$ V r
4 Y# C/ D/ r1 x' H& ]
& o; w0 L; ^( `' ~
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|