|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 & j6 I! L$ o3 Z- k- G
) M( B# f- Y$ s9 S# O1 A' n' H* m问题描述:
3 k/ g/ i5 G- n3 K1 r在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:( d8 @0 }. r8 t/ p7 @
! ^7 H% ~% ^7 y& c9 s图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。3 j, t+ w6 G& V6 M# [1 @% T" I
9 ~0 B! ?% e' w: q7 \测试结果如下:
6 L) D8 r0 v1 K: Q138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?1 A" h; ^7 a# a X6 z
( n, A O1 A7 `: c z6 c9 p
8 U* y+ Z+ O! i) Q7 Y备注:# {$ c6 S/ X3 r g$ H) m
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?* C9 G0 Z4 j: {7 E2 G
2、相关代码如下:& O4 Y$ U6 D9 q/ i! s1 O, y( K
//UPP DMA缓冲大小512字节7 q: x+ y1 n1 b! s; ~
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍$ c/ U" b# J% u1 I$ W
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT& N# Z, W2 _5 G, D" l8 G. v
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
- n9 S0 B: v! l* ^) d& y7 x- m; K( J# R) Y: H r, k
3 N( I, m1 ?" `3 {2 g( j+ T; G6 T
//upp接收、发送buffer% w) L1 ~; `1 b* ?! q- P2 U( h8 @- [8 h
#pragma DATA_ALIGN(upp_buffer_a, 8)
9 o0 ^* y$ I- y. r7 q+ X6 l" a# I, x0 q#pragma DATA_ALIGN(upp_buffer_b, 8)
, r. D/ {/ k3 N1 L0 t- K7 f* s' \4 j5 v% P0 y4 ]0 {, q
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
) ^' z, r; `0 z! Y0 K n% aunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
2 _. T* t7 S9 d. G0 T4 l0 l
[8 t7 M0 }5 p# ~! @2 J8 Z$ [1 |2 U: z8 b" p3 B
static bool server_upp_data_recv(Server *server) 4 y/ E( n. I: O1 z: s9 Y
{
7 e1 S" r9 P, N/ P& B if(server->upp_channel_a_recv == false) {; F* n" m; W9 v3 \) a
server_msg_send(server, APP_CMD_LOG, "upp recv: start");/ s8 e; h* X9 J8 D$ g; y
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {) W: o* X: |$ T8 @& b3 V, J
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
5 I. d* y v! ?2 L1 e9 {, w: P
0 V0 c' {2 W2 V
% ]2 g5 g9 @3 h' v memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);( ]3 g( ^' g, e1 U7 w# L
* R% I! \, {3 H$ R( u \7 M server->upp_channel_a_recv = true;//
; _# U( V1 Q9 {; c9 r server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);1 @3 L) x9 C5 o/ |
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;( r' n5 h6 Y/ ~( U) A% K
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;. T4 \, j, i8 d4 R3 J" u* J
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//$ N |4 L; R0 A
2 Y! O, J4 ]& T) N- ^. }. k6 }) f
upp_error_count = 0;
. J3 |# O% l. |) x upp_dmai_int_cut = 0;: x% z8 Z% h" @7 m, }
' Y: j$ h" ]7 B3 S' K5 g2 c
// fill in data
: V* u( {7 e2 {3 ]- R' L6 `/ q9 N: ` uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
3 [' S7 H# y" `% a& ? server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
5 @9 k. ~& a; z }
5 Q& R8 ~8 H( a) G; c }6 I( O, n5 N5 [% f
else{% D% [" L' V9 Q8 L n' p
if (upp_dmai_int_cut > 0){+ S. L9 ^+ \9 I
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
% a* O! t2 e$ f' ?# s$ W* P' v% K Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
$ y1 B) ~2 ]- s+ G; H' u K
7 j4 f8 f" P/ H) A. K: g
$ D4 R$ P- L7 d( Y; B* E) M3 x( r: A* S+ g //copy data to upp_recv_list_busy9 @2 G( F1 v; Y/ _$ f! i6 j: K7 u
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);: k$ F% C$ B- ~% i% G) e) d
7 I% Z. u9 a! q
//
& F: M0 |+ @2 `5 w ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);) l3 `5 m( U y/ b/ x
; v3 `% U% ]& H/ ]! A5 u/ }
//+ O8 C. e& K* b! W" Z0 L# g, y
server->upp_channel_a_recv = false;//
* Q$ w' x+ C# f2 \5 d( \
$ E7 b7 D1 M( s: \ server_msg_send(server, APP_CMD_LOG, "upp recv: success");
. s" S& B" d: u# b. @5 Z }. y; y/ O% ~; M4 V. F f
}8 u; j. R l8 v& Z; ~* W. e; ~
* t c& e4 T, E: J. n- u! I! N
) P2 u' t& W/ a; B; k return true;
( p8 S4 Y& i( `, u& L& _6 h4 C7 n}
7 h X( {* l1 c, @& u! p+ ^' J; ^7 G# `' w7 V+ Y) c& M
static bool server_upp_data_send(Server *server)
5 a4 c9 r' A: P7 P* p{
* H7 g: D% j X7 c5 o& Z' C if(ListMP_empty(server->upp_send_list_busy) == FALSE){
: P1 b7 }% Y5 f. v7 |- a DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
j8 R4 t% i( K( f unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
5 I( I# c6 o6 @/ p char tmp[128] ={0};/ x3 z* _4 y; Q' n) l
& W- [# H( I v% r: c+ m server_msg_send(server, APP_CMD_LOG, "upp send: start");( j' Q3 B- o7 S( d/ b- \
print_log(server, data, 64);; C4 X {3 k, d$ b7 f" `5 V
4 o# P3 U3 W6 ?) \$ F6 J1 T. X //
5 U) X0 a% g4 c4 n memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
. q$ l% b! J+ _ memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);. b- K1 y0 H4 S, ~ N6 M) T3 B2 }
print_log(server, upp_buffer_b, 64);
/ d; T. l; h0 E0 ?/ l4 B6 ?" s! |0 N
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
4 T1 v V9 f+ s6 q$ Q5 Y1 n server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
: B! q$ h5 v4 x" j server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;% ~2 W7 ^- e2 T! b' r
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
6 o4 _* [' {( q) J- D) W8 F% h" H c1 e: z7 `2 @
memset(tmp, 0, sizeof(tmp));5 o3 w- b' `" h3 V, R4 ?& ^+ { z
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
8 {* J: ?: H1 F I6 T sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
O% ~, [" k4 |! e server_msg_send(server, APP_CMD_LOG, tmp);2 h2 I6 \8 V1 \) J2 u
# S# `4 B: E* d2 X upp_error_count = 0;
% M. T$ u' Q4 m; x3 x0 g upp_dmaq_int_cut = 0;9 F! d/ U2 Y5 A1 {: P6 H- L) Y/ B
// fill in data + Q4 s, c. I! Y4 n( n8 n* |
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 8 X% n; F) f' C. C
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");8 l h' ]7 }& W7 n% L
; k2 K/ V) `3 l% B
// wait send success! _& I& T7 Q* x/ }9 Q
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
$ ]) s$ J" s% N: a4 b
' \* M! B( m& i* X2 g( Y9 F // make data node in free list
3 X% @: c6 I- X0 \, F7 P/ f) @ ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
' S8 ^. ^6 [& G6 U: O2 u server_msg_send(server, APP_CMD_LOG, "upp send: success");2 h* H+ ~8 B9 Y6 v
}$ e1 r7 ?7 a( l) f7 q4 e. _
return true;1 D) E3 Z- [) ]
}
4 N- E: t' r. A2 K$ A1 |9 ^
$ M5 b0 r7 v- R+ T6 d0 W6 w6 s3 k( O5 g& C: f1 O+ y# D
& `- }$ _$ h' R% |9 r. g' u
" f# N4 `9 O8 ~+ V6 r3 W* v. s4 e, m% _4 W# T: H% i4 q: h
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|