|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ! K8 O9 m* A- P/ i1 b3 L$ F
$ r* c* R, {( U y问题描述:
' w" Y% l Q3 N$ G7 y在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
2 u5 V5 ~/ f% P1 u8 w% r7 w
* ?0 Z2 E+ y, E4 @" E图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
* A1 w- |( Q# E7 |) z/ p4 V- ^" o
% g1 d; U! M2 Q) D) @1 h测试结果如下:
; D# @# p7 c% z6 s5 B& a; v138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
! z. U' S+ Y' ?
4 Y! ?; e" T. ]
1 ? r+ x7 `7 f) a) t备注:0 o3 Z/ O$ i' j3 s* r
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?4 N V! \% M1 R. _
2、相关代码如下:- V: o c" W- [3 t
//UPP DMA缓冲大小512字节
9 p. k+ z/ d) J; n4 i; |#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
1 p6 l% t% t! N#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT( y9 D1 w) E! U2 s U5 g
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
2 T# ]) f& D8 q, U; e$ ~) b. U8 |; X; l* i0 F- }! ^3 [( n, ^
% k' q( @' K" ]6 o: x) Q
//upp接收、发送buffer
( b/ ? }4 i3 e( c' G# b#pragma DATA_ALIGN(upp_buffer_a, 8)
8 Z' k! m+ I2 [- y4 s; }% F$ J#pragma DATA_ALIGN(upp_buffer_b, 8)
1 ] z- G) t! [
% k: k- j/ `: L6 {! q2 yunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];" E. _8 x% K: y ~
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];, O7 ~1 F9 j1 p; N: m
7 @' t8 x- u' H+ m! p/ I
; p; x: G- {& i3 K7 q Tstatic bool server_upp_data_recv(Server *server)
5 @9 f# k( @+ t4 v+ M/ j4 z{
0 Z8 U" x1 j' a( e A& Z( o if(server->upp_channel_a_recv == false) {4 N4 L0 N7 i5 ^! t; B. m
server_msg_send(server, APP_CMD_LOG, "upp recv: start");) H9 B+ @! q% v6 _4 n# _0 M& x! c
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {' u* P3 _* M0 J5 F) s( q
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
" l6 A% ?( j" t# f. }* N9 B
. A8 c. o0 A* N: ?+ C8 y* \; [0 E3 a" p
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);: |% X4 f; j! ]7 `$ r" W2 h
- [. Q1 @, \2 l; y
server->upp_channel_a_recv = true;//
8 b2 C" }+ v/ {+ | server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
0 }9 R: \" |, p- D server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;( i2 _" S7 Z6 r' o2 ]
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;7 N5 T* ^' a8 V; g1 l8 d# y, k
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
4 J1 I N a" }( e% Z' C: B2 H2 L5 L9 q9 ]
upp_error_count = 0;9 v' h3 \0 g R* b3 o7 X4 E# M
upp_dmai_int_cut = 0;
) r9 U' j! n$ ~, p0 S& q3 R& }( o, C, l/ H
// fill in data . M9 d; g5 i8 o6 V; @! M
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);1 N F' T. M2 l( W
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");. q' @3 ~& F Z/ z9 m0 D Q. l/ v
}
7 o5 [1 N- V8 s t2 D$ c& a }
4 O7 c l' ?3 x" ^* Z7 Z q$ x else{
/ j& L; S: B3 [5 U if (upp_dmai_int_cut > 0){
% D- |# {9 a) ~: c" ]7 M3 e7 I DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
* e8 \" x) w# F Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);7 U, w' J/ L% o0 n' m/ W
& r5 j' U) B1 F$ u
1 E( S# t/ F" M' f( W* \
//copy data to upp_recv_list_busy
' K7 N5 {% t! h memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
/ G% q6 s" I g
+ r _' o) R; ^, E //
- X$ L+ U4 U; y9 _* K9 f0 u ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);7 B1 x" e6 S+ B0 Q5 i# W8 F B
' |3 ]2 u/ E2 B/ @, w* v1 {- {& ^
//6 J6 G+ @ h, v+ h$ J
server->upp_channel_a_recv = false;//
- L; S& T d( k# y2 h0 `/ c& @1 Z! z6 W8 q6 O0 j6 G" X3 Z* Q9 k C
server_msg_send(server, APP_CMD_LOG, "upp recv: success");6 _1 B3 \* L0 f
}
7 c6 G% O% }$ `# K }( h. l; T3 U- `
. o( a3 o4 p1 n4 h# [, g+ D2 H* s8 B$ w. ^3 ?. k% W
return true;
9 @' v, `$ d C/ e \4 Y: W7 k}
7 Z7 T" c* P+ J+ Q6 L% Y4 h* }+ o0 N! W; O4 ~4 \
static bool server_upp_data_send(Server *server)
" g1 t6 E% x0 Y{+ ]+ L6 q5 _# {3 b
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
! p5 @& B) Y5 t& w DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
( d$ |$ d0 }9 _+ O! y/ c unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);% K! a% t+ I% ]0 @9 t* D: ]
char tmp[128] ={0};
% r6 |8 m9 F% j
. P6 D2 Q% a7 j: K r server_msg_send(server, APP_CMD_LOG, "upp send: start");+ v( g+ w) a& a6 P* p7 _
print_log(server, data, 64); r! u9 {3 ~0 d4 q' P
+ q* i4 ^2 m1 m0 k6 I" `
//
6 X: B% r6 e" Z/ X memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);1 `4 t. f2 v1 f' z" D. E
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);# [/ L2 [# N( [0 `: `
print_log(server, upp_buffer_b, 64);- d' p* K6 T# _
# Z3 H; Z. a9 n) P6 t- B* E server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
$ ?$ ?( Y2 b. W6 ^* ^) w server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
: I. }& U; W5 o/ A" X server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;! R( N, \4 O. Z4 t2 F
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;& d7 L+ G% t+ F$ X2 C
9 h! K2 T5 f$ j5 u: q* }: k
memset(tmp, 0, sizeof(tmp));
- i' m. \+ L* U* G% l7 c! S sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
) q) { W: h& n( u! a8 v sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
! A; {% L; n% l9 G, g& ^ server_msg_send(server, APP_CMD_LOG, tmp);* r9 l5 d6 @* d g/ m/ m7 h
8 q# C8 o0 L; {5 @0 W6 ^ upp_error_count = 0;
$ z, k- R2 W& n/ E upp_dmaq_int_cut = 0;
* n- a( Z7 h- L3 w$ f // fill in data . ^7 m4 \3 s$ t: y: l2 `
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); # i0 o+ I, L; b
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
' Z3 P. Y& ]3 V9 `- x
* b5 S- A2 U6 @) S // wait send success, {% X; u& [ O) p, S+ G
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
* b: v0 p4 t* P6 ~5 A B0 w
$ z5 y: I/ _! ^' k) k7 m // make data node in free list
9 {7 a& U0 ?# N8 p: H ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);7 w/ E: e M2 V- t# j3 d! q
server_msg_send(server, APP_CMD_LOG, "upp send: success"); L$ @! T- A6 K) j6 ^* u2 _. M" M
}
7 k z' N& M' b1 ]2 e0 H return true;
6 j3 D& X, q1 z# e- b}3 }4 c4 W# t0 c' \
; D; q' N; B+ h5 J. ]8 F
: R) @* r- H3 X6 x" B' f# c O- S1 G# t2 x' F( M
+ S6 F$ y- F& t3 h
7 W, A" U" J [, W+ T |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|