嵌入式开发者社区

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

作者: liangws    时间: 2017-4-11 14:43
标题: 138 Upp问题咨询
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ' C3 }9 E- K+ u1 ^. B% y
! I2 U( {' Y  _" P
问题描述:
  e! E% Y# @: y0 [在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
1 `6 B3 z: @8 X[attach]2174[/attach]2 `1 D+ q" L8 \" r
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
. N" i6 \, p0 b" l5 |0 h$ U7 e, D6 n+ O
测试结果如下:8 U5 j0 w* d! W/ i- Y  A) M+ a
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?: C9 F8 M) E: B  J- c0 R4 i

+ z. X/ F3 b( k3 x* @8 B. Z
% {; Q& S1 \7 d: v: J* y备注:
. z8 S" u* O, V1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?6 F* A# `' s9 Y/ C" w6 ~4 E% B
2、相关代码如下:
/ k  d. N& c- X4 j//UPP DMA缓冲大小512字节8 a1 r) X" x& x2 Q' z4 D
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
4 |- p0 x. V* w- D#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT+ `3 ~2 b/ |3 k" S% f
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)3 a  |. @. V* r9 t

% Q& k' N9 z. C% [& \. p- ^! p0 t: j% E% U1 i+ H
//upp接收、发送buffer
: U6 C* k* S& X( F#pragma DATA_ALIGN(upp_buffer_a, 8)0 M. s/ N$ u3 a4 p( q; b6 N
#pragma DATA_ALIGN(upp_buffer_b, 8)
' K+ H. Y3 `+ ^* k: U& k# N9 |" C; Y% W" L
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];" B* ]7 ?" N3 N  l7 A: F
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];9 d* _9 L# J( G
- c: |7 c: p+ b( q3 w4 c$ J: ?- I' K
( d/ W- ^6 X& ]$ c2 w
static bool server_upp_data_recv(Server *server) 7 A" j! v$ j6 H. L9 q* t5 ]5 x: [
{
# n, _) o- I+ g    if(server->upp_channel_a_recv == false) {
$ d& ?4 j5 q4 D; v6 C2 G% t        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
* w5 v$ b' p+ y9 F        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {& k, _! Q( M2 \7 s  n7 f
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
+ o% {/ C8 Z5 S4 @& F8 A
# Y$ P2 C2 @* y, N5 G$ C1 [( T) C. v4 O1 x7 P- ]
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
# I; m% U/ K/ H/ }* j5 r8 C- N2 y* t4 F5 x' b* D& V0 Q
            server->upp_channel_a_recv = true;//8 I3 u  w8 X3 T! F/ D6 x" C  r
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
2 u$ d  r6 t4 V! W/ M5 {; ]/ \: z6 Y0 k            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
9 m4 P0 Y& l/ m, M  C/ V8 m            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
! v9 D5 n: i$ [" T            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
7 M% Q) u$ `) f) V$ H1 Q: X! _) G; z. ?1 Y
            upp_error_count = 0;
. |. s$ w; A* Z* r- I            upp_dmai_int_cut = 0;
5 Z9 }5 F! d& C% o- u+ E* h" r7 K( B( E  e
            // fill in data
3 s% z: z1 O7 a4 A& n# ]            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);2 |* l8 x7 ^7 r% m9 g
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");; r( Z4 x, t, _/ ^. C( \
        }
: O$ N1 U$ P2 o% m/ u. f3 q0 ^& T    }! \3 E# U7 r2 G5 {, d$ d
    else{5 B2 J$ M5 Y) Q' A9 Y! I
        if (upp_dmai_int_cut > 0){, M, T# B& N/ S. o; G+ `
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
1 s: |$ _0 N- }6 k, e- Q% n            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
% k4 d" R# v* Z( T; g: r. B! t- j; h( q6 G4 `
0 C6 C! V8 F& l! [9 \
            //copy data to upp_recv_list_busy4 X/ \  C- E5 F3 O# y
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);: D, @9 a: n7 T# h; p8 o) \
+ V1 e, v. X) c- T6 U& t2 ~. d6 `' l
            //
+ H( ^1 I( G2 P5 x! R0 [# b" s# z            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);. W- p$ O+ b+ f/ G  q' o
4 d1 c) U& g6 l  i, }) Q
            //
, f+ f: M' k% z% v            server->upp_channel_a_recv = false;//
( D8 S3 z$ d/ L" u  i! K4 F7 H% [, y9 i" m& R8 r2 ~
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");" ~: F$ |3 k* M- I
        }3 f9 z; V1 ?9 Y& m% {1 k
    }% A1 V0 O, r. M- \) c# p3 c
$ n, @: p. ^1 |9 T/ f
* h- D& s1 W) F9 w" A2 ^) I6 v5 q
    return true;( g- n$ E. v3 Z! x* e
}
, P4 m* b* x7 m
: L; w  p, P: n0 c+ Tstatic bool server_upp_data_send(Server *server)
  @4 L  A) A# `+ p2 S9 S9 x  b{
4 `/ |6 V% B8 n% p" y' q4 t    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
0 m$ Z+ X& W& `! g) I* U3 w        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);1 W$ b% s$ w, D  g  B8 p, z
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);$ p9 b+ Y0 U8 a) F$ R8 P+ J4 Z
        char tmp[128] ={0};
/ L2 u* C" I+ _7 z5 p+ s4 ?3 m6 m$ o! g$ j" a0 ?2 V' T
        server_msg_send(server, APP_CMD_LOG, "upp send: start");) V2 l8 A" L+ o5 n4 k) \0 \) I7 l7 v
        print_log(server, data, 64);) _* \8 @' n, b
% C3 l6 b; i* P5 J7 X6 n0 M
        //
* L3 \  ^& Z- ^+ t5 {        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);# H0 D* U5 {' `2 R" V
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);) l6 J6 `2 ^! N% x! K7 i; E& s
        print_log(server, upp_buffer_b, 64);! \: ?6 ?0 o' `6 v+ I

& x- e2 w% s6 w& n, o+ U; O        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
- z; I6 m4 e* [8 Q  u, L        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ; v) V1 }. z' B9 X, }+ h3 k
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;. c3 _% h$ _! g4 R
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;2 E- Q% U7 I, p
5 P7 d$ f% t5 C2 K, H! D  m
        memset(tmp, 0, sizeof(tmp));, s& {6 b5 l$ J4 Q& r) h
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ) w+ ~. d- I0 I+ Y* l: Y
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);& O! U$ e; b% k/ A. R9 Y
        server_msg_send(server, APP_CMD_LOG, tmp);
/ M$ v. V1 n. o9 w1 f/ F/ s( l! B; I1 V; D' k, {: `8 ^& t
        upp_error_count = 0;7 b/ n3 `' f% x* i/ V% r& e: t
        upp_dmaq_int_cut = 0;
& l& b5 i; t% M* e6 F, [        // fill in data * Q3 {8 X0 w0 [& X
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
' B. ^3 w8 p; r9 s+ z& ]& U        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");3 {0 y! @+ D% \& I  t+ j; W

' J' t, f5 x# w9 n        // wait send success! g# {. h1 e* D6 E% n0 O% }
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); / M9 @' g. u; ^8 j, r$ N2 F( w! n

' j# T6 k0 D7 ~) R" O" {4 H        // make data node in free list
6 W% W% u  C- P2 R# K# Y        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);' P0 f" e; W2 c, C% T
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
  R% B! Q" `5 d7 B( Y. L& M7 h( j    }9 q6 ?! n" ~' ^
    return true;6 [( g1 b$ U7 v. {" ]; T, W( ~
}& D+ t3 L0 a% K# I

0 U% M% ?- N6 R

! k  t4 j  A: @, R) H+ s- R. ~$ H- E- o6 {2 R9 Y# a0 H0 s

4 M) r( l4 g! B1 q" `
4 N: S7 E  u# u2 J2 H4 }- f  r/ I9 a
作者: human    时间: 2017-4-11 22:03
需要边界对齐- a1 ?  S$ x7 [* K9 Z4 e$ R. |
[attach]2175[/attach]" F3 P/ p8 b9 b- T! }6 l) U7 v0 t/ A





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