|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
" u9 m0 [; c; U; X3 O, D2 E0 @7 L% `& S! ]1 O5 W% l
问题描述:
0 r3 I9 N1 S i在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:* C0 A" ?# C8 w% }, l: o; I
) U# d* q8 b1 {图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
4 [3 L1 Z. G; W: ]2 [1 g: a3 ]- C" R: l |0 ~" l6 V6 I: J' P6 O
测试结果如下:( e3 ]( w8 s! X/ U9 T! R
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?% Z+ f' I9 i. g0 E& d$ @9 m6 d
( C5 ?. Z7 ]# J% @$ T
8 }1 D" ?; Q7 h2 O- o+ [备注:* r+ V) C/ ^% G' I3 n% r$ W
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
/ B7 g9 f2 K8 E$ }2、相关代码如下:
0 s Y- Z. W# E( u8 Z% `//UPP DMA缓冲大小512字节
' `$ J( B; k' ]% G4 u#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍# x* ^$ l/ [: a, e4 m# G
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT0 I! O1 C+ _1 P9 o, F
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
4 p7 T( u- _. `3 d r
1 F+ q; C: F" X
b0 _# ^2 F( z6 `, g, v8 v1 U//upp接收、发送buffer4 o- B; x# }3 Y$ s8 F
#pragma DATA_ALIGN(upp_buffer_a, 8)0 N: P+ u0 E4 L, u @9 S! @
#pragma DATA_ALIGN(upp_buffer_b, 8)
5 K& A2 ^- A" w/ b! e! W; a x' S X
+ o4 N- p" ]. N9 P* z: xunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];! l3 u, o: m6 y; b
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
3 B4 n2 B2 a5 f1 _8 p
$ [2 b7 W" \4 e9 U$ H/ C/ u0 M+ J6 u( m8 N- G
static bool server_upp_data_recv(Server *server) , k7 W0 h$ ^ w( t: j5 x
{
6 J7 w# b7 U! r- Y if(server->upp_channel_a_recv == false) {
" `$ Y1 u4 y. Q: r; ~ server_msg_send(server, APP_CMD_LOG, "upp recv: start");
7 {+ @ D1 i' `3 S if(ListMP_empty(server->upp_recv_list_free) == FALSE) {# o% M1 @) n1 _3 W; Z
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
q' y6 s" T3 n7 | Z; |2 f8 x0 |" Y7 h7 B" m
2 M- X" P9 i! n8 t! r$ | memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);3 B1 D0 R/ {" F7 X- @! ]; N; V$ A
' V) z' w# D) F: T6 M2 K
server->upp_channel_a_recv = true;//* d# l) A0 K) K/ M5 x( A8 f9 Y
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
k( `$ s; o) m- u server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
J2 B. W5 ?; D1 P) c) a server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
6 y, Z) ^1 D0 F5 H/ F7 a server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//% l: u9 u' ^$ R; g4 V+ T0 D6 B
" y7 U0 x5 l: } upp_error_count = 0;
% s% _' p2 f4 O: ^2 F upp_dmai_int_cut = 0;0 G$ j+ Z- Z8 s
, U: p7 b$ s8 h1 D' w! h // fill in data ) V; t5 ~) P$ c% Q5 Q
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
" w- n" {$ z* m% G' @8 q server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");0 t8 y& q7 F' Z+ E; _- _
}
* P& _$ y, d7 I- j8 t }0 L: ^7 g1 N8 _' z
else{
- n8 J6 T ?8 }1 T- e$ O4 S! F if (upp_dmai_int_cut > 0){3 a; k+ V: Z/ m: h- {* o
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);6 j, V9 H* |( P' h2 J% T
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
, p* h) n1 X# W( Q7 H% S
5 d) y2 h* x: r/ k8 W
; _+ e* t) N4 ^: h4 g: A8 N( f //copy data to upp_recv_list_busy
; c2 p, I$ H- o1 f memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);7 p$ ~# j2 B3 y7 |% z
/ y* G: N; X* R4 a // A5 p" ^* m: ~$ ~$ B8 k
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);( ~/ x' t2 i; S8 q
$ g* y" T% a5 m$ C //2 n V0 P, L7 ]1 N/ J1 f
server->upp_channel_a_recv = false;//
$ g: g* i& z- f. j
( \* D0 |, F) C* L server_msg_send(server, APP_CMD_LOG, "upp recv: success");
& R1 m' B6 R/ m5 f }% D: p% A) P; B) Y
}
% B) g4 \% e5 ^( o
* s1 N1 L- A% Y' i. v* @' {0 T
- R% r+ U4 G6 F! V7 D* ]9 d) A% ] return true;1 z. G7 y$ l$ c6 n% q
}
6 A' w+ T% E* j( g1 R3 Z$ n* X9 ~8 ?- Y4 g% D. i2 P5 P- x @9 ]& y
static bool server_upp_data_send(Server *server)( w+ [ ~9 O! w
{
% y% ?- i2 U+ x! r2 r if(ListMP_empty(server->upp_send_list_busy) == FALSE){
, M; j1 o- i* |0 @9 R) ? DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
! I* s/ g$ X) c! \- p, J1 Q unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
5 \: F* w* h1 K, l5 j6 _9 _ char tmp[128] ={0};/ T! a/ n# p" }/ k% [) u& i
9 `% B" N* K; Y; { server_msg_send(server, APP_CMD_LOG, "upp send: start");# D% M: L7 [) s- B( {& @
print_log(server, data, 64);5 ?* U$ N/ y' e, O6 Y+ p
4 w) d: y! [0 d! K# c$ j /// E# r( T/ _) |4 Y1 p) d# `) r& O5 k
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
" N( ^* t# |. _7 U memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);" p0 v1 a- |# V8 L
print_log(server, upp_buffer_b, 64); E2 J6 e2 | k4 o
2 m9 G8 }5 F: \( |
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
& `$ L; d# U5 e% c server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 2 G* g9 O& r0 x$ t; s# i% j
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;" `/ U9 `0 Q/ O
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
! s" T8 Y/ _5 O& @, z
2 ]+ h) S; v9 X! X6 w/ Y memset(tmp, 0, sizeof(tmp));
5 m+ s2 Z) H3 D sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", $ D- k7 p0 c0 K, ?" d# O3 M! L
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);# ^. R& ^) n# C2 [
server_msg_send(server, APP_CMD_LOG, tmp);
" h' B- q7 A+ n6 h: R% H$ g1 j- Y
upp_error_count = 0;
" X% C* O( u n3 w+ _ upp_dmaq_int_cut = 0;" m9 f) V% a( l0 v
// fill in data / [4 k- k5 W4 z
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); " I; U3 M* x: V4 B. J3 F. }
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");6 ?1 h t6 }8 o3 V+ x
/ J$ T* W+ Z+ I X) ?' {
// wait send success/ y& ]7 [( g$ h7 h# ~' c! O0 \7 |
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
& y3 c& E: V3 N8 z4 X
" w$ N$ n6 `/ e+ J5 i& Q // make data node in free list
$ W& e& S. l& i5 U. R0 @ ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
" R) z8 `* U- ?" p server_msg_send(server, APP_CMD_LOG, "upp send: success");
3 R& e: V5 J( C ^3 h }3 ?9 J- _; p/ N& M& W" a
return true; H2 D8 m. e$ Y; n$ @$ f
}
& U4 g4 ?: J$ k r9 a4 N2 ~4 K" t* Q! |0 g2 _: s
4 a, l: e0 p) {% ]
& M( O" w( A+ t7 p4 V9 t1 s2 J; R. ?% ^ o
9 P+ t# n7 `" e0 M( g- y3 R
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|