|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 0 l5 A$ R3 E7 o8 n, i! h/ l0 Z! i
0 h& s8 J& r0 H1 N& m
问题描述:, ^ L0 J: }8 ^8 ^0 t
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
$ R4 c2 B( \$ s7 N
0 n$ i6 e; B# _# c! \( k* j9 c图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。! C0 [5 [& s/ n5 o: @, @4 [- ~
, h1 ^: _4 E. |* H
测试结果如下:
- q5 ]% e) l1 I9 V5 M+ \- S138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?. e5 ^- o/ }( N) e: j9 P
4 F4 U- v: S+ z7 U1 @0 k; Y, K; n! p
- P$ {) G( o! V* R2 Z4 c+ b7 ^, I备注:% t. v f* w8 t! g
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
& [. ~1 e- Q+ ^3 K! ?. N2、相关代码如下:
+ |9 P' m$ @8 N: u//UPP DMA缓冲大小512字节7 e1 x$ r9 G' Z0 f6 `0 y0 }
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍6 \1 Z6 V, Z5 p2 U
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT* V) t" s/ a: \2 u0 x! Y {
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)6 q0 m0 o& j, g G8 C* P# D# N7 t5 i
: R* E+ @; z& f
$ H5 n) E2 U3 R' k6 O: C7 m% y//upp接收、发送buffer
* m+ D& Y% t, ^- R- u; f1 I, \$ z#pragma DATA_ALIGN(upp_buffer_a, 8)
( x; j6 T4 o! b#pragma DATA_ALIGN(upp_buffer_b, 8)1 J- `2 i1 ] ]1 k2 k1 T" R
! o5 d; z7 f* y* r+ d ~
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];4 h# A! i" }; M0 g1 h+ y& p* v
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
3 K6 x, h( ]' e/ B x" @5 V" J" }0 M
" F3 O" F5 g: C5 C; r
; {$ z4 p; ~2 |3 Gstatic bool server_upp_data_recv(Server *server)
9 X" n9 s' s- _7 A{
( ]0 @7 r! J N if(server->upp_channel_a_recv == false) {
$ |6 T5 `( I7 J) q server_msg_send(server, APP_CMD_LOG, "upp recv: start");( Y$ Q* M4 v3 \8 u* I
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
! e* _: _3 ?+ o* c* [- m% b server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");5 t$ K8 c3 w8 X
8 k8 \" M1 V2 Z! t& R' N( H
6 P6 M3 z) s$ C. t; u' C) w
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
' J! g4 x, ]5 O9 e8 ? T8 Q \" D! \7 Q. h
server->upp_channel_a_recv = true;//
+ i% A* n' Y& x server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
0 f% a% I- Y9 {) r, ~+ f' P) t server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
7 j6 {+ d4 Z0 [1 I$ w server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;+ w( K0 j/ d, X
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//7 ]; y: @: i. I H) w" D- Y
* K, k1 m! w$ j
upp_error_count = 0;; R. ]( Q, l( J
upp_dmai_int_cut = 0;$ y1 @% O$ T1 \5 C; c0 h
9 y- x& o0 m* n% ?2 a' C // fill in data ) j8 q% G! U" r1 p. y
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
% S6 J, i* X' ~, K2 q server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
: Q- { N8 \9 \% v4 @+ c }- X! o$ c8 p. g; ]9 A
}5 }' u- y# u$ ^( {! V. y
else{
. C9 K) r' [4 `' o if (upp_dmai_int_cut > 0){
2 B: _$ [$ t9 X8 [ DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
/ i& X) f7 T$ h* `1 p$ o' I, ^3 y Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
/ K6 ^# j# m$ W* s4 d; C8 \) K$ U5 G/ }. b. Z& t; ^7 w
, Z9 `: a6 v4 g9 \( H //copy data to upp_recv_list_busy
# F; g- Y2 F% n2 \ memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
& V! a3 I& I& H) k& `% h1 \
5 ]% X: B6 n0 \# E( t/ {+ L //
3 c$ U9 O7 R4 g* Z: E2 Y7 L0 S ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);$ A) n9 x2 @! a, ]! B0 x5 E0 t8 p! C
- M8 G/ j8 Z/ R8 U
//
& B1 j P$ p* _) H+ e server->upp_channel_a_recv = false;//
; G0 T3 W) \6 r4 v- {2 _; E \7 Q! M+ M9 ]5 C$ I# A4 k
server_msg_send(server, APP_CMD_LOG, "upp recv: success");+ I4 Z9 ~5 C0 i" K
}
/ W$ j, k! r' M+ n: z3 R; J7 ] }
* ]# L p; M3 O; `
" D- J. [" ~5 o2 u/ Y1 c- ~/ E" v( y3 I4 o5 E% G1 b
return true;
0 B5 L+ S+ @, T0 o$ t0 J}7 H) q- P& u7 Q" D; V* [9 D. Z$ C
) r' ]5 S" M5 U* [6 Z7 ~" Qstatic bool server_upp_data_send(Server *server)
* E8 y( u# E, _9 l- u; N{
1 k, q: x& C, {* J# V if(ListMP_empty(server->upp_send_list_busy) == FALSE){
: A/ Z: B- @ U; u DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
! S2 p* ~$ Y t' Q" o% C unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
( }7 Z8 \5 c1 D* w4 N8 | char tmp[128] ={0};; }: d; [& O" L- b5 N" g' c
" {" X& d0 E$ X; |
server_msg_send(server, APP_CMD_LOG, "upp send: start");3 k9 t8 }$ h% s t# _% x: m
print_log(server, data, 64);: A: u3 B$ m5 B8 W
, h: d9 P8 i8 A* E N //
' F6 P! A9 Z4 K( ^9 @/ V4 Z- w memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);) J/ \1 s* X( d5 j- Q: E
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);* @' H# e( r; S l
print_log(server, upp_buffer_b, 64);4 V* K7 u+ \/ s6 D
! |. n& ]3 `! J& O
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
, M4 A4 O6 A$ H0 j8 t server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ) A! l4 ]3 m' R- r, E
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;8 \( B3 y9 A' q4 H% v$ @6 b6 X
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;; s5 |- ~. ^2 q7 l2 d( T
5 \# k6 w$ X' s9 R! g
memset(tmp, 0, sizeof(tmp));
1 t! {4 T5 X3 w$ K6 A% m! ?! x) a9 r sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", & B! {) F3 i4 {& ]/ Y, \
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);* q2 w; u+ n$ _' h+ u, o
server_msg_send(server, APP_CMD_LOG, tmp);" c: D9 p' z7 L' `8 b$ h' u1 z6 o
2 b7 c0 {4 z1 {, B- V: H
upp_error_count = 0;" F- i# a W2 W0 r- ~. ?
upp_dmaq_int_cut = 0;" K8 a5 K1 X8 K8 b. B* N8 F( J
// fill in data
" U% K) Q' \ p uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
8 x* Q9 u. `- I) N. o( ~ server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
% r. a) w- `! i/ M w7 n O: ?/ H, G L! ^0 E3 E, f, \
// wait send success
. p. j# c& g, @/ W& u while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
) C' h w2 N4 [# X$ E2 }4 E$ R2 h, ~5 m. u/ q- X
// make data node in free list
- |0 B! X# F7 s7 d; d& a& r ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);; u/ `9 H" P' Q! ~7 n3 b7 [
server_msg_send(server, APP_CMD_LOG, "upp send: success");2 U# t4 h3 U, { O. L# x* [9 p
}
# F% M6 M8 a* W5 X return true;& T; f& z5 @1 D
}
6 r& \" U/ U7 `+ C0 u
?6 R- H1 o+ L l, W# j
# J( ^5 s. n' \: w1 u
5 W* X% ^( N4 Z- m! e
- h' ^- {$ f+ k2 [! Z4 E
$ W1 a) T) X& n |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|