|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ' A1 ]$ W" X5 F9 I; |$ I4 m2 b
3 l4 Z: j" ]$ t- T1 T% t
问题描述:
" j* N( H! T; T0 w% q) g在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
" q8 D7 X% N. ]
# ^: |. z S8 q$ P4 @" l图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。* E+ [: V4 I5 U
4 N, \: }) ?9 w; |* l测试结果如下:
% }1 G- d6 @+ M- k+ S138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
: u( D+ f; K. n& i6 w( `- y# o! w) Y) B+ B& z
" S' v( G8 [1 A! D" a备注:- X" A( N/ L. @1 A
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?9 O H( t% u9 _
2、相关代码如下:0 ]# m6 f# ^8 {% y7 h) }+ b7 Q: D
//UPP DMA缓冲大小512字节1 r8 r+ I* w6 A% @- s) N8 |7 x9 ]6 _
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍! e# o4 Y- `) k
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT! A* C* @5 H1 I5 S) g2 X
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
: ~9 f9 _9 { H' Q3 c- i0 R9 q& {* `# e# [7 \1 _% @: T" u) u. x9 O5 h. r
9 j8 _ i6 |, M+ k0 @//upp接收、发送buffer! \3 _! q+ Q5 @ ~' q
#pragma DATA_ALIGN(upp_buffer_a, 8)3 K5 H, ?* j+ ~9 e% f
#pragma DATA_ALIGN(upp_buffer_b, 8)7 ~2 m1 l0 O& T' u. H
3 h% I: p& O$ u& ^5 G+ A& n6 gunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];5 s! v& c5 _4 h& j
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];) _5 ]! p" W6 ^/ T2 U1 @$ z: v
* d" W# b$ w1 `$ B4 F
8 v1 w+ ~8 g7 L1 f! j
static bool server_upp_data_recv(Server *server) # D8 w o- s0 q' q5 z
{& S" [) M2 @. {3 A/ \- m4 v7 Z% t @
if(server->upp_channel_a_recv == false) {
* V# S* @5 e) ?! h7 W4 c8 p server_msg_send(server, APP_CMD_LOG, "upp recv: start");2 D* E% t8 `% k: w" T
if(ListMP_empty(server->upp_recv_list_free) == FALSE) { `7 J0 A$ j7 _$ n
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");6 o3 x% D8 l6 a# Y
- ^2 ?/ b1 L( x
' g; o; W8 a. V! x+ N: \
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
$ o7 |" b5 _* F w/ @4 `3 ~) Y
; N! a! w5 @0 n% M server->upp_channel_a_recv = true;//: w! g/ Y3 N1 n
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
w) ~: `# [# [6 k server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
5 [6 L" V& U/ G0 h" j) [5 O server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
7 E# d8 `4 ]8 c server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//& X( Y7 I* k' `! H. M: n1 z* Q
9 a6 C. P/ Y) @9 k6 s" x upp_error_count = 0;& c/ ~% e# t1 m4 p; ?. d' p5 t& m
upp_dmai_int_cut = 0;
* D, h1 b/ F, k) D$ m. i! }, n, K7 A# o# G
// fill in data
6 y% ?; w- [( V! X' l; ^ uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);( r+ A; ^* l" `4 U; X/ O6 F8 u2 D
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
# m- [7 q* m9 M! [ }
: o4 J* {8 R8 T& z }2 U1 j) w4 V8 ]9 T
else{
) s$ e8 h, Y: }0 K if (upp_dmai_int_cut > 0){; ]+ }8 I. J% d
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
) H8 h+ c# a/ H- x' z Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
7 {; ?3 O) s0 {4 ]
R2 N+ r1 y! J/ ?5 D# Z3 J0 J, K7 r' I) _4 Y
//copy data to upp_recv_list_busy
2 i5 r2 G4 c B( ~; A; t memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
3 `$ U+ |) [# Q' ~; O Z7 g( K$ a5 Y% B' e' J" g6 a
//- R z! H* {0 B0 Z/ ?% M
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
j# w7 y1 W+ m, v
1 m# |. n% N+ K6 `9 X2 I //, G, n) x/ c& W8 \' M4 _
server->upp_channel_a_recv = false;//- P1 E* I# d+ r
$ L4 T7 J- O8 N' R6 ~+ m server_msg_send(server, APP_CMD_LOG, "upp recv: success");
) {( T) I3 s9 w }
) c" Z0 S. M' a1 e* \3 q7 a9 g3 @ }
/ V0 M1 F# O- W0 R& C7 ]/ N( U! ?$ h$ L4 K O, s
( l6 {$ d! I }7 e2 T# w$ H+ P
return true;% e M* A6 @! k8 @$ T( f5 z
}, m/ S) f+ G; q1 ]1 O
+ q" X+ q, {7 dstatic bool server_upp_data_send(Server *server)$ `4 X9 B2 I& |" e, t
{
1 Z+ k, ~3 ^. [( W% _ if(ListMP_empty(server->upp_send_list_busy) == FALSE){! h0 H. Z' V/ _' H9 o2 o. E
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);. ]& A- M1 q1 w; n; l2 y: b% x
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
/ o& f3 k% F. J8 m char tmp[128] ={0};: g' w) o+ J$ P+ t7 }( @4 R6 n. J, A
) P+ U7 \0 B8 g- ? server_msg_send(server, APP_CMD_LOG, "upp send: start");
; w0 z; N+ p; g$ \0 y, C print_log(server, data, 64);3 U2 V+ G0 Y+ A k E& D
6 _! q2 q" U. ~1 d //
1 O7 b4 h# X! `+ y' N- H memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);# f; w# Z& T; }& k8 S5 U
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);' x% K7 [6 e+ }. M6 ^3 K3 E9 f8 n
print_log(server, upp_buffer_b, 64);; w! y9 _. t3 _# H4 x' M/ F3 w
3 m7 L; z0 M5 o3 Q) e
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);6 x% O& Y( z& \; `1 c
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
" S2 U; M) F2 ^# l4 U$ B9 `8 r server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;- n% l2 p5 s2 E) f5 T; |0 P, L
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;; M. I. Z Z' V1 `5 g0 K
0 h% ], T) n! ?) V, H
memset(tmp, 0, sizeof(tmp));
8 z0 K) ^' l0 S, K( k4 z sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 9 y* K" J) ?9 a- u2 i
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);3 R! a1 L6 f4 o, V
server_msg_send(server, APP_CMD_LOG, tmp);
/ e- e1 M9 y4 N/ t3 Q. ^" x' q0 W2 j' T- b9 @$ @+ z6 m
upp_error_count = 0;
E$ b) a7 M! I! D upp_dmaq_int_cut = 0;
9 s4 k" H9 u1 [; ^ V* g3 |4 H // fill in data * R9 S) X% ]/ ?& A, H% E
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
. D" ?- X: g1 [/ W$ q3 ~1 e: R! c6 j server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
' b W8 Q2 m3 P' Q P( P4 e1 L: c6 S& A& q x9 S" C
// wait send success
! w$ u" w) p- w$ f: z' {+ H0 H) J while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 6 E3 Q5 f% R2 }6 i9 I
9 n/ U# C- M& U0 a* `' e& Q
// make data node in free list ; a0 i+ K$ @+ f5 s1 @6 h. i
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
0 \/ ?% b% Q8 `+ S. }: e# Y server_msg_send(server, APP_CMD_LOG, "upp send: success");6 x2 G/ u* U2 |% @% p. l$ ~
}
& u9 [9 q8 X; Q4 l return true;
3 f1 L' Y2 X& x}
( ^& A! o+ z% y% T2 L( y0 P! U8 n( A+ ]. ?% @' R" ^
7 z9 n4 R5 o N5 B" I) f' Y
5 @* y$ h$ q, e) E3 [6 H6 r8 p* A a" Z8 p7 ^# h$ X/ Q v
. h% m' r4 @# r" W, z
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|