|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 - I3 P, f/ h0 l6 V7 S- ?* R$ Q/ \) i! M
7 N, Z* f0 i" X7 u- x问题描述:
4 z7 I/ ]0 I0 n在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:9 g9 n8 ]2 _ Y$ M) x+ O
) H5 d6 z1 S6 ?9 a6 [) n图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
4 G' L/ A9 M7 T3 E( S7 E( Y. K- ]( T# h7 k
测试结果如下:
2 a6 O3 ?. ]& H n' V' x7 \138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
; b, g& } c, @% w) O' P- f* K0 H2 y3 c. q- S* {! E
! |& M2 n5 b) X
备注:: g5 _- F6 [/ n. r0 S& h- V8 J% C
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?: D* M; F. x- M: H* ~
2、相关代码如下:
T7 q. A: F. E2 [& u//UPP DMA缓冲大小512字节5 g# @( T% z& t( d
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
U8 F3 _! x- k, o0 P#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT$ s9 s: q" f0 T* R2 E
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)% `* |( k1 y [& C
- |/ Q, S# D+ f1 X+ |* v, w3 X! h) A) e5 u* V; N1 X
//upp接收、发送buffer
1 R, O3 J9 i0 `. W7 w) p% h: k1 x, c/ ]#pragma DATA_ALIGN(upp_buffer_a, 8)1 J& L9 P+ s0 M& P) Q
#pragma DATA_ALIGN(upp_buffer_b, 8)
% j- p) s! p& |! [5 e* U9 e' v' ^: Z/ n' ^1 _, F& a' _
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];3 S4 `2 `; w2 H
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];, D1 O: p- ^8 L; z
& j/ C# V8 B9 J; }0 F* ?( l) d7 e: n6 W1 I4 q+ Q4 _# l
static bool server_upp_data_recv(Server *server)
9 Q( j9 U6 Q6 `& m, c0 J$ X{
# @* b* i) m9 Q2 y if(server->upp_channel_a_recv == false) {
( Y+ f2 k+ ?& V, E server_msg_send(server, APP_CMD_LOG, "upp recv: start");( T+ C0 d1 _. V! @1 L) S1 h
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
# G0 z% Z- j" U/ d" ] server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");9 e0 t# `- k' ]9 w, M
# U3 K v2 T- m
" V) g: E3 w, ? W: _7 n W
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
$ M h1 U( L$ C* u; p z% Q1 O z
server->upp_channel_a_recv = true;//3 r" Y, y2 B7 |" w0 i
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);5 O5 n# |; V4 f6 E
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
C8 q/ ~! n8 C7 | e, z server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
$ A( h R1 o$ M, j) v. y server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;// O5 _- n0 e6 K9 n, {; d
( W9 f# C, I, Y, G upp_error_count = 0;1 V1 u2 {) {% G# }# `6 O& m
upp_dmai_int_cut = 0;( W3 T2 f1 l0 h* d5 O9 I0 }
9 r F- a# M5 z4 L1 \
// fill in data
9 m8 ^8 A+ ?( S* K7 f uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
1 r- ?, @8 D$ J7 E* P server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
( \4 w) ]& Q% d# r0 v: [4 k }% Y0 o1 Y( k& a; M" z
}
2 K1 I. e5 c0 n; Q7 J7 | else{. z% T: P" T; B- _' o1 B
if (upp_dmai_int_cut > 0){$ ~9 o2 F6 q# p* q6 g
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);3 ], U& K- [2 \
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
' \( [+ m1 _+ Q4 M; r. r" {) A; |) a9 o* @% |
5 g! B5 z/ \$ [- Z0 e. T //copy data to upp_recv_list_busy
* a. l B6 p; @4 E memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
4 i: I6 `/ p! \$ x: j+ W
9 s# H/ P. h q I* Y/ y //
7 y9 v5 Z0 D2 L9 X, d1 } b- S" Y3 ? ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);# }6 `# g6 z( |3 _9 d, d7 }
! z' Y% K I2 w6 I
//
: c! b9 Y3 a5 E$ g) c5 N server->upp_channel_a_recv = false;//
6 f, z5 B7 x" I; s3 j* y; V3 Z- b# Y, H( q q
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
0 ~- |: x" Q5 h0 m1 ~+ s! w: L4 g }
: \8 K; i# W; S }6 }# w- k5 Y) i( J
0 l2 d3 A; ~# A/ O3 z% b# ~* y# Z
6 F. q- Y% S1 e g return true;
+ i3 L( @' N7 _% a}6 h9 O! ?7 ~/ v* }8 Z0 j
7 a h7 W2 T9 I: a6 astatic bool server_upp_data_send(Server *server)
3 t1 A1 b$ U4 I7 {- ^3 [3 a+ u{
) ?- [2 ~- M0 P0 I if(ListMP_empty(server->upp_send_list_busy) == FALSE){0 b4 [ H* d4 A
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);4 o! i( [# _1 a
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
. b. \! h) [; l; }2 l' v* d7 ? char tmp[128] ={0};/ X2 N$ _9 Q, h0 H V5 @
! S' x* v" m u* c2 U5 K server_msg_send(server, APP_CMD_LOG, "upp send: start");
; a4 ^% x0 c3 g" v" M9 v print_log(server, data, 64);
% Q8 \+ [9 F; i8 Y/ J& m% z( Y: D h5 u e m8 l
//7 v8 j: _& M6 }3 K3 x' C, ]8 S
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
- ?, s% p- ?( Q6 O6 _* Q memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);$ x5 j4 b; z* T# \+ S ^
print_log(server, upp_buffer_b, 64);( r6 u2 c4 a2 A! z7 s
7 c' k, X+ V, M6 Y- F/ S( E4 l server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);3 ^* _* M) C( N* `4 E: t' p
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; : a, [1 V/ e( K8 O% g8 s. d
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;' q7 U$ M3 R. K4 a
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;2 E6 k- c- b; Q; ]7 O( ?
; s+ h6 j- g" W+ B
memset(tmp, 0, sizeof(tmp));2 F. g8 d% D& i' f( N+ O2 e
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 5 h% q& V2 S) G6 H0 R* m. s! n, e
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);6 K5 N% R7 Y! ]7 {- X
server_msg_send(server, APP_CMD_LOG, tmp);
7 V" {" _) X7 B% H- e; B! w. F9 [. R0 F3 {
upp_error_count = 0;
# d# O, k. F( A6 F2 Y! _% f upp_dmaq_int_cut = 0;( f/ Q0 Z( \( E1 o# m
// fill in data 7 q( K" p5 n( B; b
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
) P- l( {. [# V2 v2 r. P server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");* U' v4 W" [( w9 ^, k/ _$ R' X& k. s
$ B( p$ }/ p% O, A& o4 q D // wait send success
: C/ q, R4 D: Q( g while (upp_dmaq_int_cut < 1 && upp_error_count == 0); / `2 _) h; C% P7 L" ~* \
. ?0 i. R3 \4 {! T- N
// make data node in free list
$ b; y( Y( q& S6 Z0 @+ R ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);; R! ^" W7 b. r" F
server_msg_send(server, APP_CMD_LOG, "upp send: success");! r. Q3 ^3 b$ y0 n V6 Y0 X' H
}
. X4 [% q# c; w( z- @; R return true;; D& s. U6 ~/ }7 V
}
! B) `; J* G. ]% h9 l
8 t( i3 A6 }3 k! J J, d) N
& A0 C; g. V$ o. h$ r4 N
& M# r- O0 V) l! R1 [
5 E* { k$ N+ r1 |; C
9 b- ], ~0 v3 k) y6 t' W) `% V( z |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|