嵌入式开发者社区

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

作者: liangws    时间: 2017-4-11 14:43
标题: 138 Upp问题咨询
本帖最后由 liangws 于 2017-4-11 17:00 编辑 4 X$ {2 [) _! H( u% X9 r
6 v, l9 c8 D: C" {. Y
问题描述:! G3 D# e+ h( A7 A/ W1 P4 V2 X: k
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
4 M) N0 a" ^; @$ W8 W[attach]2174[/attach]! Z% s4 _" T' \3 x  P
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。$ J" N* A, c; s' f) n1 @
$ S& i- Q% t# m; v6 N: M1 j
测试结果如下:  I! |$ X, E9 @% c6 o
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?) p9 \& Z1 }, ~/ p
7 R* y+ O- @( G7 _: L( u
8 w, v, o! B! S4 w+ ?1 z( z
备注:
" l- N( V0 ]* `+ r. A+ I: m1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
3 h6 y# X4 \4 P. v6 l" N3 T$ ^
2、相关代码如下:
9 z/ \* u  R7 D. u1 K( I//UPP DMA缓冲大小512字节% Q8 S6 Y, T- ^( `, h" j
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍: k$ H6 \" F$ }' D, M8 e# q' {
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
2 T  {+ u  K- E! e) b  F#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
3 H9 d, l3 E$ X  o' c' D' e2 a& y7 E

' U- {4 j: m! Y4 w//upp接收、发送buffer
! s% H7 v0 R* P4 i0 F/ g& G#pragma DATA_ALIGN(upp_buffer_a, 8)% J5 b% L# Q( }. C# q+ `- i1 {- f7 C
#pragma DATA_ALIGN(upp_buffer_b, 8)
0 a8 i, _2 Z( w  X% U. Z( y/ @+ M
! e# `  [. I* d# a- Runsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];" G4 S/ F" r" o4 z: g$ {$ `2 I
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
) @- j8 f# c0 N8 [4 ]! j/ J1 k8 `: O0 U7 W& ?$ ^* \$ [
  U  f0 \5 w- K. ^  b$ L
static bool server_upp_data_recv(Server *server)
( J) [$ J$ K- S6 R: D; K{
6 V4 [5 ]$ A0 N+ |    if(server->upp_channel_a_recv == false) {
7 W( e7 X' i9 l        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
+ a: q8 ^4 w4 o7 }0 @3 _8 V; E        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
3 q% K/ f$ J5 P& l5 P            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");  I( s9 T: V  v: Z

, x0 {) Q# c6 w( L" S# R9 Z9 n& ?8 W- t. x
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
. Z3 q( a) W2 r( m" d/ k# L" H, q2 X! s1 G/ d9 c2 h9 M' t8 u1 n: V2 d
            server->upp_channel_a_recv = true;//0 S/ n" M( f0 ~  _4 \) C
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
: G6 {4 ~5 {3 A9 w$ Y! ?            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;) Z! z3 M, t$ H  _( ^0 v
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
  A# h# x/ O9 f. V            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//  X. J% h7 K& ~7 R# c2 f

$ L) n; w, a- u; Z$ R            upp_error_count = 0;
# o4 W* @( R  @+ U1 F) Z7 o5 G6 X            upp_dmai_int_cut = 0;
9 ~& q! m4 T; N" W3 s$ Q' u% n7 J. X+ u; f: E/ T4 T& t% K1 i
            // fill in data + n9 B; I+ ?* Q; ]. j  Q
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
6 |; Z0 R  M/ K9 Z            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
4 z( i, H6 D( A% M  t        }& ^' `3 o/ w$ F4 g
    }; n2 {% |, J9 F5 S
    else{9 D$ K' }' w, b  \- f% D; L3 x
        if (upp_dmai_int_cut > 0){
* ^7 @9 a) }! `            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);0 }& \* I3 z8 A3 h4 N$ }, g4 I! U
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
* k5 D1 g: o8 e( u! E. f
) U: S" q- e, p8 i! b! w
. M7 K+ l: ~  L0 B1 z! P3 A: ^            //copy data to upp_recv_list_busy2 g! P! y8 d1 ^- A4 x8 m- M
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);2 J: v. W; f$ V# n! @

% h" P# c& h( x  R1 M            //
3 v# L+ Y3 F6 Q  z; A# n! J            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
! b4 A0 [6 I- s0 D; l
. [# y/ @+ X. u8 ^% t5 q% z$ \; K, t            //
" ?5 T3 I) R" V+ Y. s( d            server->upp_channel_a_recv = false;//
2 M3 [) J- Z/ B8 W, y/ m5 i
( p) @4 @; R. _8 R# v4 _' i            server_msg_send(server, APP_CMD_LOG, "upp recv: success");  D/ i  ~* e5 _3 E% h
        }
; D# @4 N2 o: I- q9 I5 e- u! h    }
: R+ X$ J( }0 M) p. s! k& v3 w$ l8 r
9 g" y% Q7 Y% C& F: ~, O
    return true;3 ?5 t- b* _2 @0 I" |9 ^" P
}
4 P6 Y8 P2 l% j: s7 m( k& ~, f" m, H, b" K3 V
static bool server_upp_data_send(Server *server)
5 @1 }4 o& q% n) ]- d{
+ x( v2 ^( Z  M/ k6 j5 |+ l. B    if(ListMP_empty(server->upp_send_list_busy) == FALSE){7 Z) ^. t" n. i5 X0 ~1 R5 N$ [
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);( t$ h4 x# w; O6 ?, D
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
7 h8 Z2 ?, d. i8 t/ I6 K% z        char tmp[128] ={0};
1 R5 i' W8 e  c  S% r; _  Q& g: I, q
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
# x1 P. l4 O2 i1 q* b2 \        print_log(server, data, 64);$ @( Y- W9 v% N, [2 R% }0 B- o

6 |0 {( b, }; p- \$ V# ?        //, R/ F6 Q9 ]+ @. L* R$ E
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);0 ^: N4 `3 ?+ P3 [9 n
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);. S, A  {. L' I5 M& f& i8 _0 p1 N; D
        print_log(server, upp_buffer_b, 64);
3 f8 ?- A: w8 {
; g0 j9 g# Q5 ]& I        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);: M; i( @4 e; J" I
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; " }4 Q# C8 c0 p* V/ r" v
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;3 \  T8 P( d0 C$ A7 ^
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
6 y0 P) w3 J' p& E, a# \
! f# L8 D& d  x1 J  j2 Y5 y        memset(tmp, 0, sizeof(tmp));# _* l% h  a% l3 f
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
8 j* x9 f# N. E  _! \            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
# W2 V7 U8 h$ Q( ?        server_msg_send(server, APP_CMD_LOG, tmp);% f2 h6 c  l9 z. k: M9 K! O

+ h: [' V9 i" U/ c        upp_error_count = 0;
- f( A( h  }5 T/ Q' \        upp_dmaq_int_cut = 0;
+ p% k1 C7 M0 I# ?9 ?% y9 M# t        // fill in data
$ H/ O, i, A, b8 q  e. f        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ; E& E- |' r( k3 q
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
5 `- X- x; ]" ?* c/ d2 k" y: o  N8 b7 W! _1 v- B) K
        // wait send success' }) B8 Y% F. C9 z5 C) D# P! c' }
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); $ G1 y6 b5 Z4 b0 k+ L; z

) a$ o- e4 t( s* I0 O+ L/ ?        // make data node in free list
" G; o, _6 R  C. \        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
- l0 o- g7 ]* O) {4 K        server_msg_send(server, APP_CMD_LOG, "upp send: success");4 s7 Q3 J. _9 q
    }
2 r$ e, t% q2 u! M- \! ~+ E0 ]    return true;
7 ^/ V  D, w( d) o}
$ _8 K" A" |4 B; [& Q( b5 O  I
3 t1 B- v5 Q. |# x9 h) R" H

$ }% m  O% ~: e' y' `' w
1 r5 G1 `$ f& s! N

) `. ^! a& o) I7 p; k  |; P7 }9 ]) V. n/ w# n

作者: human    时间: 2017-4-11 22:03
需要边界对齐
2 V4 N; C! f' `* ?/ e: s! R: W; f6 T[attach]2175[/attach]
1 u: Z2 f/ b6 g




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