|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 / q4 A/ _! W# t3 m+ L7 x5 i
% ^- h& k2 s( \/ c, g问题描述:
1 C1 R: C+ g5 o2 E8 H& H7 j! v在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
, L3 Y) M6 X5 z6 D" c/ t1 F' N' g7 }: J# f' |8 T1 {& M3 h& c
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。" D- {4 H: ~- Y5 [6 k( p
7 ?+ d/ m* w+ d: R6 U
测试结果如下:& N' g. B* } ]
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
7 L" |! z# y0 f3 ]
2 J4 A. ~$ b& j% \7 T0 P% t. Z& e. U) v+ e1 x: ~7 s
备注:
/ s1 ~1 K" Y8 B9 T, n4 a8 |" V( r1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?6 l& |" r( k& X
2、相关代码如下:
9 z, w0 C' @" u; @//UPP DMA缓冲大小512字节
7 [; k$ g' i4 X3 l5 A! [: O3 y$ \#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍: t+ `0 M n/ p9 E- H5 m& Q2 a
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
; @0 p- O, U# u7 M#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
" w% r* }8 g- g. ~% b* E0 t* B6 j+ i+ z( y* L6 b3 z
0 Y' d3 \2 m& o: M; y//upp接收、发送buffer# o# s8 V- L# S! I
#pragma DATA_ALIGN(upp_buffer_a, 8)9 M* p! X" x# D6 W0 I
#pragma DATA_ALIGN(upp_buffer_b, 8)/ U9 \2 Q) B0 ]- t0 }. b {; u
6 `4 I; i4 T/ B( n" b
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];1 Z, J9 K9 K+ c [/ H4 ~9 d: ]6 o3 J7 o
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];" [% L) z9 N1 p4 i) w2 W
( g+ f- g/ R) |0 C
( c, ~" x+ [$ D; `
static bool server_upp_data_recv(Server *server)
6 \- L* k- z7 f' P{1 i5 n3 K, n! C9 ?8 R" `! s9 f
if(server->upp_channel_a_recv == false) {9 a8 N' [# w [ p7 ^
server_msg_send(server, APP_CMD_LOG, "upp recv: start");5 f/ G X+ d; `0 S+ t
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {# G: T0 y5 _) `
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");" t! h! O8 q) q% x; X
* f' q6 O( B6 w8 f9 f: C8 p
) C6 D) j: V- W3 C0 \% Q) g3 l1 }# v
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
$ Y! u" D6 \9 O# b
. J, }/ u- T# U5 R! N' ]8 h server->upp_channel_a_recv = true;//
. T5 D8 B5 j. x$ R3 ?+ t8 o' a server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
& @; Z" ^" U5 p5 L9 j7 M& w$ F server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;$ V: [* e% X# C, ]
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
; q7 N' l. a! ^; | U# N server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//3 R" [9 n/ A6 I
. G, t3 U' u+ @/ k) y) f% Q upp_error_count = 0;
7 N( y" J' ?1 Q5 u upp_dmai_int_cut = 0;
( G7 Z1 y! n; V, H2 \! J+ o1 h0 {7 m8 u- K% t ?4 Z
// fill in data ; K; d- g5 _& c! f# T
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
* K1 b4 m8 q2 s+ [7 B' Q" ^ server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");2 f, X1 ?1 s) G2 x
}: Z7 e6 e* v! T) s
}" b$ W0 }6 g1 ?" D) B
else{
! g) i2 d- {( ^1 Y8 m' g$ |$ W if (upp_dmai_int_cut > 0){
+ o2 [& W# j7 a! t6 ] DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);& p) [3 N+ ]6 L, o' \4 x. z0 [
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);- y4 `2 x6 K$ `9 x+ Z6 x: k
1 T8 z- w- C0 T$ k2 j4 \# a
1 q+ c7 p: a5 p2 Z7 e/ X: I Z
//copy data to upp_recv_list_busy
( r2 x2 z i( {' S, Q: l memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
e8 \, _4 b4 [& k& T# L( a6 H# Y9 {* }) B9 K( {
//6 M$ D) [1 L8 `1 h
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);; \; Z% \1 F2 q4 h
8 H8 k6 r" y* s, X) z //
; q2 Z% I0 u# @; {; d N3 S- v server->upp_channel_a_recv = false;//
' `2 O' n" s. w
9 A. k6 m' I; e" H server_msg_send(server, APP_CMD_LOG, "upp recv: success");
7 Z; }' _0 r. c! O* W }
6 {: t# E J' }5 Z }6 g& B- p3 T- G( m/ q! \
7 ` p6 k) [, M8 c
9 j& `& C' ^) @3 ]( K return true;' w1 S2 b( i& Z7 Z
}
8 ~; J9 r8 W5 m6 } W6 A$ w4 G" E
' g9 R0 k8 t5 Tstatic bool server_upp_data_send(Server *server)
; P5 U# K* r9 j1 t{) z7 {5 m+ t# ]7 }5 Y( k- J; f
if(ListMP_empty(server->upp_send_list_busy) == FALSE){$ `" r8 h+ b X' p, [" I! j
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);5 `7 [- f' M- R7 q4 j1 E1 e
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);1 _$ w4 k$ \' l" T/ X/ ]2 v
char tmp[128] ={0};1 B9 c, J! g) X7 O$ B% i+ Y- E
$ o1 _) B5 h: O. p8 ~9 A" W
server_msg_send(server, APP_CMD_LOG, "upp send: start");# F1 O, g A8 I9 j
print_log(server, data, 64);
) V" |9 x- a. m- {& o8 l
! ^* A7 V( M4 f8 u //! U8 ]4 ]% h5 U2 A, X) r
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
V( }# {4 m, H. _" `4 s3 K memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
- I: O: I+ X8 c- S2 s) \ print_log(server, upp_buffer_b, 64);# G; q& q5 X" v5 ` M, |' @
, Q( ^! X& F8 T4 F) X( A5 I: j server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);7 ~6 e; F r) e1 \ ]3 N* K8 _
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 9 w1 v( X9 s2 z- y' Z+ ^
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
- N$ w) R4 q- V: k( n server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
7 G3 g- O1 |& ^0 \0 R8 L* d U# G: `
memset(tmp, 0, sizeof(tmp));% m$ M/ f3 i* T; d9 P- Q' L
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", " X. m" x; `7 j+ N+ f# z, H
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
) w+ w1 B% |: w3 T8 k* w8 ^ server_msg_send(server, APP_CMD_LOG, tmp);
( H/ }8 b1 j! h6 A$ D, p" q8 Q. B
upp_error_count = 0;
: N$ g8 Q+ i9 V. A+ M# T upp_dmaq_int_cut = 0;
; x9 y9 t* |* I. i0 D // fill in data # r" p3 g; i/ f
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); # d0 k3 [+ ]8 J% f- V, Q0 T
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
. q$ f$ T# h1 _5 K1 T
% c8 c3 S, j% k' e4 K; A // wait send success
( ]5 t3 \$ B& R3 K" D x% | while (upp_dmaq_int_cut < 1 && upp_error_count == 0); $ \, {; o- {! p
. i, L2 t ?8 O4 X, g
// make data node in free list
9 F/ D4 E# `- G- Z ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
0 H. h; j2 @9 ^5 y Y$ c server_msg_send(server, APP_CMD_LOG, "upp send: success");
% i# E$ j9 ~: F/ H }
1 a0 `% H1 r f0 G; u7 \, @ return true;2 F; V% h9 T* K
}4 B' z' r" }; `% V+ }
$ g4 g- d$ B6 ~' Q1 m
& g6 M s |6 c9 H; J6 q+ t2 \9 G5 {8 T: W8 a4 _1 I* Q) K; f( @
# L9 j4 P1 X# }
! d$ ^; A3 n# r1 ? |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|