|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
' v8 N1 @6 k+ B; E. ~+ k0 ?2 ?) ~8 t5 r: R% P5 ^1 x
问题描述:4 f" Y; l0 L9 b$ c: W9 Q; D! w$ G
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:3 D2 j( I0 k0 M0 a; T
0 t9 l( h- J+ w0 B图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
3 w$ \4 H4 T! @& K9 O& ~" W+ C' C/ h* i2 g8 i
测试结果如下:
0 T9 ?- a! l0 o( ~$ q( ?. X4 y138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?$ x. _+ U' J, X. ?5 d, y& I5 @2 v) q; U
/ V5 r- p; {1 W) T$ L8 J
! m. ~7 X# L" _( M: B0 U备注:) R9 e& B/ P) I$ ^9 F0 S
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?* |2 `0 P B9 M8 X* y
2、相关代码如下:
# h) T1 @% l' I6 v//UPP DMA缓冲大小512字节( t' W, t1 u6 q" E; D) F
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
1 Z: Z; b, D% R# l& X#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
" G, E7 h0 }8 f: D% ~' }#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)6 ?2 |% {0 ^7 y G! a* C
) }( X) b6 V) t* k5 z" o" o
# Y& c% Q7 a4 q6 Z" s( y: w//upp接收、发送buffer
9 ~& x3 d i5 Z5 V4 e) J' `#pragma DATA_ALIGN(upp_buffer_a, 8)
$ ]& F+ a: T9 s- S. z) e1 d#pragma DATA_ALIGN(upp_buffer_b, 8)
' q9 _1 w# ~! ]3 l! p" }
$ o% g( |. f7 }3 \6 \8 Kunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
9 f- S x/ O* O: s. Q' y6 qunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];8 l3 T& j6 P3 M- N; ^" D9 C- y m5 o
* p2 W8 n* k p9 x% T$ j' ]
$ P) ?5 v2 {* sstatic bool server_upp_data_recv(Server *server)
; |1 B/ O( r3 \, F{
% Q1 e6 @ O' S4 j* u2 R if(server->upp_channel_a_recv == false) {
+ s" J' u- A. V% g8 w; t( |. i server_msg_send(server, APP_CMD_LOG, "upp recv: start");
6 s; {) A7 @1 ] if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
$ u, S8 `* ^6 x server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");' R& }" ^7 F+ q+ _. @/ K6 p
3 \7 t# G( f& ~7 B, l
% }- a$ `* |! f memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE); H1 O+ o& m9 q" \% {) {
# {( X' q" a) ]7 G' f& ]. r server->upp_channel_a_recv = true;//
6 G8 \" v1 ?/ }/ Y server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);6 {/ z2 o; ]5 Q
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;2 ~/ o: {; P& `' Y, _! H6 i
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
; l- c- g' `6 Y8 c( h1 B server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//+ x, `0 J" ]9 {
- L. C1 S2 f2 X$ a, r/ s upp_error_count = 0;
' ~- i6 T- k M. E; _- B1 G upp_dmai_int_cut = 0;
0 v/ K* M$ M1 d" o; J: x- |+ m2 a" C8 y# v
// fill in data ) p- E* ^/ X" w% \; x
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);, I/ y+ v; `6 h* R( a
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");4 J7 I# y- v- V @; C" e, H9 j/ Z
}
5 N( p% X" u0 Z5 B }
4 [# _8 r4 s% Z- | else{" j( t9 S1 U5 d' |$ Y3 x8 v
if (upp_dmai_int_cut > 0){4 Q: w ]0 X4 |# D
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
" C" ^% U8 u( Q+ o! H Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
5 I/ [# q1 W" T- P4 d& ^7 z# Q
8 K9 W7 q6 z' b& R2 a5 Q6 n
//copy data to upp_recv_list_busy
R' g- v$ r) o3 H5 Y- |+ {" [ memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
& K9 q! v# r/ B8 E" b! k9 A' S0 \5 w" Q5 C
//
: X! Z2 R. e) w8 W ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
' w5 F* y; ]% X: [, V& W3 M+ }+ e* h7 b8 P
//5 `: w/ q) Y- ?1 J
server->upp_channel_a_recv = false;//
~8 m: f9 K- E% C+ L. P& ^3 n4 g' C& x1 N# H
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
/ K4 C- A! S M' f }
9 A1 P" G" W* L! x+ e! W0 L0 T }
% }; r: ?, h2 w7 V1 e+ G0 q' w5 P/ r Q
4 j5 z; G( L5 ^: m return true;
( [. z: H. n9 F3 k% H: N}( ?. b0 H, j' k( `- [- a
4 y' t; L1 ?6 [5 b0 V3 ], ystatic bool server_upp_data_send(Server *server)0 l* Z2 A4 X* |* C3 L
{" `+ t6 ~; _# J& v- X% t8 U" p
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
" v8 `# O3 t, R0 _7 b( S# v9 e DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);8 d' E2 T" y: u& K! o- A" B8 W
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);* w& T0 H2 I3 i0 u( {
char tmp[128] ={0};! _% t9 h" X5 R" C9 @! o
/ ^% P$ H9 _' v: d3 I4 x server_msg_send(server, APP_CMD_LOG, "upp send: start");: f ~* ]9 @/ B: g
print_log(server, data, 64);
' Q! L0 d# U; G$ D& w/ Y/ `$ z" n3 P( ]
//
; X+ R2 k8 q0 h; W( }. k memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
& h' |. b1 g! g& o% M( f3 D memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);0 l2 S2 N: i; l [& W
print_log(server, upp_buffer_b, 64);+ B% U6 y; t: h) p
+ Q, \, }& V" u+ r4 x: M
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
$ h; ]( ?; a: [; { server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
" d' M- y. i s" v4 J server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;0 l# u" m; P; R
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
1 a1 i( M6 Z$ h/ s: U# j) j- F
: U6 c/ n; y7 P memset(tmp, 0, sizeof(tmp));
\1 g# Y: P& b: ]% N+ X/ Q5 I sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 4 m4 N! |3 O: y1 |
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);; N4 Z0 i+ N0 Z& v
server_msg_send(server, APP_CMD_LOG, tmp);& n5 U+ m7 Y' [6 s% _
+ C6 }" o) i* A) S1 }- [
upp_error_count = 0;( Q( Y3 e7 u2 L
upp_dmaq_int_cut = 0;/ X& ^$ L( d9 {8 _
// fill in data - s9 ]0 D" R1 s" d. e3 N0 |
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); * Q; X) Z6 v/ q. x
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
! S( Z5 z9 b1 ]. W2 E% g8 O- z* R' ?: I
// wait send success
9 V( ?9 V4 _8 S i6 { A while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
/ R* `, D( R# ]) w
' l. M {0 @8 V0 A0 Q // make data node in free list + K1 l+ C1 {% b+ c& q" T
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);; s; r4 v* x" E! m
server_msg_send(server, APP_CMD_LOG, "upp send: success");
/ _9 L: Y4 }: g5 m r7 { }( a0 g7 c0 l' }) I) c1 q1 G) k7 H
return true;9 \5 J1 o3 J$ c+ K
}* i) T1 |# X6 E, y
/ } V9 }5 }. d& T- `
& ~% p, ^/ _' @- r% i
& F9 F4 R$ _, V& W
3 u2 W* D o$ E+ p; S3 E' B1 ]# M
9 V! ]) T" F' Z" d& V4 f! d% b( ? |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|