|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ) D; k; V) f# o. c
+ ^5 l$ f/ b+ J% R6 U( ], ]" J
问题描述:" d W% h2 z1 G- F
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:6 p" Q1 y1 p5 H
- Q; `* f$ _8 [' n3 P
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
4 q; f# @& _0 y1 F! m$ V
5 h$ b( F7 G ]: I: S- R测试结果如下:
* P2 _3 ]0 E. I- ^1 R# P/ W138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?6 s& V" j* K( k6 p/ W7 e9 s! i$ z; P
6 p) I6 W/ h( B
' Q" P- L' Z l! V备注:2 ~/ D# u5 R3 S
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起? M4 d' R6 l* i6 c
2、相关代码如下:
) Y& }! O5 v6 |; |//UPP DMA缓冲大小512字节 P# s8 A# a3 G5 K- W; C
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
" T0 |6 U9 }0 @* m# z; W* D#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT, B& P/ |* K* y/ b. ]( A8 m' T; x* d
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)2 D# G4 g4 p b1 @1 m
' S) j+ `6 X. q5 g9 E
# \; h: N* O% ?7 v# x! |1 W
//upp接收、发送buffer; P0 s. [* I1 x0 `. T
#pragma DATA_ALIGN(upp_buffer_a, 8)3 S( B5 \: ?) u7 J7 Z4 G( B. \: P
#pragma DATA_ALIGN(upp_buffer_b, 8)0 O" J- ^; a1 Q
/ x2 d% y8 y6 I% K7 Hunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];$ l c; P |& V0 A9 ]( C3 R, a+ X
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];! i' }7 O. y/ V: Q9 s. ~$ u- |; l
& f8 V0 E) p- q# o ?2 j. @$ O- n' G5 |9 F
static bool server_upp_data_recv(Server *server) . W9 Z" m+ y: \3 j: @4 M
{/ V. H% z$ y4 ^6 e2 } X4 L. M
if(server->upp_channel_a_recv == false) {( e% ^8 q6 A% e1 [0 Y# f$ P
server_msg_send(server, APP_CMD_LOG, "upp recv: start");- s3 E; u3 F/ \2 q
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
& f {5 I) T0 p+ o3 Y' y server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");* Q2 G2 D: y0 `/ b/ L
( y9 q1 M8 p; e- A$ i! f3 g
5 [+ J$ _* i- E% g# i7 X5 p
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);7 m; }& ]6 A4 N1 h- b( U
5 y6 n6 \2 \! u0 h0 }5 l3 w server->upp_channel_a_recv = true;//' Z- `7 l, x( ?( j, Z
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
2 ]; }, r2 H u1 y( v0 i server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;. a, D' z4 l* d1 `
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
5 D y" J7 X% {9 ` server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;// I7 S# G8 [# p/ U5 z
4 ?9 D2 T/ u: k! ~ upp_error_count = 0;
6 B, K0 T, \5 y1 V+ k _' H upp_dmai_int_cut = 0;2 W8 v9 z8 w8 S& W( i( S' `; B
: ` l& l( p/ z9 C4 y) H) M
// fill in data
, \ K2 D$ y6 A( e3 O+ s uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
, U5 L. H' {2 r% V! A7 B) K server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");/ k) u b' l, {6 Q8 ^. e- o
}* Y5 G5 ^- ~* ?5 l6 Z; J i
}
/ ?4 `$ g3 [2 [3 z5 f else{. z' ]. `, R& n7 H. h* B. s
if (upp_dmai_int_cut > 0){
# h/ d, U7 `& ]& m9 j0 P4 r DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
, i6 Q6 y; P% Q( B! w+ G Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
) m; X6 L5 h& g: a% j, ~3 R$ g
6 T+ I7 h9 k# ]6 B9 E //copy data to upp_recv_list_busy
; t, Z7 x% J1 w/ y# v memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
( }1 ^4 L! w- \5 w+ u9 \! S$ T! V
//
|- g8 e6 ]. {3 N% j! V ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
/ ?! H! w! k H/ Y8 `$ |- o0 Q7 s$ ^% D! w; x5 f" o
//% q; \+ o, m- R" |' ^; h: `9 L7 h6 ^
server->upp_channel_a_recv = false;//9 d. `9 G2 b( d
+ E7 K8 Q4 X% E' S! ~2 `$ l server_msg_send(server, APP_CMD_LOG, "upp recv: success"); N( w% s v7 L& ~" `
}% w9 p M, f8 O J
}0 h% Q6 c% I% T4 {# p; }# h. [
3 M$ C3 ?# l" @: u7 G. ^3 ?
, y7 Z- {$ k0 i7 U9 ~0 u return true;* }; m4 Z5 |# o/ ^
}
. C. c. w& X9 ?7 u+ q# s# S3 ]/ L4 ]% ]0 I: y1 |
static bool server_upp_data_send(Server *server)
: P Z% q! ^; V& ?7 x3 o8 T4 W{! a9 z+ K" T {/ g) V
if(ListMP_empty(server->upp_send_list_busy) == FALSE){4 T* I h! |0 B+ ^5 ?
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
, P$ F- @0 C O' R O1 z unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);! c; B5 l% m4 a& O! w) D6 }& d! U3 _
char tmp[128] ={0};0 _( ]' C* @7 ^* l
m. T+ g0 i V
server_msg_send(server, APP_CMD_LOG, "upp send: start");
$ U) P6 B) [) p) F" e3 |1 P print_log(server, data, 64);" X/ s U$ W* p. b9 g {3 L& A
& q6 ~: s% i! Z //
' q K# f9 v/ ^4 o9 N* ? memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
( F1 z9 o( |& p; w/ x" ]; i7 j8 X memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
, [$ [0 k/ V7 H" r6 z3 h- P& ]! q& d print_log(server, upp_buffer_b, 64);
; p, b$ r8 w/ z7 F- _: b
! s$ u/ k$ S: q# z2 k( c server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);& f4 A4 o* J5 X4 ^$ p- Q
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
! t( c: L- g. m server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;8 g* H: Z& Q5 ~: p+ [9 p- P7 M
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
6 h( m5 p& z S+ {: W+ z' v' S8 w$ u- h+ {, M z9 S
memset(tmp, 0, sizeof(tmp));
' G2 a: o* B/ _* m) p% ]. B sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 6 T2 l4 U/ \! x" y( O
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);1 N1 n: F0 n/ Q- s
server_msg_send(server, APP_CMD_LOG, tmp);. c6 f* d( J, P% a
3 {5 V# k' O5 \: R& H8 ] upp_error_count = 0;
, ^8 R7 p9 K, |( @ upp_dmaq_int_cut = 0;3 Q0 ]% c2 ], i, _' z
// fill in data , n$ B( d F3 `" e+ M
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 5 j, j0 m3 z2 ^# h5 b
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
% h6 `9 L+ |) `9 F1 z5 A, R! v8 C4 r! r: n) b9 L" C+ ]1 l9 |$ \( p1 Q
// wait send success2 K: `( G9 U: F8 S
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
0 _6 l/ P! }# T# n1 b$ n1 e8 L# ?* ]7 \/ Z" Q
// make data node in free list
: j; G2 R4 W1 E4 l! l F ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
3 y# P8 Z! P8 ]& m/ f8 r; } server_msg_send(server, APP_CMD_LOG, "upp send: success");5 a) ^: e5 \+ ?& o! Z# Q
}7 H/ I6 \* |$ Q$ D# {* H0 T
return true;- C5 p# }# t F9 q) ^" l- s, ?
}
# E) x. z( n' |7 J7 k5 ?" {2 N. g4 Y" e y6 j2 P
; l$ `' [5 E5 d$ A
$ M b* w( D4 }
/ h3 T, ]8 j$ P, _- L$ K) o
/ L/ w+ p1 A' q
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|