嵌入式开发者社区
标题:
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 E
unsigned 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; n
7 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 l
5 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