|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 8 Z; `1 j+ _7 R- t8 C r
9 Z* T0 \# P5 L& Q2 q
问题描述:
% \& P* h. {0 w5 c/ f+ J在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
0 L* g( K* s% s# b7 L# N3 T
# H* q' h% X: u4 K% z+ `图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。3 l H2 x0 y9 ^; E
' ?4 W- H/ X9 F6 r2 ]* C测试结果如下:/ b& F' q- ?9 o$ ^* ]% t8 `9 j
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
" G; e |) ?& k; g! x" r- M% v' @' B$ S" b; q2 S: i
) i" o1 ^! K- U- t; G) ^备注:
2 T- A* B: j( M& C% C2 V# h [1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
/ {7 E. ~+ s6 S/ e0 w% [$ k9 ?$ p" G' B2、相关代码如下:5 S' X: _: o" f5 C% i8 y
//UPP DMA缓冲大小512字节9 A' w. v7 Q k
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍3 q. r5 R! i8 K
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT: r( t/ {4 ?; }4 r1 }( c% a2 L
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)- U1 V8 H$ `9 k+ f6 v- Z& q9 V
! f, W. w4 m) H2 Q+ b- t3 Q
2 ~0 n0 O' Z! z' C* N
//upp接收、发送buffer. E L$ P/ i0 q/ c' x Z4 V( ]& i! j9 N
#pragma DATA_ALIGN(upp_buffer_a, 8)
2 ?* c9 s9 W7 U4 A, e#pragma DATA_ALIGN(upp_buffer_b, 8)
* X, [- p& {: W3 J6 |
, C# }: F% ~8 K) wunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
7 Y% J0 E/ a- j' m) R0 junsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];( p1 [/ m1 g5 S: K# }
* T1 x+ R# i) m4 I# Y' ^$ J
0 j0 Z: E5 d3 h0 c9 z/ }7 t" M# Q
static bool server_upp_data_recv(Server *server)
' ^8 W3 h4 g$ z7 ]$ X{7 Y p; g& ~4 x N$ k/ V
if(server->upp_channel_a_recv == false) { b7 y! E3 l0 {- j! g. J7 N
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
4 ^2 S3 s# F7 b4 ]4 b8 P if(ListMP_empty(server->upp_recv_list_free) == FALSE) {4 o" d0 o6 K6 r, j" L" m) o
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
( l7 q7 n% c k& i8 p$ k2 P" a+ I% _0 l4 Z' p
8 K8 Z. u+ i) Y) `. T1 e
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
$ U+ M5 b( _$ a' H4 B& P) s. x9 U$ k, Z- Y. J4 ]! p
server->upp_channel_a_recv = true;//
& E4 t2 C; u( l server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
# p! a6 U- E7 [: y5 V- l server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;3 U N3 s: m- h( [' U
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
% o; _! t0 B7 ~ server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
- c$ G( B, C, i0 X, A" Y
& H( o) |# `7 w4 N; W upp_error_count = 0;
) Q, ]1 a$ O' N f T, z3 ]& N upp_dmai_int_cut = 0;
4 G" t7 z, ?/ N# {8 f* f1 }( s7 N
// fill in data 2 K$ N! T' Y$ {6 M: Q. q$ @
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);! }' @4 R: T2 s v/ |% P
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
, `% F$ ]/ b7 L }0 r6 I! j' ]$ |; ?
}
% e1 A% }# R9 } else{
, e/ Z) W K. [' B$ a3 p if (upp_dmai_int_cut > 0){2 F+ r! I% P1 f) Y: l8 F
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);, j- w6 z6 b' h. k4 S5 M7 y
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
9 F& `1 m |) a) h4 ?5 G8 Q* q1 [& B* u4 V2 o! v. G
5 H' n Y8 T3 Z: C0 E //copy data to upp_recv_list_busy
, o2 T4 L2 M0 S! b% b" b4 |$ v q memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);7 n: S; R) J! k9 g# X/ z* K
" c0 _1 f+ H. ^$ Q% |
//
o6 {( p9 b) }' I ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);" d6 X! W8 ~: Q" ` I
( _# D7 {0 M# t7 [
/// c9 [# Q' d( N& x: Y
server->upp_channel_a_recv = false;//
& M3 G/ S9 i8 T N! o: E& j E7 ^4 H
7 D6 x, o& s% _5 M( S server_msg_send(server, APP_CMD_LOG, "upp recv: success");
" ~ F% X7 I0 q. ~# k% F4 _ }
3 G2 {$ g7 c2 b2 M* p! }- k, U }
* {: z& M5 }7 e6 q5 n7 C) r- z
8 t! g! l" x4 h3 L1 Q6 ]1 X8 E$ c2 i ~2 S: V; K$ h
return true;! w$ n5 m* W8 u$ E1 { \
}. M& o; r" g+ o! K; }1 w. p7 @" P" R* q
& }' j! O9 v, k$ `. ?
static bool server_upp_data_send(Server *server)9 x1 L" T. b" L/ u4 t {3 a
{' A( o, k! ?: \% ~* v8 e
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
3 ?- @2 h/ G2 b) ~& I DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);/ \5 P8 ?% B, [9 }
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);0 ^0 |: e j6 E w
char tmp[128] ={0};$ a- D7 W! O- c! w- R% t; z% F: V( I/ o
?5 {( ]8 K, o v/ r. G server_msg_send(server, APP_CMD_LOG, "upp send: start");
0 C& H. t5 g9 o print_log(server, data, 64);# M/ l8 x# s* U+ z( L, A/ T( o7 |
$ c$ W& @' H2 {+ E
//' ?+ R. Y6 C3 b( {1 B+ E4 S {+ g
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);; X# f' k; F" F
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);0 {7 h9 l9 Y1 A3 h6 e; p
print_log(server, upp_buffer_b, 64);. G& F- W3 U i/ V
, g7 h/ k4 r8 X5 a4 C2 S: L2 L( F# G
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);3 ~" r2 m* O1 s K/ q
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
0 t* E: ^* y7 w6 L" {5 W; X9 P! n server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
. U8 k( N- O# k7 a* p9 P* A server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
9 g- q% Y& v2 M0 X6 X& B( v: @' K" R
memset(tmp, 0, sizeof(tmp));
$ Z; }9 G6 I( [2 A sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
3 ^& C- l% |7 i: E: u sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
- a$ H% e! I- B server_msg_send(server, APP_CMD_LOG, tmp);
0 e" b! Y, z$ L0 K1 D1 i$ E0 V
upp_error_count = 0;* r1 j( A" {4 a& b$ `
upp_dmaq_int_cut = 0;
1 S% T ?+ f4 N$ A: d- F, K // fill in data & w+ U! J) ]7 W/ ^% }, I
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 9 p- ~6 s' ?" C3 `. E/ q) l
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
0 p* u/ V% h0 O9 a. [! k/ z( \9 w, f: J1 P' u" C8 z
// wait send success2 i9 j/ d+ X9 @( l" \5 N& y. X
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
+ m, M- T9 p8 b+ M
% E! g2 z0 G7 R. {. e# f // make data node in free list 2 ~4 X+ x! }* U, y3 _! }
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
( ^8 {' I( p) r' h& S7 @) y server_msg_send(server, APP_CMD_LOG, "upp send: success");
5 f8 Q! i/ M5 |7 E0 U$ h1 A$ {; @8 P }
) p6 c. |4 l0 ~( W8 p return true; h1 a/ w- x6 D* a' v: O' [- }
}1 w: ]0 D) q! {( ?. v, S0 t5 p
% p6 M" N* \6 s! X( {/ M2 Z) F. K( E6 \1 C1 J4 |# u ?
* n/ ^. ~# ]4 t+ y$ n3 V7 t2 F
, \) y! q, L+ O5 W6 \& m ]( ~* o2 B2 n6 I T9 ?" @- R# Y7 U
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|