|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 , o+ K" B' y4 C5 o* F+ E
# t$ G4 Z( `! ~- V) M8 p
问题描述: q3 I6 n r. I: }) O
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:$ a" }) u% Y3 Y2 \* X
- Y$ X1 O7 q* a; T3 S2 {
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。, ^; F- f+ _$ Z! U N
/ V P0 a7 i" J1 L$ v% n+ v$ E测试结果如下:+ T" J6 i4 y2 q- k
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?9 e" H6 D+ D) T" T% P) o" j
, U" b3 \7 Y+ p' A& p0 _8 ]
3 p* T" @+ w" M- n* @备注:
4 w% D4 B |/ `$ K1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?$ R% c* _5 Q. T i0 d# z# ?
2、相关代码如下:
/ @) {+ i& I6 N, X5 W1 A//UPP DMA缓冲大小512字节
2 r9 s7 {7 ?& i1 F#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍2 E8 o" q0 f% `: ?8 R6 W
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT, n1 B+ f+ C V8 E
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
1 q0 h$ l' p. F6 T
) w' \& e: ^( }$ w; R# {
) N0 k* p& p4 o5 t//upp接收、发送buffer8 L* O0 \* \/ ?4 N/ h1 ^, p- K
#pragma DATA_ALIGN(upp_buffer_a, 8)
1 d5 [& Y" r4 n; Z9 U#pragma DATA_ALIGN(upp_buffer_b, 8)* k( \8 T4 j. q8 _/ ?# Z I
% U. `" O; ] m- c+ `2 h# o
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];4 A. l& m( r! d0 k) U9 a) ]2 i! s6 ]
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
" q8 i% }% s6 ^" l( C& O) |( i$ v% [4 K
2 @8 S4 W5 B8 g9 D/ Ustatic bool server_upp_data_recv(Server *server)
/ n: u% A1 J# u, d) ]{- N3 @( d" H0 @. E, H9 X" e% d: Z
if(server->upp_channel_a_recv == false) {
. H7 G/ z; I% W+ v% L: n server_msg_send(server, APP_CMD_LOG, "upp recv: start");
( @4 ?' l: K$ e2 _# f9 C if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
8 \+ n2 q) K5 V) q server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");0 Y" K* N1 A' M6 L. ?! Y: d
' [% g: c, e; w( I( h$ A: B# Z7 t: X8 A; w
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);( D% C! Y( ^ P* H* Q7 r( M
+ I9 ~6 q7 N, X5 s( u9 c1 e0 [ server->upp_channel_a_recv = true;//
7 A0 ~. T$ r" F4 `# v' X* x1 u* V server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
- ^6 I+ ]& W/ O! D% p2 b' s# p server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;! L) T$ ~* J1 q1 N6 s8 x% E
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
- Y/ p, e" Z4 x7 H7 O( Q' E server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//$ [5 O( ]2 y& w0 [ E
2 F; z% {# s1 W e upp_error_count = 0;9 A- q! x* j( _8 @, j9 Y$ D
upp_dmai_int_cut = 0;, l& _) {, p9 E6 K6 x- @
. A. C+ }9 d4 {+ `
// fill in data
' @$ p) m+ W) }; f2 G" j9 y$ O4 j uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
; [( s2 v2 m9 k w. D8 C7 |! I5 H server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
8 u& V+ P4 P6 \) H4 v }- v, a3 ?( r2 D
}' L r3 s U; g* X9 Q
else{
) Q) w. o" Y }8 P if (upp_dmai_int_cut > 0){
) d2 }1 J8 @( K K5 ~3 u! w DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
" ~% M1 U6 X1 J$ o. E2 {$ ^ Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
3 o4 F+ G: [* r/ q( u/ H
9 [2 a. @ T6 h. g( g* C6 V- m3 `9 e$ ~( }# e0 s, y
//copy data to upp_recv_list_busy
: \3 o- X2 c$ X memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
1 F/ U0 [4 g2 b* M, \3 a+ s3 f( `
//1 ?5 e4 }; |7 Y9 n7 [: X) y! S
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
0 i! z$ W5 v1 k1 Z8 ^. @% Q- H6 m* \: t* _, M+ z5 O& F
//
" u- `" k" F9 N% r# q1 r server->upp_channel_a_recv = false;//
4 j8 F* n& _1 B# G5 P9 r' M: l. z8 d
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
/ t( l- t, b# D }6 ?3 p* R7 Z: P7 V0 Y" Q, C5 G: B( ~
}5 t; \, }. O4 w: P& Z5 ~
9 z& N I, {( a) J) {4 h; X' Y
; A% e$ S; ^7 N' O4 q# m |) Z" ~ return true;
7 O3 ]& E7 H X}
# u2 d5 G5 {+ p( [3 O. j7 O9 P( }$ S/ n/ |9 z; i K3 _2 u
static bool server_upp_data_send(Server *server)5 L2 `9 c+ \; q7 q d
{/ D5 Q% G' K: B& Q0 ?( r
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
" d1 b, D @ ^ DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
" |; a, H$ w* J# h unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
8 u1 ~. S! g3 t+ h( e9 z! t( J char tmp[128] ={0};6 |# B1 G. U* o/ M6 `7 }/ {
( _+ V; ^) c0 O- l9 h7 ?8 N server_msg_send(server, APP_CMD_LOG, "upp send: start"); M& L1 s. J# R: J5 f$ T
print_log(server, data, 64);
3 U8 L# g7 H' l$ \6 y2 V2 y* g s3 n
//: E1 H9 M# u. k8 V0 d" H/ ^+ q
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);+ B+ {5 d! k2 M9 e( E
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);$ [ |- r0 R0 {) _$ o
print_log(server, upp_buffer_b, 64);# \9 L' q5 { j
, ?3 ]0 m( a9 e7 h/ Y5 H+ {
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
/ R, S/ t8 T4 q/ l server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 3 d/ `0 L0 J9 @3 l0 b
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;( |6 D9 V) S0 D: m/ F9 L+ y
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;. z( ]7 e( ~* @" M* [' u- f; A
/ K* D6 t0 [) I. P, O. n$ j2 u
memset(tmp, 0, sizeof(tmp));% E( \: \- ^% q
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
) Z+ a$ _1 F8 e* q4 q0 D+ c: _ sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
6 o1 F; N: o- p6 Q5 e0 y server_msg_send(server, APP_CMD_LOG, tmp);) }: K7 }( \/ D* P4 s
- ~$ t( @: z& x1 h
upp_error_count = 0;. I8 H4 H# x% {- l
upp_dmaq_int_cut = 0;
n5 `7 B" q3 T; f, V // fill in data + R0 w k- e) A9 T! [& ]3 G3 G
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); . ?4 j4 @4 T8 h" y8 e
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
9 b' M) K! n5 R' j% ]$ j+ `7 O6 ~/ X4 A# t
// wait send success
( W% M4 v2 k% ] while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
( }0 o2 {) `/ r, j/ a
) L5 K- A% g6 s3 U3 U3 i$ u // make data node in free list ; {( t0 ^# I& z$ x3 J
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);5 C5 C: F5 `- ]. u' v) O* y: [
server_msg_send(server, APP_CMD_LOG, "upp send: success");7 k/ _1 X! w1 E; [9 Y3 [
} k, P8 \6 w4 K" x) O
return true;* B3 c3 N! v( a: m% f9 U+ c4 M4 A
}! M* d* m2 V! K8 H0 }
( M8 d2 ~4 ?# J3 a2 F1 G& L s
3 c' x0 `9 j c; ?* ^; s' p& s6 T4 e: j, f( k$ O, M
1 L7 [! l% v; T4 G1 v. r; L
) u) K6 N5 Q a: ~. ^! e |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|