嵌入式开发者社区
标题:
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: m
1、看了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- R
unsigned 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% n
7 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_busy
2 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