|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
' \! I) z7 |( c/ ^ W: v* P4 f3 m! t; E9 q) R
问题描述: |+ `1 o# a' b+ M4 ]% V" A
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:5 o8 F5 n. ~) o/ y7 f% N! {
( l% W6 {1 N9 Q4 ^$ V' t% ~
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。1 |4 H* s7 X/ N1 I: F' W% U# p
+ A4 I9 y( p1 ?" ] U \3 E: W2 }$ _
测试结果如下:5 g& o+ Q, q" Y/ ^* A
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
& D! ]" `8 l" q9 ^% |" `+ y; {1 ]. Y1 v; U* m
4 G1 F( {8 `& ?备注:
% u6 }7 |6 A; f+ B8 c# l1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
8 l' m: x" F: R) R4 _; b+ D6 @2、相关代码如下:
+ b/ R+ i2 R2 ^* w" p: {- c//UPP DMA缓冲大小512字节
; x( p$ v0 A9 m+ F; a. }#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍: q& r$ j) Z ~
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT8 O+ n" P) j' g8 I u
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)1 c+ T/ f8 u: V& l% L
# e1 {* ~7 C* f' j+ H1 P
M7 B$ a J' |3 t0 r//upp接收、发送buffer. y6 N" |( g* ^9 C- {
#pragma DATA_ALIGN(upp_buffer_a, 8)
* z4 t: G4 Q9 d. l. K#pragma DATA_ALIGN(upp_buffer_b, 8)
* R$ p# M% q' _& y" P5 U d* @( j3 x7 u5 s$ _; j1 C
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];5 ?% L0 e8 R9 q; v& u- @" C, ^
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE]; m' T+ C+ N! @- j
1 c5 E+ \& o: `4 C* h% r3 d$ K+ M; _+ X& h2 Y: p
static bool server_upp_data_recv(Server *server)
0 D3 V5 w4 S# l, Z1 y4 S{# @6 G3 w" H( _- k# L% B
if(server->upp_channel_a_recv == false) {7 S8 Y8 R" _" ]7 z
server_msg_send(server, APP_CMD_LOG, "upp recv: start");) F7 s5 ^+ D* {, Z) \6 I9 R9 Q
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {& Y) j2 ~. m) C. x3 E* C6 ?3 H
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
* N( H9 g( M |' V6 H! ^; q7 Y3 {4 {) G$ l
6 z! D$ X% k3 w
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
+ K3 k; P4 e$ w7 `2 `8 k5 N' X
/ G9 v) J! p3 P' E server->upp_channel_a_recv = true;//6 |' u0 q {6 x8 G4 y- y
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
* k2 i& m* g# E6 X) j9 \6 q$ E server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;8 y) y9 B, j" P4 c& ]2 P
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
. E3 _& H& ~$ c* g, x: B server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//, Q4 S1 i# U4 X2 ?2 F( Y' n" H
9 w# q+ c. O3 s' I0 {1 D5 A upp_error_count = 0;
8 C' d& a( V- K; R* U' V upp_dmai_int_cut = 0;1 c! c+ J: a8 Y; o
s3 `4 S" ?$ g9 T5 j
// fill in data # N$ U% K/ w' ^
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);: O# N; k* v% }! Q/ I$ J+ p
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
- t: q6 o6 J6 D! J+ j1 \ }6 G% B( T+ \3 l5 u
}* ^1 P( P* f! P$ D9 d1 U
else{
) C& P2 c0 o7 Y2 g if (upp_dmai_int_cut > 0){& N% r$ A0 t3 G; V t; o' |! @
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
8 }7 |+ r0 z+ U ?6 D! o Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
, i, \ w# l6 g/ j b u, A5 b. `" t+ E9 [/ r3 a
7 d+ w3 I9 u4 w' U
//copy data to upp_recv_list_busy; g% M+ u' K0 L
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
: d) |, O+ Y% b! h& j6 K/ g! G7 |: S+ r! s `
//- M+ b+ N* s2 w* ~: p! h
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);! B& `- }( e3 h }$ ]
) Y, A" H% t( A2 x# c0 `5 q& j
//( l0 A8 Q8 I: C" }
server->upp_channel_a_recv = false;// }! g$ ?3 T" O3 s& P
! d% H# h3 S$ p" ~$ n- {3 R server_msg_send(server, APP_CMD_LOG, "upp recv: success");; H; F" ?/ x7 {: u
}
. x5 G+ e$ r. D" V+ D4 k! S }
% c4 X& F) ` z- w3 _ t& g( a3 M
' c% H$ ?2 T7 k5 @8 x, g8 A% o7 h( l3 T, L3 x8 P
return true;+ e# y/ S3 D7 N7 n+ n
}$ u8 [6 h3 n/ y" A: m
2 {% {- S) U6 H7 g
static bool server_upp_data_send(Server *server)! h+ l% u# U" o& w
{ U3 i! n) U, a
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
9 o! |, V& [" }, N" ^5 X DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);- @' w6 S* o# s$ l: w
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
t. [ \# } v ~ char tmp[128] ={0};
$ m z7 j/ e# w' g
2 h* M) W2 c S server_msg_send(server, APP_CMD_LOG, "upp send: start");
. `" O$ ^7 j- Y3 H print_log(server, data, 64);/ L' ?; b4 F. w7 b5 E
7 L& [1 c7 r( N F( \
//
8 b9 `. w K; ^5 l+ h w memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);/ D4 L& E( |, E- Z. o" k
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
5 G8 u8 g% I% J! y4 L print_log(server, upp_buffer_b, 64);- R5 Y) P) m. W+ h) h+ }: [: F. k
5 i9 ~! @% p$ g2 n% y! U6 g8 g, O server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);/ W* p N4 l0 p A8 q* u
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
' j, P5 m% ~5 [) {1 B7 V& ^; u server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;1 z$ d, _4 V) O0 V1 F- K
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;4 T/ O0 x1 J0 H5 W0 o
+ n" l, o2 U9 w. T memset(tmp, 0, sizeof(tmp));
' C4 U; V9 m3 |! T9 B. a sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
6 d- g& ~; O) i( u1 ?+ F sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
6 w* h: y5 K- W$ k) p9 C server_msg_send(server, APP_CMD_LOG, tmp);
$ V t# z" I8 D2 ~: }- I) m5 L- b5 c3 A' I% Y2 |1 ]* Y+ `
upp_error_count = 0;7 {$ M8 _7 L$ p: x6 D
upp_dmaq_int_cut = 0;$ s' [# p* Q/ m* [* A! T
// fill in data " ]7 c2 o/ _7 {3 a3 b/ u% n. y
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
8 W( z; l" o- A% H server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");+ d! }2 J3 F- x! ]# h
+ A, a) r' }/ u& r // wait send success4 _( U% M7 P5 G
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
* ?' ~4 q( G E8 S* X9 j) l8 g) g( E5 O
// make data node in free list + l! j' A) {0 X! b
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);# Z1 G- {3 i/ f4 O
server_msg_send(server, APP_CMD_LOG, "upp send: success");' F, I. b/ ?$ z- J, D! [# v
}
3 I. N# U, s) j8 e, V return true;2 F( J' O& k3 [1 v) c
}
3 \: l/ i3 [+ @. J9 O' j7 q3 F& P# x( x4 B
0 M+ Z, i9 H7 _! c. a" `- U
" L( k+ A; d% B2 q" C9 Z3 _$ F+ k! z: U' \; W" n) V `5 Q$ c$ W
& a+ i, O- P. c
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|