嵌入式开发者社区

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

作者: liangws    时间: 2017-4-11 14:43
标题: 138 Upp问题咨询
本帖最后由 liangws 于 2017-4-11 17:00 编辑 1 A# R+ V4 p# |# u; V. L
: B/ J* z4 c/ P1 U  g% Z
问题描述:
  x5 }8 Y6 O$ Z+ W) c在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:8 H: L; y# z, Z
[attach]2174[/attach]9 T+ k9 X3 Q5 V7 N5 n. e2 ]
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。! H: H. m+ q4 T. e
3 G; S% a) k; F: h: f: o: e4 i
测试结果如下:8 E  @9 J. H! J4 A
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?% O* u6 \0 I- J- R0 s9 U
" c8 p# Z( Q; C. p5 u( O/ S
. D  \; m% L& d+ `  x# f$ I- u* B
备注:
4 ~! m3 Y+ O2 B4 n1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
, ]7 L+ I! A7 A; T4 n
2、相关代码如下:5 L7 V+ ?6 z# g  `1 Q4 Z
//UPP DMA缓冲大小512字节' e( @8 Q$ q7 H
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍4 ~9 e* b  ]' g  y: t( k6 }  r
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT4 \" c1 x: u9 J
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)/ }) b3 I0 V. h4 B" f; A
7 g. c+ B1 I9 r

1 f) o3 d' S; [% V+ K/ M" |/ N* N//upp接收、发送buffer: C& `7 @# H$ M7 f, w% N
#pragma DATA_ALIGN(upp_buffer_a, 8)
9 Q: c9 g. \5 J) F  ^5 Y4 L3 s#pragma DATA_ALIGN(upp_buffer_b, 8)
) x, t. ?) P, B/ v& _! e, W
4 ?& W+ Y0 \$ F- s5 m# \( Q- yunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];; S) c7 I& C$ b7 J, q
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];1 v* c& X1 [, f% B4 q* a# \
0 f% L3 G2 v9 Q7 h; y! r. H
% m1 q6 H/ m9 p& b
static bool server_upp_data_recv(Server *server) 8 T; D* l* @8 e6 S2 V9 Y- M
{% s6 R: A) R' L# a* u
    if(server->upp_channel_a_recv == false) {
' `6 l3 J# s) }/ [        server_msg_send(server, APP_CMD_LOG, "upp recv: start");2 F$ V! Y9 `" V( @+ y
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {$ x: V4 R1 c0 I8 o3 t* y" L  r
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
1 K9 A- G. h: b& e
6 o7 U) z" s3 C' Q( R& B0 m! v7 E3 A/ L7 E5 u5 o  h
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);% d; @2 |3 D: R

4 `+ Z% a( D4 c( P- N( d8 a, h            server->upp_channel_a_recv = true;//% s' q0 r6 M+ F: ^# O
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
8 L1 p. z, R( M. K. O" o: H8 i            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;* X6 T& R% V4 Z1 J
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
- V. i. \" t2 L% m            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
: E$ S$ j# Z2 T  _) V* ]! z: ]! E, e, L6 Q
            upp_error_count = 0;* D' e" ~" F7 L3 e$ V9 Y7 d2 h
            upp_dmai_int_cut = 0;
4 a& i, B* o7 P6 h1 E
" ?4 |# i; \/ o: d: G3 E8 c+ ]: T. R            // fill in data
! t7 m5 E7 F9 r            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
' g$ V+ {" a, M5 p( U- |            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");+ C" ^5 O: S* ~$ k! ^2 z
        }( ?$ u2 g" P0 u5 J& F' T8 l; K
    }; d* b$ o' T9 X, r& `
    else{* `$ ]. a% d0 \& {. v$ V8 g0 Q
        if (upp_dmai_int_cut > 0){! [+ T; l% z2 b. F: H5 c
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);3 t4 C1 _+ B# R0 ?
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);; j: b# B8 i/ A+ s, t# f

/ v! P, t0 M; J! S" [. v2 P9 i
, H9 D8 x" t3 t( c0 g5 o            //copy data to upp_recv_list_busy
: J) E, L, L( L. q, U  B            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
) ]8 A- c. v7 I" y8 s
1 [/ x$ Z+ L0 e. y& s* p            //
% g" `* g/ V; e: u$ X            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
; j1 f7 i, u/ |9 N1 P; C* M3 }8 h+ X( h# l8 j& F
            //2 c. t$ O7 R0 _  x0 B. h; e: w
            server->upp_channel_a_recv = false;//, n, B6 A& f- j- v* f8 U( F
+ B) |  e  N$ A" @( a' `- J7 s0 V, x
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");8 Z0 e3 a# ~. y0 R
        }) U0 V1 y7 ~/ e4 n
    }; ~0 S7 Z4 o8 \$ S

4 r! b$ |9 k0 h" I& V1 n, M$ w0 D5 D- G
    return true;+ Q! m- n2 d3 y) v: P' t* X
}6 Q5 g! v- z* w  {* ]# m: ]8 X
& E" V: V9 x% V; z1 t+ \, A& O
static bool server_upp_data_send(Server *server)
2 m, T+ L- e% g# z9 n{
# X  \& D$ G- N; v8 E( {    if(ListMP_empty(server->upp_send_list_busy) == FALSE){3 I, j! V; n4 ?7 T& K. `
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);4 I) s, T; B$ U
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);( b% G/ V+ Q9 S' i2 b  b
        char tmp[128] ={0};
% L! W1 _* I* H% w/ l4 u6 T3 `+ s6 i2 }# p
        server_msg_send(server, APP_CMD_LOG, "upp send: start");* K6 p* A: Z" _  n
        print_log(server, data, 64);" T% A/ a6 U6 x  |( F
( ?+ D. c. X3 A. u" q" U$ X% @
        //* y; W9 Z& J) b  r" t% g( G
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);. N6 U* b/ g# ^; y, J+ w
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
) I" Z% Y' d# T' c' I9 T        print_log(server, upp_buffer_b, 64);
- v1 ~, c, x8 v% C9 R9 t( `! v) \+ D8 |! {& Q2 J( ?! C6 P& Q9 A
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
1 X6 w; ~, L) i3 w        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; $ O5 n3 u: u1 P1 t2 H9 f- o) r
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;4 ~9 G8 _$ u) Z/ z
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
) g3 r3 E5 {! q+ p! W/ K- E4 Q! \  v- Y
        memset(tmp, 0, sizeof(tmp));$ a& z8 Q/ H9 s+ T  F. R
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 0 z0 V% n* I0 S8 B) f! C; Q8 ]$ I
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);& a) b1 x8 r+ e* a4 x# [" \0 R; r
        server_msg_send(server, APP_CMD_LOG, tmp);
* ?  R9 A* s1 g9 A2 a
3 ?5 i" y5 I2 u3 u1 x$ ~2 ^5 i        upp_error_count = 0;7 C9 S0 U. ]; C$ F4 R3 U
        upp_dmaq_int_cut = 0;
* Y0 d; n& t( Q  [. m6 f        // fill in data
, F! L2 r7 q" w9 N' r; G9 ^        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
4 Q' R$ x* ?2 J! |2 {        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
2 I. `7 I, Z( s8 B
+ J' z9 m0 T; {$ e0 V8 z! c3 [- o        // wait send success. J; G, @( S! s0 ~
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); * Y$ T# T+ i4 ^( l! w! ]

' m( L7 S9 @& W3 i* K: K) U        // make data node in free list 5 \6 t8 v5 T, L- ^8 T% G( `
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);( V3 V/ i0 ?4 g+ T) j1 x6 F
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
) Z8 S+ n% x: y    }( d, L+ k$ I* b; [5 P. u- F
    return true;3 s) R2 `* w% M2 l5 ^, k
}
, o' a8 @3 ]( X5 e; o
/ f: }2 ]  C- b* C. _: r& [2 K, N

$ m( o4 v4 ^4 e7 c$ ?5 W( F
5 s( [; y# j' w

6 W+ l- j5 o$ j. e. f
' S# g8 G( `* j4 d' c/ o
作者: human    时间: 2017-4-11 22:03
需要边界对齐
, E% M8 F+ ?: w3 p# O' I3 D) ^, v# Y[attach]2175[/attach]
0 A0 N! S8 Y" \& E! x




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