|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
, i: c% h1 @( S; f
o% @* a- C% P3 a( A: K问题描述:
: ]' l5 r1 ?( J! t在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:, b" j. y5 L7 H
2 }; Z d$ b+ Z$ ]: R/ i图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
5 j h, T" q+ ^1 w, \2 _4 G& o' S% f( f4 l0 e* _+ t: h/ o
测试结果如下:
" F$ {5 m2 E1 ?5 }138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
4 `& \0 f" ?, Y+ @' ~' w1 F2 q9 Q0 p& I( ]
! U& y. }3 N3 I# P
备注:3 r/ `9 l( K) D+ M1 P4 k; d
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?% T8 @0 ~ x5 b5 p
2、相关代码如下:
3 }) q8 g: _1 l0 Y; Y5 g//UPP DMA缓冲大小512字节. p* h h# M, r$ f& q1 F7 X/ [
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍+ y" q* \1 J( r( U+ s
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT r5 @$ ]" ^ ?9 v- M% ^
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
1 e; u4 o7 w: i: _2 K! y9 p& z0 z3 Y' R) ~; i$ [+ B
7 ?. m0 n- x8 z5 V: U1 x
//upp接收、发送buffer
a& m! s2 l1 L' x) z5 j#pragma DATA_ALIGN(upp_buffer_a, 8)
, Z! l3 l; q' i9 U#pragma DATA_ALIGN(upp_buffer_b, 8)( Y m4 A A4 u1 q1 f, L
, Y4 a& p- J" D; ]) i5 d2 Funsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];5 s) q( U! y. o( \: X
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];. v: v1 k9 X9 n$ I
, h+ U# z! x) k4 S, ]
F( G* J0 X, g- `( p# mstatic bool server_upp_data_recv(Server *server)
' |) c. Z) k& S$ |. l5 F{! g6 @6 s. @+ F7 V' r8 h
if(server->upp_channel_a_recv == false) {
+ E. H# t1 i: U2 h server_msg_send(server, APP_CMD_LOG, "upp recv: start");
8 P' [3 H6 U o( |( \2 A% ^5 ~ if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
6 l! j6 A0 m. p$ q server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");5 i' K \$ [ C9 q5 s \
; u9 ^- c3 g5 ?4 w2 n
; ]2 [) J0 _; m/ Y8 f$ _7 E memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);" ^6 `. N% u% z5 a! g
! l9 A7 K4 a1 x" r9 ?9 a
server->upp_channel_a_recv = true;//8 W; O: J8 S) }6 y( t2 B$ [
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
E/ P* a7 U7 z9 j/ O server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
- E/ U6 C) z0 S% j" l6 b' A/ r9 y2 j8 \ server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;$ }1 U3 F( E& x; `9 e
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//1 P. A) f# b! @
8 t0 s( Z6 U/ r j# Z8 p+ l2 Y" ^* Y
upp_error_count = 0;$ P9 h* M* ]" s0 {8 g" {- S/ i) m4 d
upp_dmai_int_cut = 0;
; e8 x6 p) x y- G, Z9 `. b% U
- ^6 [, c4 b5 G) W. b! K // fill in data
$ z, l4 c1 a! ]) X uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);5 t7 c2 v9 |4 j2 s9 l
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");. u9 }6 h- w7 y
}
# x3 J4 A) l& s+ e* S. l }7 ]% m0 |! \; q' c3 `( m* K
else{8 @, l) _+ H. S% D" t7 z
if (upp_dmai_int_cut > 0){
) U0 h1 O% D1 l8 Z" L- g) V- j6 r DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
" C0 L! L/ B) k' I7 J. } Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
" \& u- G: K4 a; |/ f9 p6 I% \
- V( h! Y: A/ S9 m' C4 \. C4 @' Q, D+ Y
//copy data to upp_recv_list_busy
6 [8 B# v; B2 D memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);3 [. Z9 x( X8 j+ o) n }$ q0 o
7 |* z0 i1 w' I% j3 e4 Q- K
//
, m. Z" I3 i5 i ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
5 [( o/ @. R8 l6 ~
! C# c3 P# v1 q* k* k" H! f; ^1 ^ //1 h& y' q8 L/ A8 l# _5 p+ D
server->upp_channel_a_recv = false;//, S1 t5 [# U7 N* H o" B+ a! v
" x8 b4 f7 {1 g) U ^$ M
server_msg_send(server, APP_CMD_LOG, "upp recv: success");/ k( I6 X6 x" b( h1 [+ F) X" K' T
}
7 I1 M, H6 O* ?1 c( H }4 T \* q! c: x
6 E' p% M9 v5 q# {
' q4 e4 S) o5 `5 e return true;7 d) ?0 X. _; L/ b
}
) f- z# M( {, @3 w, T7 G3 ~3 P" W, r
static bool server_upp_data_send(Server *server)- u0 @# E5 p3 @! l' u- }2 C
{5 c* E" x' a. [! N1 |
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
/ ~2 \3 l+ K! n/ u- Y! p DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
! u2 Q6 R! X% \& K+ m, _ unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);. _! k/ f6 M# {* d3 ^
char tmp[128] ={0};
! p& C9 p! w s4 j
8 M4 b& |) U* P+ A& p* b9 o server_msg_send(server, APP_CMD_LOG, "upp send: start");
; U3 u! Y& t6 V, z1 o! x print_log(server, data, 64);! j# `9 |$ f# e3 p! u0 G; I
. n- B1 s' W: F+ q
//
% ` H/ p3 J( W( F, I4 b memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
! ?! @/ D' |* I$ \& s memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
6 G' \2 r4 N: _ print_log(server, upp_buffer_b, 64);
4 _; K; H2 j0 D$ V% g' U9 j$ L, |2 u3 A) u1 E* _! \
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);4 _) U1 s; U8 R e9 Q1 u
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
1 j4 h( ] K8 k2 Z7 z; F server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;, k( ?) N: y, t( j
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;) d4 D# T4 `! a0 W1 Q+ l* w
: v/ O- t4 Q1 M4 v4 L, ^: k
memset(tmp, 0, sizeof(tmp));4 n- `5 d# {% s: x
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
) I. \8 V% l* E. ?6 } M" u! O sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);4 l: N# v. k, A9 j: ^
server_msg_send(server, APP_CMD_LOG, tmp);
0 v$ P: Z1 l3 S' J% D5 u" N) [; ?, v
upp_error_count = 0;: ^2 o+ J" h3 Q
upp_dmaq_int_cut = 0;; T. M8 D# r5 V+ X7 d8 l/ e6 u
// fill in data
) s a; }) L1 N uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
- p9 I1 d4 w+ c6 f) h) f server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");+ E. D6 E3 S2 t* c
8 F% a5 @# O- }. }" `3 w R
// wait send success
, L P. u' n }( _ while (upp_dmaq_int_cut < 1 && upp_error_count == 0); + x9 |8 ~8 o6 B) z6 N
% v+ g/ o, Q4 M; L
// make data node in free list % |' e }% ^5 W; Y2 R; a
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
5 m# X: {( X/ Y2 ?( [) p4 c server_msg_send(server, APP_CMD_LOG, "upp send: success");
* x6 C/ |9 ?) _0 M2 A5 ` }
{6 r3 N5 E) b( o8 _) Y return true;
7 z/ I& J6 o$ ~8 Q* T}+ v8 P6 f& \6 x4 Q2 v
# q; `1 s U, g; i, C+ w
7 u8 p S4 M3 w
; U! t; u6 q! N8 q/ U( h, }
2 R: M c' |" Y$ Q" K
, `/ j, L! W# t: M+ Z- u) y! I: R |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|