|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
& g( _# b. P9 {) j5 z8 i7 x J) P: L3 G
问题描述:( t3 h: p3 U; r/ `) b; `
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:! G3 z8 |+ _0 g( ^
0 C3 ^; |1 k, {图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。+ \3 Q0 i7 F# [+ T+ U3 o* U) a
. ?9 T: t6 s0 G, \1 ?' @) ^+ S
测试结果如下:
2 k; ?6 ]! q& ?" @9 V138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
/ r8 j) e9 `( W% W. z6 D
0 z- c: M1 Q1 u- x" g/ V k4 J3 m+ @5 a% ]2 y( A
备注:
/ |% @9 k0 C* v, ]* g. |$ u6 I. q1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
* M$ ?3 B/ {9 T2、相关代码如下:, [' a- ?0 p* d9 R
//UPP DMA缓冲大小512字节
3 V# q" z% C5 w2 D- j' T- f w#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍; M; A; q w9 w( C4 X' ?5 h7 ~$ l
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT2 y8 z2 b4 ?& @6 `, h8 ^
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)9 S1 Z: @ K3 z' |" `0 Q M* W
3 A0 i J" r! u3 D0 Z# N6 F; a& W2 a2 D/ D# j1 y
//upp接收、发送buffer
" T, l# V+ ]' ]0 R: o6 @#pragma DATA_ALIGN(upp_buffer_a, 8)- }, o) q: c2 L( F, V
#pragma DATA_ALIGN(upp_buffer_b, 8)
v- x1 M4 t5 m4 S R* n
3 {; s( k9 [ b* ^8 m" ?# Runsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];0 J0 g* C. y' e+ _) T+ j7 V
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
& n% k6 p- v. Z M6 d: b S3 m7 `- ^. b C
- l* A. ^! ]9 j+ K# _1 kstatic bool server_upp_data_recv(Server *server)
7 w# W" ?" c/ n F" t( T{
: R1 s1 z6 v) Q M4 o/ M& K9 S if(server->upp_channel_a_recv == false) { {! I4 Z% m5 D' B
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
* e+ S7 R3 X, @* C- O* m5 q if(ListMP_empty(server->upp_recv_list_free) == FALSE) {0 n7 p. c' `, ]- X! Z
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
! W) _; f) }- }9 f. T
3 R% s% t' a0 g7 g) e
/ T2 {# v+ Z5 ^ memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
. A/ Z4 d) W+ C( w
; J( |0 o" P$ N" R6 X server->upp_channel_a_recv = true;//
. c! e" w+ o/ ]; N$ w server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);* _6 T& b5 b9 p. X
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
9 l( Q8 m! y: E' Y2 M; L server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
3 e% A$ @/ |' b1 x0 r" b$ X9 C server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//7 m5 p! k( l7 l9 ^% o8 U# m
& B3 j) z' p4 \ upp_error_count = 0;/ C4 ?! T4 w% f6 P/ @& m
upp_dmai_int_cut = 0;+ B, V8 B: n, Q2 ~1 F& v4 W
R, N) m$ i6 U, Y( K7 J
// fill in data
5 _: F }0 q7 Z: s7 ]0 B uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
; Y2 z7 ]4 ~6 f; {7 Z, v server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");/ H2 O- k6 x8 `. Y3 P
}
3 N* P! O& ^5 |( W& a }( X$ \) G, q7 F" b9 P! P0 d& r
else{% Q* L! i- S R8 z3 k
if (upp_dmai_int_cut > 0){: U. l8 ]) r. Z) `: Y( B9 z' ?
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);5 p( Z$ A) `9 q; I* ~0 v7 F
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
+ F$ _" i7 q& B& j/ O0 G5 _
" i3 X6 e8 _* H# L: K+ [6 a- b5 e* @4 {
//copy data to upp_recv_list_busy
; f8 c8 T! X9 ^$ l$ u3 ^3 \ memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);) \; C5 W/ T" P! a" _
& w4 q4 a5 s! s
//0 i9 s' b# e4 x7 g8 b+ Y4 C) h/ h, j
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
: D, j3 G8 P% ^$ ]" ]; v
* u; M+ U$ l- u) j* k) K* @1 @5 }# z3 D2 V //) w& i, p. {. v- R3 V
server->upp_channel_a_recv = false;//
/ A. ~$ j. f% ]" K
M( H5 @5 F# o: e server_msg_send(server, APP_CMD_LOG, "upp recv: success");
O* T/ L& h/ D. w }( V' _; B* ?* B/ j$ ^
}; s; G# X9 l" t' V5 @% `
4 `3 ]2 d4 j* Y; R( [ V" M* u* ?( Z1 g) t% @8 g7 b
return true;% }2 E; A8 Y0 D
}
/ m' z" ]5 `* _8 }" S+ W6 b1 o! u0 i: N9 {2 Q
static bool server_upp_data_send(Server *server)* c( C" n- n1 o7 v6 p
{
, F: F+ T* h" a$ n" J% Q. r if(ListMP_empty(server->upp_send_list_busy) == FALSE){( C( e) V1 C# y; V1 Y0 Y% r1 o
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
, X* x r/ Y3 Y unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
& Q7 a9 \) @. c) f9 {# X: t @, Q char tmp[128] ={0};0 [: f6 ^0 Y; m; s6 l
! V# u9 E8 N. ?# O" T( t
server_msg_send(server, APP_CMD_LOG, "upp send: start");6 Y) [+ l( U1 f. m, ~& R
print_log(server, data, 64);
0 }. d; G. Z& f1 [
1 c/ J, f; \$ `* e //
0 O3 V1 u2 p% _$ `, u4 y1 G memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
. B' s' @% w: j$ A# r# p5 |+ { memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
/ F1 O$ v- w: z) F2 k, U9 ~ print_log(server, upp_buffer_b, 64);
0 T; @5 t/ r. v, Y$ q3 N4 ^4 t# G. z: @6 \) d' m/ Y
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
* y& P0 [9 L) S, Z& r. u- v4 Q server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 6 C6 b# f" i* t: n/ Q$ k
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;0 `5 ~: @- V" \! z+ E
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;6 h9 v9 E# Y$ T
, g# N8 ]$ D0 G; S# \9 i% J0 X memset(tmp, 0, sizeof(tmp));- M5 V; P$ c5 h: T' P$ B+ s3 P& B b
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
9 X& h$ i& O. z sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);; E6 g& g' p. p
server_msg_send(server, APP_CMD_LOG, tmp);
; \3 E9 g! q7 o! m: F& P0 Z6 A- i& e3 n; ]- s* y
upp_error_count = 0;
8 ~) P# q: \! f6 u4 Y upp_dmaq_int_cut = 0;
9 E: B& U3 o* j( P% U3 {8 T `3 D- ^. | // fill in data
& c; t7 r7 e9 D9 @ uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
6 M9 i, m3 G6 S& z: X server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");) Z+ j( o% H4 y, H
; L% W5 h$ b4 d4 G6 R
// wait send success7 z( A# V8 I, Z3 i4 \
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 3 u( `! F+ \6 o `' Z( Q
! G2 U$ @0 T+ o- H1 d4 ~# _$ j // make data node in free list
) P& h/ R9 J/ y6 D. J ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
: B: v9 E. Q5 O- {0 T- o8 k* n& H server_msg_send(server, APP_CMD_LOG, "upp send: success");
1 N' H2 r& Q1 x }
! s8 X9 A1 U w# T0 }+ H* Q return true;
, k! b% V! t: u- ]- h1 K}. A' o0 o7 X8 q- r% u
3 \; _- t0 w# d% l) D6 c3 z6 s$ \% A; a# F& J
- V' X1 V9 |, p/ m7 J
$ j5 k3 S u9 w1 F
; O: @. |* R0 d; r |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|