嵌入式开发者社区

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

作者: liangws    时间: 2017-4-11 14:43
标题: 138 Upp问题咨询
本帖最后由 liangws 于 2017-4-11 17:00 编辑
- q. `1 H, Z/ Z9 i
9 W4 P/ K- x, w8 N; m* m问题描述:
0 j* C5 f8 z6 b在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:( }4 {8 q5 S9 a
[attach]2174[/attach]2 `( {0 `, ^! J, O6 D! A1 _7 ~
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
) ]. b, S2 n5 z5 H: z% e0 h8 i; L& h, r
测试结果如下:
" Q/ C# p8 S% [+ e138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
6 K. p) G" L0 ?8 }- r9 h# W1 P. @) P4 o4 ?

1 {- O+ K- U. u0 z备注:  ]$ a, J, I8 I( X: }/ o3 @
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?" \0 @( W: R' I
2、相关代码如下:
$ P/ C5 e1 O. m# I0 E8 x6 Y  E' H! `//UPP DMA缓冲大小512字节/ {8 K4 Q% L( E9 E( v
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍' }) K7 [* A- ?% K- ^
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT6 s/ m% p2 U5 S; X
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)" \: H  E7 `3 E( B+ ]5 m
1 D" p* t5 q' E/ z
- ?, y: h# A9 J/ ]2 @2 j% u) M
//upp接收、发送buffer
( k2 f  g% G* j8 Z2 F( O#pragma DATA_ALIGN(upp_buffer_a, 8)# y. Q1 ^! B6 X) M
#pragma DATA_ALIGN(upp_buffer_b, 8)' k2 s# f8 o! s2 |) s8 u
4 [; ~) |1 ^( D$ v  I
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];, n0 a2 y" Z# j* \; c* @
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];# Y+ T/ k" C. W

" h8 n- M+ o1 E3 E* Y* n4 M6 `+ z/ A4 }5 V3 c9 ]7 q; R% C
static bool server_upp_data_recv(Server *server)
3 S. H: l; C& Q9 E5 j! T& l{
, J. x( I+ h  ]: u1 j/ N0 J    if(server->upp_channel_a_recv == false) {& C' p9 W3 s3 m: W& i- }& z  q
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
; ?$ `+ }* i% H        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
# W1 Y: B  U& S            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
6 f2 O  W. `  M, L; D  v/ k! }" ~- b2 w& W% @5 s  C+ h8 Y

' }$ o9 t0 h  A4 p9 w% D6 x! M: f            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);4 J; |/ |8 O' }7 V1 Z2 }
, E  p0 B+ D. ]1 T2 i) i  ~; l
            server->upp_channel_a_recv = true;//3 l/ |5 E& D2 S% U3 N
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);) Z5 A& L" [1 {2 ]) d  K
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
, {- ^* r; M: v5 H' [            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
; ~# B( D- N9 s- T0 e6 \6 I# I            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
5 q1 Q  @; a# i! _$ s
0 Z8 L# k4 c! L7 U            upp_error_count = 0;9 p& @' L( ]6 \( O
            upp_dmai_int_cut = 0;
9 P$ c. t9 w* I3 ^5 h9 ?" E* S
            // fill in data 0 @/ b9 [. d# k  t
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);: O' b3 }" {9 s" k1 b6 v  X
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
1 q9 m" h2 B7 O7 N7 G        }. ?6 J/ ]; R' _. w  W1 R
    }
* ~, ^9 M4 N2 B+ L- A+ z2 n    else{
2 B$ I! R) i- \; _! O- \        if (upp_dmai_int_cut > 0){5 \6 u2 D( k" {4 E
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);& N4 L9 D3 y2 i
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
1 h) J. r+ }/ Q  _) X
& r) j. z4 ?1 k" o
- \* j/ M5 F0 R9 F5 l' t4 j' `! Q            //copy data to upp_recv_list_busy
5 Z; Q9 K2 G- ^/ x            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
6 {1 Z( {1 b6 T" R7 R& u0 }
" t9 D, J# \5 t- a$ B            //, s) d$ {* H' C
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
# i6 g4 r0 Y# \$ d4 Q0 m4 K7 `& M; P: y1 V" Z
            //& r4 I' M: E9 l! B4 ?0 |: x
            server->upp_channel_a_recv = false;//; D3 U3 T) ~7 D, x# h( O1 ^

5 Z7 Y: [# ?6 i            server_msg_send(server, APP_CMD_LOG, "upp recv: success");  D; I: n% z) `  `8 v
        }+ @. u# S6 K6 n
    }
5 j; Z0 Y- z/ }# C
5 S* }3 G( f# W0 p3 ^
  j' {! Z0 V. R) Y    return true;
* V  J7 `+ c9 C- }1 H}  _( b/ r3 r, O  c& }
, ]6 c: Y3 f6 Q; `( z
static bool server_upp_data_send(Server *server)# e( |2 m2 d" R% m# u) p0 B" i
{/ o8 ~3 x- D; E- O$ [, }; C/ }
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){' ~* J3 v& ^6 j! p
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);1 ]; P' O7 Q! j: j2 n
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);/ e" ^2 k( a7 I! W
        char tmp[128] ={0};& N/ e6 ~) X1 a+ z
/ R$ d, X6 w" e# @
        server_msg_send(server, APP_CMD_LOG, "upp send: start");  [7 a$ j8 b' w& C
        print_log(server, data, 64);
5 h* F, t! ^" L' ~7 U0 h) x5 R1 e
  f5 s2 w+ ~! t- _1 `+ [1 o        //
( o% ?, w5 O7 n1 t        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);- J4 F  B# g8 F/ H
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
( p$ U& K: R# u) i. o$ p        print_log(server, upp_buffer_b, 64);
) @3 f# g% ^, z1 l1 C& t9 [
5 Y) Q9 z1 T5 g; r6 ]# g. x        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);" K  o6 P% V" i0 ]. I! j# ^; l
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; / G3 e, j6 v3 ?
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;. N7 d, b7 l3 Q. Y& D" M" n
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;5 A# \7 x4 ~: E, Q

6 B7 u" J- [' _" `' K. J$ V* F* K        memset(tmp, 0, sizeof(tmp));9 b5 L! L4 ^* x  x) B5 j! j7 M
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
$ g/ P5 @1 o) R, j            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
: ]  v$ [- F: {# ~2 h" _        server_msg_send(server, APP_CMD_LOG, tmp);
' |; ^0 @! z7 y' p$ k6 _
) Z# `7 C: B3 l2 e1 N; @/ j- `6 r- l6 o        upp_error_count = 0;% u* Q" x( Z9 O- g
        upp_dmaq_int_cut = 0;( |9 V0 m7 F1 O, A* e, u
        // fill in data ! P% I' ^- I  l5 D# j
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
3 b6 Y$ g9 `4 g( N. l# D        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
- S* v9 g% @9 t; S2 `
/ d& Z: t; m9 `! j' l! Z        // wait send success
, \: B+ W: Q" Q" q        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); $ B* b2 L+ p. `( Q3 ?2 E  L* I4 R
9 m5 m) n3 p: g7 ]
        // make data node in free list
& e( s6 l6 d7 N! H6 ^& p7 `        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
# a6 n; t' Q5 A2 i        server_msg_send(server, APP_CMD_LOG, "upp send: success");  c" E. h8 d, K4 l5 _3 A8 v& @
    }* m( P& b% ]8 Y' [' p" y
    return true;! ]+ {0 z1 R6 F! m$ ]8 I' A
}
, c. t% O8 }9 q" @* C8 l0 y% f. k# Y) M7 S" V6 @7 Z; x, G4 b+ I
) O- C7 E% }6 D8 \2 D! Q

; y+ h0 ?. e( p  A- ]
( F& L& }! S; j; p- j
2 X8 R( v4 H' w4 _9 L3 M3 g

作者: human    时间: 2017-4-11 22:03
需要边界对齐: V1 d5 U( n& l  K' @0 q
[attach]2175[/attach]3 T) l1 }4 p' c4 j+ X( _





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