嵌入式开发者社区

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

作者: liangws    时间: 2017-4-11 14:43
标题: 138 Upp问题咨询
本帖最后由 liangws 于 2017-4-11 17:00 编辑
/ }' Y. J, F1 X
2 l5 T# h4 _( ?/ k+ u5 U- U$ z% J问题描述:
! ]% M6 o3 u9 C: W/ X9 P4 H8 I$ y在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
# S7 x% R' {1 K- {, u& z- T/ z[attach]2174[/attach]
% F, P- ~8 a. L+ }# G: T图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。/ X' S2 x! V: A, n/ |

% J" u: l' ^, W7 y7 x测试结果如下:- c8 l, C' {) [6 C$ }7 g
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
+ q" E( Z5 o5 J+ U: T& i/ A2 h
6 V' g6 j4 K( @, N, g5 {
" h$ O: L5 v/ |备注:. v  G9 p- t( o# B1 \
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?0 \! k  d  J. t, U+ |3 F. n7 Q
2、相关代码如下:
/ I; f2 Z$ L7 R0 A//UPP DMA缓冲大小512字节, ?" y+ |/ M' E1 N
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
: p3 c, i" q8 O9 n, J#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT" ~- F+ W8 G: Z
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)9 ~' p7 c$ E* F" w: G  b
4 y( B6 F4 u; B4 o+ {+ m
4 r) a1 d& ?) J2 b5 M) g. s1 @5 E
//upp接收、发送buffer' z, T3 c/ Y) P/ f* n
#pragma DATA_ALIGN(upp_buffer_a, 8)' ]9 O( [) |( X0 o; \, |
#pragma DATA_ALIGN(upp_buffer_b, 8)
( E/ B0 c8 [  Z0 R/ I1 j' O7 m5 T
* ]) t6 f+ p; l5 u$ \( q7 Eunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];6 _# u8 U# n. g1 W
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];% p9 q+ h3 |# z# C& C8 d9 O

2 c4 p* p' B# d$ N' @3 i6 `& B) K( b  {. Q6 K+ v/ P+ k
static bool server_upp_data_recv(Server *server) 0 `4 Y( s7 K! k/ p$ [9 B7 E, K& r5 z
{' z% o6 h4 f+ M4 P/ @, S
    if(server->upp_channel_a_recv == false) {
$ H+ t# Y8 v5 P5 \+ a/ K& `        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
* m/ p( P, W' F. W9 e        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {$ n" U" w  U# A
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
# M! a& M" f/ z. Q/ o/ w  d* @( E
0 V* ~! _+ ~5 T
9 }$ Z. L0 E* e            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);8 N9 I7 q6 z- l; l& h. t7 g
) p+ @6 p2 n1 W3 }) F- Y7 X# {
            server->upp_channel_a_recv = true;//2 }$ A" J0 X  i: E2 @1 N* x
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
0 D% S5 f! m& _$ _* @; m            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;' C  b$ y3 H/ L7 b- Z
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;. D: ^. o0 N& M, U
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//+ z8 A4 e# ]/ F) s1 d5 E: c) l

3 a# H, ]2 Y% r$ u            upp_error_count = 0;5 F& @. W7 [3 F' U  @) _& p
            upp_dmai_int_cut = 0;" @$ D% g1 m* j

7 S. S0 M  X6 @            // fill in data - y2 j9 t' t8 V% I8 H8 Q4 p
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);- u& c9 U9 v/ P) A3 i4 A5 T- M8 q
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
  s# |& v4 ?" J, `        }* y! s$ Q9 H7 w/ H' [) R# t( V5 ~7 u
    }
) w; Z; ?5 M1 `- w    else{" p% ~8 ?  O! I9 W% G$ f
        if (upp_dmai_int_cut > 0){
5 q$ z! m, u* a; V6 ?            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
$ V% m" w7 f* Y# B            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
1 |& J7 w: J' {; l
1 x. `* h  z1 V" d% z8 v( p
' ^: X: k* ^+ \& m  h; B9 e            //copy data to upp_recv_list_busy: x6 Q# q- ]% v% @' p* L
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);1 i8 D' B/ g' D' r
# g6 }9 X# b( [# d! q9 J
            //
" o8 I" F9 u3 h4 v4 T            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
# J6 M6 o. i( r; n7 W) E4 K- Y. B1 s/ W/ W5 a
            //
) p# e4 W& o9 J2 ]  N            server->upp_channel_a_recv = false;//- N$ b1 \( o+ V2 W; z. o' P, a

; J# ~' a  e7 r$ o' j1 j) J9 L1 ?6 M            server_msg_send(server, APP_CMD_LOG, "upp recv: success");8 \$ z# b" U0 {$ d7 Y" h
        }# q' Z! d8 d! H+ Z: T
    }0 V" v# \+ F: O$ V9 X8 A2 o( `% `
8 s- E2 I. h( j# {7 B

8 {0 [" L' C- C) `. h0 h9 r    return true;
1 t8 W. x$ y" p2 @: g. q}; b' F* _' p7 o9 \& d% |8 }

9 f" c; z" P  c& s' ]$ ^static bool server_upp_data_send(Server *server); g! w! s) b$ u7 N- L3 E2 ]% G5 v. D
{3 V; W6 I9 R9 E8 h! @$ f( T
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){; e( F1 k8 c' K  D4 e/ u
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);2 ~8 ^, L. b  J) M0 E5 a4 O
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);& y# G  D/ D2 Q" u
        char tmp[128] ={0};( B: J- y) v: N# p
9 J7 k& m. E% Q8 c
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
6 J  Z% d/ [8 x- }0 c! `1 G: W4 c        print_log(server, data, 64);
0 n* y' v) G7 A  @. t( f5 O( E- p% m6 D; Z) ?4 [* Q% |1 Y- k' G' |
        //6 L/ }; [& c7 }# s% q$ X6 H+ p/ ^
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);+ M- c  l! ^$ C$ d8 p; T7 O& z
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);) N) g# u- K" m" r8 d8 e8 r- Z; W
        print_log(server, upp_buffer_b, 64);* H) Q+ x( L% j0 Y& R' f9 o

9 F( U: b! j- _- ?5 h" {0 H( j# A        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);1 n  v+ c% X* h# g
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
" F  C$ i8 ~7 [! a# Q        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;6 \- Z+ w' r' R( @9 ~3 ^
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
5 Q6 o) y/ G1 f, F; s- V" H: j: P. n) k2 G! S2 h" I; r! X4 @
        memset(tmp, 0, sizeof(tmp));% U: I- M+ }3 O8 V8 @9 |- |) i
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ) Y3 E: j1 U# e+ F- q  g3 T
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);, s" ^- C: T( k4 v) {3 b) O
        server_msg_send(server, APP_CMD_LOG, tmp);
5 P7 H1 O+ T0 ]3 \) ]9 Q& }% Y; s0 a0 @+ r
        upp_error_count = 0;
9 t, t$ v5 f% c+ F, x9 X: d        upp_dmaq_int_cut = 0;* K6 q$ p! R3 h: }9 r$ M
        // fill in data / c6 N. Q/ s7 t  w
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
' e6 [8 F  {2 I) N& x5 W* u: S        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");. @, G- H+ B1 @8 P
1 M! \$ H1 B+ b2 g8 H2 O! F
        // wait send success; u6 q) F" D( P7 K$ e9 S- D) t
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 0 n* z6 V  s8 T/ }- ?7 |" B+ C
3 V8 h* O. b* Z' A# I6 G! }* ~
        // make data node in free list
) D* v( l5 A: u# a$ e: H        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
( A9 i1 m; e9 S8 {        server_msg_send(server, APP_CMD_LOG, "upp send: success");0 i; s3 f6 C* v! U2 ~$ k
    }; R# Y7 q2 Z- H
    return true;
, Z# T# Y5 G9 [# F}
5 m8 e) v2 n  v4 ]2 f9 X! k  Z4 |% v/ q9 @' f

3 Y; \; ?! d9 l5 n* c2 i  ]2 U; Y5 j* G5 m
2 ]. Y6 G* d$ b  a) j: ^" \! u

2 e! h" K2 x3 ]5 O+ c. }# B/ w
作者: human    时间: 2017-4-11 22:03
需要边界对齐
. c6 k( m6 A) M, B2 O; D[attach]2175[/attach]
3 t3 l5 ]! d" l, v& q; P- ~




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