|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 - E/ Z8 A( ]+ G% O
9 Y* J$ H# C) d) u* R# }问题描述:
; G- {2 t2 {% U2 l" V- J) c: _在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:8 R4 w1 V5 u* o
: C; y+ R, O: e. H
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。8 q. J$ }0 X9 l i
" X. e# T# O/ C* e# s& X7 \8 R! I5 R
测试结果如下:/ n4 X+ C$ X# O& O5 a: Q/ Q
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
+ l- Y5 p, J! U3 A3 G9 N* k# G/ \. a. }2 P6 |0 W- p
9 ]5 M5 f) p) f* N2 S8 T6 R7 R" G
备注:! Z; W) f* H" R: ?0 p
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
" s2 B% B3 P/ A; l3 k2、相关代码如下:6 L) d" Q) x2 z5 B7 q
//UPP DMA缓冲大小512字节
( M& Y$ p- \0 x#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍( h& ^7 `' Q. @
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
0 n% k. C+ j3 z#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
4 J5 V: P1 J4 E6 T4 V9 R% g; B, O7 {. T/ W+ V2 G7 j9 f
* ~! j c+ t, Q4 Y4 d5 c5 f//upp接收、发送buffer
5 s; X& f( a+ e8 v#pragma DATA_ALIGN(upp_buffer_a, 8)* u" `/ k& g6 I4 F9 l! N: ?# n
#pragma DATA_ALIGN(upp_buffer_b, 8); ]9 R2 l9 {. [
- u6 J; D& o. o! P. p3 b/ J2 O
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
' e3 D l8 O/ A3 n0 H' funsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
; }, @! R9 j) p Q
& X# g6 J9 m$ T7 d* C
2 d7 D/ n# Z4 l" m) |% K4 ]7 H2 e! ustatic bool server_upp_data_recv(Server *server)
4 l/ A6 x1 w2 Q) U: I. w+ W{
, D+ t" d' r7 m" x, A if(server->upp_channel_a_recv == false) {$ b5 {- W: A$ I1 Q
server_msg_send(server, APP_CMD_LOG, "upp recv: start");! O3 R& S4 H! d" C8 x
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {0 a* s3 e( w w/ P% y/ X; Z
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
1 {0 ^% |5 P$ x) ]" U; R5 y! {! a( [. |, I" P: s& W
- N3 \! m8 `+ O& c0 ~: ^5 |8 C
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);9 [2 [3 D/ E6 v
" Q: p$ @, S$ a: S9 ^7 ~ server->upp_channel_a_recv = true;//$ F4 m ~* E" N3 R
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
$ X/ E$ F# q$ g: ]$ w" a+ R server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;- w" [% L: M) p2 l& p% E
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
- K+ ^( D- O/ T0 w6 J server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//6 V) J+ O! s9 h+ Y3 l, T
! g$ g6 ~/ x: C2 \; q' ?! A9 e
upp_error_count = 0;5 u8 G1 [6 G; `1 |, S+ x) \
upp_dmai_int_cut = 0;; w/ O2 u8 E( C: y/ i
+ ]* j- D6 p5 h% E. }
// fill in data
/ W: ^$ _7 v$ e& B% p3 P uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
4 z7 H2 Q# Q# p { server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
0 ^1 j) X! z2 P* n$ O }
# z+ y+ z& j3 ~3 ~5 @5 H }- y$ Q4 y3 S$ Q% D
else{6 }8 W+ \: ^0 J, G( m9 m
if (upp_dmai_int_cut > 0){
# A6 C* ~8 d& J, V+ A, j# r DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
L! R/ E4 K" \! A: I8 N Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);- j& b9 {( I- g0 x3 S2 P8 M% M
" X* m3 j/ M# h+ N/ ?6 q/ t3 E' I; _& x% M" ]
//copy data to upp_recv_list_busy0 [( _: v$ I$ N6 B
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);! f5 M$ M9 K1 K- Q; ?- s
' W4 K* O) c% _+ D3 q //
' I0 {4 h I T/ J7 @ ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);# u7 [7 I. V V" {
1 Y$ ]# X2 `. t7 u# o. G8 x* D u9 s% o
//) B7 _* Q' C" b. z
server->upp_channel_a_recv = false;//
& S2 V1 L+ t8 t$ F: A+ E
4 Z" C8 h& }! H( ?/ e" k7 O server_msg_send(server, APP_CMD_LOG, "upp recv: success");3 [9 z% n" z! r
}* z! p$ o0 f( [
}
. G9 c- [7 o) g/ t
; y3 V/ D# M4 { a; T* R( l& ]) o
5 c' j5 E- Q3 P" d3 m return true;
. J- w; |- g2 a* Q}: [; a3 a1 l: l- [- r
* U- R* s: e8 n6 {static bool server_upp_data_send(Server *server)/ j3 j7 ~2 d; `0 M$ K! K/ d* }
{1 E) f) T5 s- k% Q" v2 W7 Q& r4 H
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
* ?8 t. \* ]% z; M; R1 Y DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);: f5 _3 n) ]- ?8 y3 K2 [
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);3 x$ @$ E# Q) `% r) g+ ]
char tmp[128] ={0};" x& K( j e# z1 n$ X
9 E3 U6 C; ~, t" u
server_msg_send(server, APP_CMD_LOG, "upp send: start");
! R0 S/ w8 ]7 h# n) K" s) E* f& b print_log(server, data, 64);
( }% y7 j% I; r9 S# L3 ] @1 g: L3 E& Q2 l2 U
//
# E) y, t5 f% K: ^8 s memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);& N! l1 [" |! ~' I( Y
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);) D$ g+ i" s+ x8 s
print_log(server, upp_buffer_b, 64);; T7 N+ K2 z% ~2 r
[/ E3 O* ]4 h+ R" ^* a server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
5 a! w' p5 h: R% i! A server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
$ f5 e8 E! d' r( n server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;' c; ]/ z# i' w- n& ~4 _8 Q7 l0 d
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;! a- T1 f' G' R: g+ J- h
! M4 `0 ]; I5 H# t. [; E memset(tmp, 0, sizeof(tmp));
! Z5 l6 o5 p4 d3 R( Y( C% {2 K* k sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
( Z) r. i( S( w$ H3 r sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);- w+ q$ d9 q. i5 N6 O
server_msg_send(server, APP_CMD_LOG, tmp);( I- L2 D9 O- ?+ x
5 s0 B7 G" W9 n8 {0 r
upp_error_count = 0;1 v) H% E j/ V# @( @* v1 d
upp_dmaq_int_cut = 0;2 W* G F4 W( e; A2 @
// fill in data : _" G0 [6 u' Q2 ]7 }3 \$ H
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); Q3 j! h2 ?$ P
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");3 R8 |, R9 ]8 _, p9 M. {
, L, ?; l1 U$ s& J/ L* d
// wait send success
$ y/ _0 k, p# u$ _; r& o while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
, @% t5 X$ o4 B9 I: O" ^
3 ]8 F' R! o* B0 } // make data node in free list * j% n/ O: ?& o$ K( k6 X
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
2 A" R* `, R$ n3 y5 X server_msg_send(server, APP_CMD_LOG, "upp send: success");
4 r) b* y% m" N4 Q }
( F% e* C( q2 z) V! b return true;' ]; P$ N8 l# Z. R6 a* C, ^0 E" v
}2 L2 d, Q8 O$ o9 i3 ^
) X" V2 g% W/ c
0 u l3 J1 T" g, t1 S- p: ~+ q6 b+ h' r3 f9 H" |; b
3 [( r! Q; z# R: u1 l" s% K
5 X1 b9 m# T M |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|