|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 " H5 b5 ]2 N% S& ~
1 X8 A0 [/ l8 v6 ` I问题描述:
" d/ Q, C5 l* L! q- g& P1 |在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
7 X& m1 |, m) k% w; }2 p
& m6 f' S; |+ E7 z& [3 A: I2 ^图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。7 ? X% s) I- n# x0 H7 z% p. c
; t9 z/ r$ x5 c# T7 C" N, k* D测试结果如下:5 @3 y" M" T( C3 V
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?$ L s" h' h! [) K; B$ b
4 x+ S3 D- o# ^. w0 Q4 s
9 N. l% C" \+ c; o备注:
8 {5 z, F7 N) y1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?0 R- J9 P' d. s5 F
2、相关代码如下:& M+ q% J" i7 f# ]% G" f
//UPP DMA缓冲大小512字节4 p/ P! I+ r0 }: L
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍' A7 y8 W8 d1 @& K6 k+ G
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
1 u6 C5 s1 `: |1 v, i9 N8 b#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
9 r# A) H2 T) ~/ s' H: e; }% [. N+ W) w2 N( b! h
0 J a3 o1 z- Y |
//upp接收、发送buffer
$ Y$ r& F$ B! r& g/ Y5 S#pragma DATA_ALIGN(upp_buffer_a, 8)
8 C; O: p0 {0 W$ n' [#pragma DATA_ALIGN(upp_buffer_b, 8)
! [9 s: ?3 |: q! a" q- D O, W) w8 y3 j; e3 o5 |" i3 y
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];+ C5 r0 N8 _" r7 ~$ t
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
- h4 a6 I& Z2 q% l
2 I( V( V6 B/ Z+ L, s1 W
2 t) V$ R$ z% r4 V! U* lstatic bool server_upp_data_recv(Server *server)
( ~8 q7 c8 A5 P. I% A+ T0 H{! e9 `, C9 ]' L9 @6 {) x
if(server->upp_channel_a_recv == false) {
: A! |4 M- R$ z9 ~ server_msg_send(server, APP_CMD_LOG, "upp recv: start");
) `3 m- Y7 f/ {+ z8 _ if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
/ u& c1 f/ V9 S server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");; j# K8 L1 _4 u+ M8 N2 l
8 s, ^" l) W( B8 K8 w; }+ H A/ f+ s5 B! A
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
" m( n$ I2 L5 B- B Q: H& c+ f/ S M" M7 V% [/ W
server->upp_channel_a_recv = true;//
- y8 U, K: v7 A8 q server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);( D2 i! m" Z8 `; S3 K
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;8 g! G6 d& |7 v2 i1 y5 f1 _/ s+ z
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
/ v0 |' `' ? T. k( v9 w server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
. x) L) K7 _: W0 F2 L& n6 R7 t0 n: x: d2 ?
upp_error_count = 0;' B* F# r# ~3 ^$ @; E
upp_dmai_int_cut = 0;$ g- t# F& M* ^* L: c6 g W; j; w& c
2 C w. F3 V9 v* r5 A; O1 o
// fill in data & L# }+ Y, L7 A: m9 C
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
0 k9 v5 Z1 ]5 h& w3 \ server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
+ l& m$ Y& Z& s: o }' K; h, L, u# i6 z8 H
}7 g0 X4 ?8 C: Z( Y/ S1 E5 R
else{4 m3 `5 X& I" E, k7 M
if (upp_dmai_int_cut > 0){
5 }, _8 v" W8 j, r8 F. U& } DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);6 \5 I1 M4 m0 P+ Y7 _
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
# K1 u4 J$ I4 G) Q
8 v: y6 w5 g$ x# ]/ U
5 o0 e. R7 U* k' ^ //copy data to upp_recv_list_busy0 t7 L; m) {0 x
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);2 }3 M- ~7 H! }4 u
) ?7 B3 v e8 s9 C6 ?" P2 P //
* G% `1 T. P) O4 V- m ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);+ O. I" n5 i2 O9 o$ P; }/ S
# k/ G: }0 N1 G% P# s4 d8 K6 T //9 n/ T9 B; j7 t4 r( O
server->upp_channel_a_recv = false;//3 j+ }: C" I5 ^0 I! o$ f c- |
! n* t6 I9 ^3 O5 [/ E% b4 r, o
server_msg_send(server, APP_CMD_LOG, "upp recv: success");8 A, T" _: r- z- s
}2 j* Z6 N# {/ p" h' a6 L
}- z c7 B7 [0 d) r3 o
- N I2 C E5 L
. R; K! i! m7 |/ `; q
return true;% X3 W/ C0 M1 m
}
# n) A: |/ O% A0 m f* z; [5 s
3 d7 w" ~" h* c. z) s4 P3 a" qstatic bool server_upp_data_send(Server *server)1 S* e3 R$ ?2 h1 V# Y
{5 r" P- j' O/ j* H; }8 g
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
7 m1 M; r- _4 w. h0 x [, ~/ Q* i4 m DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
6 ?' R/ }" L. w: z4 m unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
6 A4 M5 X* t' B8 R* W+ I char tmp[128] ={0};
' `; E7 C) i& p; }# D y D" `& }# u; R) P% n( j+ ?# a
server_msg_send(server, APP_CMD_LOG, "upp send: start");% `$ ^$ P3 ?8 ^: j
print_log(server, data, 64);3 z2 j& ?9 N+ F# }. |: ]7 Q, H
" }5 A Q5 z& K: g; ?1 p
//
' b3 n/ W: W6 X# N" k memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
$ V4 c! e5 }: v/ V: j memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);, y9 K3 _9 h( r( w. o. O
print_log(server, upp_buffer_b, 64);8 `. e; ~3 R0 @1 n
) F- w% l& w( K/ I
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
F$ w/ K! s) E8 R: {# ` server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 0 k1 Z5 K4 f& F
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;7 i& L& @# |: M* T
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;' Y' ?3 f3 m2 ]2 s! J3 z) ~5 ?' }. a$ ]
, j0 a% S# w+ S* K
memset(tmp, 0, sizeof(tmp));
/ m0 f. m3 A, B$ F sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
( I9 v( M' W; R7 g sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
5 m! `1 Q: K! H1 H server_msg_send(server, APP_CMD_LOG, tmp);
- h1 y6 m$ M& d
. ~3 `3 q6 V3 l H% q. A* b upp_error_count = 0;
& E% b, h8 i' j9 Y upp_dmaq_int_cut = 0;! i8 h& k0 k6 B3 c h' U
// fill in data " x& o/ O3 F6 a% i. W
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
; B8 e, N6 I( Z$ u, Q k3 ~, X server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
( R1 g0 F1 j* J9 ]) C
+ S' _/ B5 O: {5 w K$ `. ` // wait send success5 P0 [8 P. j7 Y& N
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
# @3 E- R$ `4 A* i6 x y. V3 M% L/ ?: D' ]1 k
// make data node in free list $ r+ o4 T+ F1 {
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
; h4 z% \1 p* e7 y$ Y7 {+ J server_msg_send(server, APP_CMD_LOG, "upp send: success");
% y& W/ v3 _0 p% l* A* U7 V" q$ @$ S9 e }! r$ u1 B( R* G, A' x
return true;
( _) N4 A5 I, R3 J& N}
! l) h$ _3 D3 u9 X, T
7 J' R5 F. @* t5 R7 P( F! @6 z0 a6 k! U% t+ N/ X
8 }4 z) n% U! p" |2 E- ^% R" s& v2 U* @1 [" G4 F
- o- S; A& R) }
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|