|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 % | h5 e9 z3 k7 o/ g+ l, M) W/ @$ \
; y3 J( @) ]! }4 ^+ x7 c6 H1 j- [问题描述:
! t5 j* {2 x7 ~' |# @4 P在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:% I3 G$ o6 p3 X$ U
/ G" i/ A0 W4 G8 V图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。$ b9 x4 M9 F& e
$ B1 w8 C; I3 A9 j. Z' R5 j- Z测试结果如下:
+ z& o/ m3 N! O8 h( S \138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?7 l5 `) X! @( e2 t* {+ b
, j8 M5 `0 h1 ]3 ^/ N6 C0 }
1 [" D: Q3 k5 A2 A' e. @
备注:
% V/ z8 t+ b3 @+ k3 W4 W4 B$ H1 o1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?% }. n D- S7 o1 `1 t# ?- Q) K
2、相关代码如下:. q4 o1 u. ] d$ K: w& h
//UPP DMA缓冲大小512字节! Y/ n! U: q5 d4 i/ L) P$ x0 e
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
; S: N$ y! r' G#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT/ l$ c% O! g( F# K& m
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT); [ b- {, J% O
: X2 N# m7 V6 ^8 m4 U k
4 j/ S+ K: k0 C' k# H, \//upp接收、发送buffer7 v. ]- I T5 n, R9 u; X% C! r o
#pragma DATA_ALIGN(upp_buffer_a, 8); `) \$ {& @7 B8 \) _# Q- G
#pragma DATA_ALIGN(upp_buffer_b, 8)8 M, b' ] O# T+ Q& d
- O) Z! \2 X5 l' X" |
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];* ]) A5 S, X% T* O3 @* B+ O) ~
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
8 S2 q, y3 P2 h" A" b, Y/ v+ P& W4 T$ H# q5 `- R* F# s* W9 p3 n \0 D; O
/ x' ], C( {, s" Y/ r7 Ystatic bool server_upp_data_recv(Server *server) 6 E1 W) Y7 p" Z* W# [
{
4 v. R: Q8 T4 j7 W" }% s if(server->upp_channel_a_recv == false) {5 e) q( t& M2 O, O
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
X! E6 t$ l+ s' w- {5 A if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
6 a {0 w* t: R4 O8 J server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");, J4 `: `! N9 E3 X* K
# W7 X9 i& H4 B9 W
' w, S7 Z6 x& `4 `' W memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
! E% u/ x4 h) @2 p" p* F
3 |4 M |: o) ~& e2 g server->upp_channel_a_recv = true;//
& v' m' _' _. E$ H1 L; I" G server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);% ^* q+ u2 ]" ?' V$ ]
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;' s# `4 t0 e6 [4 u$ M
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
5 H* X3 q& ?4 U- @ server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//$ |. J A- f# N% S; V/ P6 h( g( {
4 y# P# P: d0 k$ g# v- V' ^ upp_error_count = 0;
4 _+ o% V5 L F8 \" ]6 {5 p upp_dmai_int_cut = 0;) M' V: ?/ e1 [/ t# t+ l, q, W& [2 r
& @5 X8 i: l, Q* K& {) o
// fill in data
6 a2 C$ i8 a" s uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
" Q' r% e: P. g5 n# y G9 b3 @- h server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
4 c* u; a; G9 S/ C. h% y }; Y3 Z$ @. l% _: o
}- Q; p3 ]( A3 g
else{; g8 K; x, n9 k; H4 S" S
if (upp_dmai_int_cut > 0){
3 x+ a5 ]* s. R/ G DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
. s* u5 M* X* A Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
& b1 y: S$ w q& w, ~: @+ S8 Y$ W& y
' g! Y" X& c# o, V9 { //copy data to upp_recv_list_busy
" f Z) [$ a! | memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
, J5 e( }6 r; \4 i+ n, M$ }6 E/ k/ m$ h% n( I/ g; r
//3 Y. T% `, T& m5 A" N' m7 _
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
+ }9 a' [$ m, D- T5 P1 H6 y7 R
) V9 P3 B; Z( X //0 D/ A3 e9 [1 `/ N, e! r
server->upp_channel_a_recv = false;//
/ x2 d% }7 P/ w% r0 f9 [
8 T/ E0 j/ J1 s server_msg_send(server, APP_CMD_LOG, "upp recv: success");# t/ g f* ?2 ?) z" j+ [/ v, f
}! A5 Y" ?2 Q& M @; t% J4 `" Y' t
}. K- x& }9 j3 C
; l$ x: B& }: m! Y, e" ?
# n' N) l) c0 M1 f- Z" f return true;
! f1 M" t$ M0 M' }}. [5 `! v- y, v* u2 g
+ N! R; i) H I* x3 o9 |1 bstatic bool server_upp_data_send(Server *server)
9 w% d6 e9 U9 Z! D% `9 E9 c: M{
/ U! x# E5 ^# a9 i$ Q( j if(ListMP_empty(server->upp_send_list_busy) == FALSE){
; R+ M) S2 w) y& C5 t( }# X3 C$ I O" l DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);5 }& M0 P/ I1 y" x B. |
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);$ p/ p2 ?9 x" G9 b
char tmp[128] ={0};
- i/ P0 a* J o1 V4 {
1 @. P3 X8 m% g9 R* a# s5 U server_msg_send(server, APP_CMD_LOG, "upp send: start");
' C: V2 L# ?/ o& b8 j. W( x print_log(server, data, 64);9 } ~3 {/ j1 Y" v5 \
; Q% h8 }% O. p- Y% n* u //% c6 X2 F+ j! N* m6 u( l. ?
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
1 Z6 w$ t# _$ f; \5 @7 k- _, d) ~) N memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
/ C. C2 F. d3 C& Z+ O- G print_log(server, upp_buffer_b, 64);! E, `. f: C0 L7 w G7 F# `, m
; W6 ]. L; L) h0 @1 S! @- \ server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
" d/ ]- S* o+ w, M, W" a: N/ S* x6 [ server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
; ~2 l! _" n, o" R server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
/ T; s& m6 F2 F' e2 _ server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
# B: X# A. R/ `5 X3 x8 x7 k' V: Y8 _2 Q, z6 d+ b( I
memset(tmp, 0, sizeof(tmp));( t% Q& X9 Y0 y" f9 `" B
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
! f$ N" v5 P. n0 z sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
" z; d% {0 r% y& |& U2 a server_msg_send(server, APP_CMD_LOG, tmp);
* R& U% b5 z* I- C& O% Y- M5 v# k" q! J+ q5 S: ~
upp_error_count = 0;1 q9 q) u3 @( J' }- M" @& n! T) E
upp_dmaq_int_cut = 0;- C" H* ?6 K" ^8 h/ z3 f& v
// fill in data
v. k; F1 o2 T1 g uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); - A2 o/ }) @' m {
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");9 K f6 ]6 H, f, C6 ^
3 c; T9 c! ?& ?. n6 |+ T5 }4 P: w
// wait send success' l1 m! ]' a& P3 I- ?5 M' C+ m
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
. Z8 A0 U& M; ~( j* l7 j+ {+ R' r/ d6 W: V1 F: L5 i( \4 n
// make data node in free list / W* ~2 n7 p3 i5 c) `/ i
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);1 S1 z4 s' F6 p) _
server_msg_send(server, APP_CMD_LOG, "upp send: success");4 q4 u- B, o8 R; j' i6 M
}5 |6 f6 k' f( J
return true;) \ d1 l! s( ^
}
) l2 z( S& S2 O9 W' e3 _0 i! L+ @) q& ~" @1 l# A7 `
7 V& A( p0 } Q: v
3 B& ^! _1 q6 O- K: Y
$ B( a3 J0 T, g X ], G" K
+ a4 ]4 O( d$ a7 ]9 c |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|