嵌入式开发者社区

标题: 138 Upp问题咨询 [打印本页]

作者: liangws    时间: 2017-4-11 14:43
标题: 138 Upp问题咨询
本帖最后由 liangws 于 2017-4-11 17:00 编辑
6 ~) X4 {7 M4 B8 M, v3 b& p4 C1 J5 C9 c! }) ^7 O
问题描述:9 u" _( b% D1 x- t
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
5 K0 v4 {* ^/ q( x1 ?[attach]2174[/attach]8 b' T7 i9 s; W, j2 ^- `$ l* ?: `4 L
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。5 g2 A7 }, z  o) I+ T
8 ?' q4 e1 y: u1 `' N# J
测试结果如下:4 {( g4 l7 y; }7 _& @' r
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
; Z% P4 q, m7 @6 M, k; M9 t  e" A% Z" ^' f8 n. Y: C
, f" J1 `# E2 I- c3 z
备注:( j8 j4 |9 J. i& ]7 D
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?9 }9 ?2 \+ G/ F. `7 }/ j& a# ?+ h. p
2、相关代码如下:% _2 l: p. @; h8 q9 A" ^* \
//UPP DMA缓冲大小512字节! @/ I+ {: @" [- ~: J1 {6 |+ E
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
6 e  Q& }9 e8 d2 H8 ]& b#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
7 @* X9 a$ P3 V. C$ d#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
1 c0 \. F6 Q6 l/ r+ ^+ U
1 _+ L& a, V. h, ~3 Y
7 [3 }8 _: u- n% \7 S$ a. S//upp接收、发送buffer! T, p1 b1 ^1 R1 l4 m
#pragma DATA_ALIGN(upp_buffer_a, 8)
7 _+ x- `) y4 p( V5 ]; L#pragma DATA_ALIGN(upp_buffer_b, 8)" x% `- V% t6 V  g

# i/ L1 Z8 {0 o& |unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];% M& n# R% F- U4 S2 C) F' s
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
0 D# y4 \) F! w% S) j2 V  O
1 X+ p3 u; y, v( y1 e7 w$ [, b! ]5 |: {6 b
static bool server_upp_data_recv(Server *server) : I. y1 ^  n4 r1 W& J8 S+ v5 m
{& J0 ?- |/ o$ k" u1 [5 P2 X
    if(server->upp_channel_a_recv == false) {8 I& y1 S* z( r( X
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
; Q) O* C) |9 z% _6 Q5 C        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
# U3 v3 c. C" Z+ g4 }! d% [( w            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
9 N4 p& {8 R' z8 v2 e
9 R% V; C# |2 u5 d4 t
4 |6 ]" x5 ~" r            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);; L7 f6 y. ?+ t+ N( V/ y
. }) C. ?3 h1 S! H) V
            server->upp_channel_a_recv = true;//! z% C# X6 W3 U) y% K
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);0 |, q' t9 v" ]8 }. g0 F2 Q
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
$ ?' `+ B( i7 T8 n/ x            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;2 N' N+ ?( d) h5 Y
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
# v! E% s, W; h+ ~" m7 l9 p; k) `
4 l: w  w7 ^5 o- Q% G/ I) q* @            upp_error_count = 0;
5 C! g1 _; I" J1 e: g            upp_dmai_int_cut = 0;6 ~. B) a9 b7 [8 e5 S. S3 f
6 J3 P8 o! @5 a* |0 [/ h' }: [" k
            // fill in data 5 c1 s9 V8 o( ^! Z
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
/ ?8 Z: F5 L: }- Y! ]4 p& I            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
( S& z* `9 G4 Y; r: c& Z        }
# j4 K3 u8 z4 [+ Y8 G% l    }
) r# J0 _# W0 {3 G9 V( h    else{( H6 \  u! K! R" M6 }$ Z: D
        if (upp_dmai_int_cut > 0){* [: t: b' ^- O& ], o0 L
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);4 K& j" \# e" C# f2 C- E
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);! X; Q$ O2 I9 F) R2 J# [

8 f; `- v4 L/ A8 X7 |0 c2 j# s% S4 z8 E3 p/ V& ~! v% T
            //copy data to upp_recv_list_busy' i# S5 B' e3 K. d1 m: Y
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);. O3 u; k1 W0 x' `7 z! W

2 C& c& i/ r, r/ V' l5 H# C            //5 \. c; I5 e9 v" x* h/ Q! s
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
) R) T8 t% D8 T! U% d+ n! [- t0 O
) j) W5 g7 t4 g            //+ C& t8 m: o3 e: _5 D. R4 L9 X& ?1 a
            server->upp_channel_a_recv = false;//3 l! w- {  ~& \; j* z7 t( ?& l: ^
0 J  @4 ^5 ?+ @  C9 b  i* N+ h4 i
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
7 L3 a1 e% O( c/ `+ t9 g7 \        }
: V/ ~# ~9 K3 ^; D) ?! I5 l    }
5 ]0 U* W$ D" A& l' I/ p" w
8 \7 ^1 t, P" q/ }+ h9 N: b, ]/ [( c  A$ e: J
    return true;% ~0 h! [5 G4 K* k/ f+ R  ^
}
4 Q; e  E7 i0 r; i1 W7 @/ D; r& W; B# k4 y5 v+ w1 D6 g% N( e
static bool server_upp_data_send(Server *server), n+ V: ~6 }9 i5 K* J, @0 d! s
{
: x' n- E/ e  ~5 j    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
1 t' o! K' M9 d0 u$ ^" d7 }, e" V        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
( X: A- X+ \* t% S1 R        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);+ E% }9 x5 ?8 h8 U
        char tmp[128] ={0};
) h- B0 K: u% z4 r+ N
$ a; s  s9 m! {' d* R* M; p        server_msg_send(server, APP_CMD_LOG, "upp send: start");
% V. V6 L# k3 x7 {* y! T. E: I8 B        print_log(server, data, 64);; u/ M5 _3 r5 i

% S/ E+ e: K: ~2 c8 j- h        /// X/ h, c) K/ C$ G8 ~
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
+ h+ A' h9 L% S        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);$ P* G) v2 t* G5 T0 ^4 f. k
        print_log(server, upp_buffer_b, 64);
4 t5 C3 e2 M; i  w. E" A0 n- v8 k% r% j; w( _
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
5 _: s4 T# _& z$ P/ L        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
) s4 \( ]$ D8 W& l        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
; `& y2 T/ r, k% W7 F        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;" d6 Q1 \# N. N# m  }0 w
  A: M0 f4 V3 @6 F) j) |8 ?: y
        memset(tmp, 0, sizeof(tmp));8 ^2 u& H& c$ g: t, \" o
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", * ^) X. Y/ F( F! F$ P1 u) s
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);0 r  T- C6 _( {+ j4 p, H& |  {
        server_msg_send(server, APP_CMD_LOG, tmp);! G8 Z, P2 g5 \1 {, e/ q' a" D

  q; g  T  i9 C+ M) j" W6 J8 k        upp_error_count = 0;
+ V. d) O7 H9 }2 k& B        upp_dmaq_int_cut = 0;' `2 M3 c4 |0 A& b/ F. D  j4 K
        // fill in data 4 v+ ^( E* g8 d- G" g' g3 b/ m
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 3 {* @1 q. u2 m, \7 D& P% B
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");8 L+ b5 [6 D9 d7 W* c

+ I" a: N) p3 j. ^- E' @        // wait send success, P1 m* L/ A: q# N  I, E: Q
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); . g" s- D9 `4 k; b7 L  i: j2 Q

; ?% {# Z2 E/ x9 O# w0 D  I) T, w        // make data node in free list
3 h! }* d: v7 v( [& P        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);8 `5 U1 o5 I1 G9 i$ G
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
2 X1 c, ~' c% {2 T/ a2 b) b    }
0 B1 Q2 B- r: Q  \) i7 T' ^; ^; W) |    return true;0 _* B3 F8 x# p  j
}. d& w# b& _" U2 _( j2 R. b

0 F4 P" a. U; G
) a5 Z/ A4 A% F' j
4 Y, C+ H6 ]% F8 T$ I

9 Z4 g! \& U; @' P2 d! P$ S
" |; y$ Y4 ]3 @% @
作者: human    时间: 2017-4-11 22:03
需要边界对齐8 D7 u! ?/ E$ \! ]8 B5 t
[attach]2175[/attach]8 Q4 m3 `; C! b# e# U% y





欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4