|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 / ?) f5 r" U# I' y2 V- y; X7 _! W0 {/ j
3 |5 R Q% \6 L; l问题描述:
( L" I( O* v+ |1 m在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
s1 W/ P' Y( B# u
* F- @2 V/ O3 S; E. Q) U图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。4 V3 b2 e0 E0 ], @
9 @& v8 Y! R( a% A" G! j测试结果如下:- m! @; y& o* S5 P- V4 x4 m. L, s
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?7 J9 e# Z1 u- B+ r: x4 z" A
( @& k; q, o0 O6 ^& x B0 v5 s0 c0 u0 v! l
备注:2 K/ L, S( d$ ~: |
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?: @/ Z. E- c2 a q% X: L
2、相关代码如下:2 \% v1 S G5 D/ b- {
//UPP DMA缓冲大小512字节/ n3 @" X, e2 B0 u4 t
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
6 v' z1 Z, N/ j( G#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
5 O8 n6 t6 T# z# }: q7 g#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)" \5 @/ [, c6 ?% ?5 [
6 h2 o4 L8 K3 Z, `
: q' f9 B# d K- Q//upp接收、发送buffer
4 C2 O, p% j' ^- Y# O$ T# Y#pragma DATA_ALIGN(upp_buffer_a, 8)
8 D. m* ?9 M. t# Y& b2 Z#pragma DATA_ALIGN(upp_buffer_b, 8)
1 h7 c6 t1 V8 g8 n# t
7 u$ |3 P1 v0 U* ^1 S* G' m* gunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];2 A4 t0 c/ b4 g" u$ }3 v
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];, Q; H: y2 w; Z
; `5 s1 ~) s$ o8 {+ c3 f" H
' H1 @$ e* U p# d% Q* U' z, Q9 Gstatic bool server_upp_data_recv(Server *server) : V( Z: `% P- X1 _9 J9 t, w* Y' y
{
! J1 R6 t: }# O if(server->upp_channel_a_recv == false) {
, x$ I" _% N+ K& N) @; x* F' W9 \4 l server_msg_send(server, APP_CMD_LOG, "upp recv: start");9 Q4 Q: i! g& `& T& d& f9 W
if(ListMP_empty(server->upp_recv_list_free) == FALSE) { q% v7 q2 o; z4 v2 I7 Z+ J& W% f
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");! T* |, S4 K/ ~0 g! f+ I
" y0 P9 o Q1 R! t# r) ?/ `
# `& K6 I% U( M* T4 X; W ]; F memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
( Y! D- a Z7 Y# e/ h7 U0 U: V, |% i; z0 Y+ L
server->upp_channel_a_recv = true;//
% o$ j2 i# ^0 B server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
2 }4 w9 n" E1 Q. p server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
% ?) R1 ~9 {* _ server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
( c+ u h; w J( D8 |3 m server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
" G8 L% U. E ^; c: K( M8 w. [3 ]2 \3 ?
upp_error_count = 0;
% V5 K* n6 Y! b upp_dmai_int_cut = 0;6 c* C: v: m+ f7 g3 ^' h
7 Z! b8 ~' ^* f1 L# |2 Y // fill in data
) @, g" b/ L% C7 p1 r( c uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);& }! K# h0 J7 v, t4 `9 V
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
1 Z- U5 r# f& D; M }
' `9 o( k: u, l, ] }; ?; |7 g3 F% r4 X
else{) D* p U% a# l. T, H% t
if (upp_dmai_int_cut > 0){5 I( J" D3 A7 _" p
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
+ J; {" L8 r# E0 N4 r Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);6 ~& B1 u% {" V3 N5 {+ ~
' ~3 P2 S: m$ S% ~* u" ^
+ V# R3 S. G4 q
//copy data to upp_recv_list_busy6 {/ M+ X/ }/ p2 [: n5 T# ^
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);% [/ R) K- _0 j/ c
" w. M" r, m |% B; ~3 X //
7 ]. D L+ z1 r7 _: N1 f- P ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
. p2 r8 J4 f8 m" W- n8 D) J+ C% l, N* w1 S o: y* C# z) |- I( F! O
//
; ]5 x) @0 o; ~: v! q# S server->upp_channel_a_recv = false;//! B+ z* Q9 o8 m* |) o$ E$ e
~9 T- ^. B- f! p* l) D/ l server_msg_send(server, APP_CMD_LOG, "upp recv: success");
+ o' m# _; i6 d! @" }$ Q }
2 S' o* {3 p5 Q- a }' u8 K# O6 a2 D/ j7 M4 K" I- e
4 U, `4 p9 v+ f; O# Q% ]/ q5 q2 Y$ j4 g
return true;
: z2 [3 `& S8 o! M}2 c; Y% V( }+ O/ E
; ^7 ?4 }- |3 C: K+ |0 Tstatic bool server_upp_data_send(Server *server)0 e |. j3 d0 b/ l* u* D7 N% q) f
{. b* v, L, _2 n; U
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
, ~" V( F' A* R" V) M/ c DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
7 m# ] F8 w. u8 B( E2 h unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);" U% w( o! r; ]% ]! a9 U
char tmp[128] ={0};& T3 ^. G0 s: { F" I8 D
2 k5 O, y' k a# U P* Y" h. U& u
server_msg_send(server, APP_CMD_LOG, "upp send: start");- t9 `4 R* n7 C
print_log(server, data, 64);
% q2 Y. ` S8 Z( r* y7 P2 a4 D3 T2 F& L) ?
//
# x1 y' |3 r% r# ]% \( d memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);$ |) }$ @* g/ _$ F$ K
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);- w+ P( F% }- d2 Z4 d
print_log(server, upp_buffer_b, 64);; x" z: ?# w8 L! E( j' ^1 Z
/ s) @/ ^% o( n8 t. m3 j
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b); n M/ q* t: E: \" o
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 4 o+ D1 g0 x1 r( B) [. [# ~
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;% B9 |0 T/ @/ ` |
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
2 K, m7 D$ T1 S6 g7 z5 Z; O
0 {% H- h& h j memset(tmp, 0, sizeof(tmp));' P t3 S5 d( S
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 2 C& h* ~) l" E" S
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
& ]8 _* W Q+ [% R$ d9 y server_msg_send(server, APP_CMD_LOG, tmp);; W1 Z6 I! b+ J0 A% j
U+ T1 Z3 e7 n) T$ l+ A upp_error_count = 0;0 H' }4 k" _5 {, P/ Y
upp_dmaq_int_cut = 0;" k" V7 @ {$ D$ ?
// fill in data
$ n$ K- M2 a5 k$ U+ _9 Q/ R uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
+ B2 r( F: [8 Y$ W9 D- z: s" | server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
) g. L$ d6 Q' b8 K6 d0 N( D" T, H) f; D! F& L* @0 \
// wait send success3 ]0 y' t6 k8 d1 [' L8 C
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
6 }' Y. H, G) B! Q/ z4 B
1 b% x0 B% R4 }/ i5 h // make data node in free list 4 P. V3 m1 M# ?
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);$ `* g$ C- x9 ]1 ^
server_msg_send(server, APP_CMD_LOG, "upp send: success");
5 p5 `! T: x! Q/ m }
% K) ^; G9 ?8 N: t return true;2 s8 n* `+ Q& G9 \5 D
}0 P, ~' H. W# W+ {5 r! M
# a: Z" v0 H& E3 |7 x: } ~8 I) d
; O2 Y( S. _; |9 W, E5 A o5 f8 u2 K' k; s1 z. W
. M* e* B' x! k9 M
1 E A" F3 a9 P1 c) [ |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|