|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
# h: X& F' H- ?5 g( A/ y7 ~) p S% c+ [5 n: f" E& e
问题描述:
; M4 W7 W% m: f4 R4 J/ Z7 p在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
; G4 v* T. [; d4 g* E: Y" {
$ d' {4 K4 Q9 E图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
& ]2 v! l. `1 `1 W% a5 }
Z: u2 a4 j3 D! ?* K测试结果如下:
H. H7 k- ~9 J. K: a138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
2 d/ X6 U- d$ |2 R/ z+ Z0 G6 u" K6 v& v K( k9 S
& F9 v$ X6 i8 e' ~, P' }8 @- }
备注:0 [" }& @4 t! Y/ o
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?& o6 g% G. F2 K! f
2、相关代码如下:
. |* o- l' J+ O//UPP DMA缓冲大小512字节
6 _' G! s* ?- ]8 r: R#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍/ P7 [/ s7 w" o& k5 W7 U+ e) V
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT3 c1 u) f6 ~% h! \
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
; y: o* B! t; ]" B7 }: H4 }3 r2 d) ^9 m/ h" N
# g3 R$ v' c; ]9 p
//upp接收、发送buffer$ D/ c# h' ^& \! M0 m0 S
#pragma DATA_ALIGN(upp_buffer_a, 8)% F0 p3 l L) j5 S! |1 V
#pragma DATA_ALIGN(upp_buffer_b, 8)
# [" |7 y4 v8 ~( U4 ~# T& U- t3 g/ k4 f0 O1 L% r+ t* ^ l c/ k
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
2 I6 L# x ~# r" b# ?8 `unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];" {, [7 [9 A0 I h2 N5 ?
8 t% |! l. P6 h# y( [% X" ?/ n
n; z: |+ s" w: S+ w X$ Zstatic bool server_upp_data_recv(Server *server) ' p: A1 \8 l6 D% O1 t
{8 T9 {6 p2 ]7 [' N# b+ c
if(server->upp_channel_a_recv == false) {, n% | n( ^$ z3 U1 W
server_msg_send(server, APP_CMD_LOG, "upp recv: start");( L' }( T2 q3 ]9 v3 F
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
: ]7 D: Q8 ?) P8 |: K server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
0 R/ C; N' e; Q# H2 A
: y) P4 y, ?9 e
4 | f6 B2 i* N memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
, C0 p" }# z& w0 x8 Y
5 _7 I: Z$ h2 |9 j: g! f server->upp_channel_a_recv = true;//9 w! `, q# U9 W/ x* T& g5 D
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
0 B3 G7 w0 ~6 U server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
2 b/ A8 J8 @9 Z# O- A server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;3 s# x; _ K) x6 j- E9 j
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;// ~% s) d8 I2 }
2 n, e2 q6 @0 ^! ]0 Y/ g6 _) B upp_error_count = 0;1 L: ]0 x+ m2 Z& {3 ~! K
upp_dmai_int_cut = 0;
( D4 y) ^+ R# r* k( C L
3 |! p- I6 c M+ y* u- f // fill in data ( d& Z7 [1 Z8 D9 I+ M) k
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
+ B& A% n% L! C: Z6 b server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
0 @' [* p* E* h/ \; P) O9 B/ ` c+ _ }
5 `) A7 E; l2 \6 o }
/ `% q9 i# H) e2 ~7 L else{2 U, a! M$ q; E' V
if (upp_dmai_int_cut > 0){
' e8 K, s. T2 K) T8 ? DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);3 `( C2 {/ B1 f/ l) G# w
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
/ U6 M/ A$ N* G7 ?9 w7 k% {8 o
% b2 H3 q6 |$ e! Q( G- m
//copy data to upp_recv_list_busy
( D! c1 [' y1 J$ Q memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);8 L9 @& Z5 l( [9 {0 D1 D
, F* ?9 J" \4 o4 h. t( S7 F8 V
//
z& u3 v, r9 M ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
4 p; O6 T& K; C) B
! b9 t( U* D) S; [ q //
+ z' I$ R7 H& x% W/ D# E4 f server->upp_channel_a_recv = false;//
# A+ l4 d2 T1 }" J3 _& i9 u
$ J( V4 q w2 d+ @9 F' k server_msg_send(server, APP_CMD_LOG, "upp recv: success");
a- ^* G% |" N9 t! V* v4 x8 g% a }
4 v( `4 f+ p. P/ Z; U }
: F3 C9 d" V) o# C( I1 U5 u! F( O/ N0 e% @5 w/ t' S9 z" t) b' d6 f
( N; o& j# H; @8 `; t( M& X return true;
; j! b* L) `& k- t7 j}
+ T) Q2 A# q% p( A
- d6 W& U& `; O; [% W; astatic bool server_upp_data_send(Server *server)1 w6 K/ r- {# t0 K' A1 `
{
7 r) g/ L0 H, }$ p* L# E5 |* i5 x if(ListMP_empty(server->upp_send_list_busy) == FALSE){
/ A s: f2 l. P4 V% R1 a( w DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);/ k. U9 z O# e# c0 t V
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);' k* X2 t ?- I, p4 g
char tmp[128] ={0};; I" s4 R5 S. L$ Q
- _1 f( j0 k. a server_msg_send(server, APP_CMD_LOG, "upp send: start");2 b P) P* F# x- J# L2 e- ]
print_log(server, data, 64);5 T2 `: [" H. S2 b7 r( \
5 A; J, Q* _0 [$ x# m //
5 b& M0 a) g0 s, v- L4 `6 X9 e memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
; _2 L9 ~) ]8 o4 s7 D7 Y memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);% y& I: Y7 i6 a. Y" u
print_log(server, upp_buffer_b, 64);7 s$ v+ f( {" v. b. U$ d' W
4 s& _+ [% _: P5 g" c) C# C server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
8 T! `4 B @, u: `/ |0 |( N4 w0 I( f server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 2 i8 l7 Z' g2 l- Q+ h+ V+ n
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
0 i7 D) t+ |5 W server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;2 s, Y2 f% b6 N% ~
4 y1 E+ X/ }& S% C
memset(tmp, 0, sizeof(tmp));/ B6 j$ G' H& \& e: v0 _6 x3 h
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", : w" K" I/ I* ]* g" F1 Z
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
" N1 s" C# w5 w8 A4 z0 V" c2 d server_msg_send(server, APP_CMD_LOG, tmp);
% F" d- m9 Q1 m' ~: ]( M% r3 M& X0 w9 b) u5 l2 ]' k* ^
upp_error_count = 0;
! C- i! q. s1 b) C X+ a upp_dmaq_int_cut = 0;
; c* C; ~& e. U w // fill in data : P, v3 j U# V6 i0 N* ~
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
9 @! ^4 y1 k4 b; m6 F! P server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");7 P8 ?) F! Q! k/ D; f$ R Z
0 s/ A w+ Y1 M
// wait send success
V! ~- x, e9 S while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
# Y4 _! e4 O+ q8 f- h' v& X4 b% ^( F9 C1 q- w/ c
// make data node in free list
& Z% y8 W* V3 ~5 e( @ ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
( ? P0 E$ }$ o7 b. k) p server_msg_send(server, APP_CMD_LOG, "upp send: success");" j0 s( G6 ~+ B
}
& p5 f3 |" ]2 u6 u# K7 K- F9 ^+ ~! Q return true; v+ ]' S+ F4 B( C5 X2 _9 Q6 a7 ?
}# q- y D6 o$ e
8 u! f5 g( V) l- T: u7 C n$ d. d& h) v. j M
7 C9 `3 A2 V3 ~ I$ B$ P) O
9 R) p1 t, S* X& T# U0 b+ x0 I5 k) y# P% z4 z6 B
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|