|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 . i: u& g j: u( H% y( e# G2 f# [
# B- G8 c" w7 S, Y问题描述:
" G) |& x& X6 i( U5 q; ~ P在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:5 W. R6 u! _, }# ^$ [
9 `8 P/ g3 s; _图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
* a. R% F% }) P6 _, J1 _# K/ c$ o5 j% A# t' S& S* ~: s4 k% _
测试结果如下:
5 X4 n+ D3 z% b9 E+ ?138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?& B" y" Y' }' P1 R# D
- m# `- K. l4 n& z) b9 h+ @
c6 `; P; U; ~; w
备注:2 s2 g7 _& a/ _$ L5 ^+ J. T
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
8 B7 X" \0 @" R; k" c' k2、相关代码如下:
u4 r# D8 ?7 }" b5 f6 N//UPP DMA缓冲大小512字节( ^9 r: t9 @9 c: _6 b% l4 y9 n q; U, v
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
8 K; [ |5 u, n#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
7 o* E) C; F+ A7 w" C: d; ^1 M. @#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT), t5 h5 s; p# U+ V9 b
: F/ X% }% L5 r2 H! ^( ` V( R3 Y+ D) S
//upp接收、发送buffer9 t, T+ u! v4 I4 ?
#pragma DATA_ALIGN(upp_buffer_a, 8): Z5 e- c, h; R) u& V
#pragma DATA_ALIGN(upp_buffer_b, 8)
5 g! `# H8 k4 s4 k* {/ }5 j2 |3 K8 Q6 K K8 l& w4 D" m) S5 z
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
8 ^$ z, Z& X: q0 h; Gunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
: r9 W$ K% A* q$ }( l9 _& o: y: j6 i; k, ^
4 Y6 |0 U5 k. N6 q/ [6 Pstatic bool server_upp_data_recv(Server *server)
/ ?4 J) h! i! O. g2 A9 ]& D! h{/ R B' k0 X6 C- l" S
if(server->upp_channel_a_recv == false) {. L7 t1 `, j; J% n
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
+ Y0 Q/ e3 S0 O# N if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
+ P0 R/ ^0 x0 ?& V, }4 { server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
" Q$ p' `1 R" ~% D4 H( C1 ^" q K& f8 J5 H8 C/ {
5 I( k# T! X! o- ]1 i% e memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);* t" s" w1 G8 E" v7 j4 u; `
, O" H& j! ^5 Y/ B server->upp_channel_a_recv = true;//+ W' B7 X2 _+ ~: e. ~ p
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);& b1 s2 e. z* Y! ~* v
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
8 o+ q3 Z( S P j8 O% | server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;6 |3 \3 [+ T7 ~( C) x. M
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//9 b% Y5 M; q6 l% E/ H
( ?+ x% @5 K: m0 i! r/ z/ G
upp_error_count = 0;
* O! U4 E; ]- k B6 P upp_dmai_int_cut = 0;; }* Z8 x: n, r: n3 D9 Q9 l
/ @! O) x2 s8 Z1 p3 ]7 `. T9 [
// fill in data
- C X+ Y: q$ m0 F( L+ o uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);; b& } g% `. n+ L" D- P0 r
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
( `2 F4 d. p1 g9 O' x6 u; X }
1 j. v& ^5 w$ a+ e }! _ `+ M; @& S
else{
: A0 X* D, _$ z `8 U( W* a2 M7 q if (upp_dmai_int_cut > 0){8 \! q: a$ ~% i( W! J
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);2 C& G/ j) `% j8 o; f
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
7 l0 {& o) m& D& k
6 P+ b4 W5 C1 L# V1 d9 U# s4 o9 m! r( R: x" y7 m9 E
//copy data to upp_recv_list_busy0 o4 d+ j4 O; P( o
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);2 L9 a) w+ ^1 X7 W+ F
$ D# s9 _) O! J
//
# I3 {6 P' R0 [8 R4 O3 q ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);7 k5 K( q* e7 p% a
+ Q, J. j! N, ~) ?
//
1 {0 i& [, Y! }1 o, k+ |$ q server->upp_channel_a_recv = false;//
5 L+ f7 H1 P, U, U4 g2 T- {: N# ~3 B, D4 T( ?
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
- V0 e8 Q0 r5 D. k: u% w9 Y7 a }
' Y& F2 c$ Q. O1 q. W! w7 H% k }' E0 x. k# i4 Z& q; j r+ Q, Y
4 D: d5 h. K& X4 c/ H+ @
: E: F8 q$ k* G6 Z" g return true;7 K) h l; A5 M9 t/ R
}$ U c: s4 V7 `, O# K3 N' G
0 m6 N' m* Q) }2 U; x; W6 i; l7 ?4 nstatic bool server_upp_data_send(Server *server)5 b6 ]" V& M- W2 p0 e" r
{/ R1 }+ {& y+ c9 U+ n
if(ListMP_empty(server->upp_send_list_busy) == FALSE){6 W$ y. I. Q. k k1 s8 r; g; Y
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
! D' Q+ h* e: d/ d/ ], ?1 f unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);# `( i0 ~) f% L- S' N: z' K7 N
char tmp[128] ={0};0 Z4 j0 G+ w! t. u
5 o' H( A. o8 l( \4 X server_msg_send(server, APP_CMD_LOG, "upp send: start");1 u2 E' G& I& H0 D) j
print_log(server, data, 64);$ a- [0 k3 {7 P8 f0 F0 q% u
/ k/ W3 d5 n; v# ?1 Y$ C5 Z. @: Y //
9 P6 @- B' Q; ~- y% R z+ ~ memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
- \+ @$ f9 M- ]: A memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);2 f! e6 `: f: m* c, O8 e
print_log(server, upp_buffer_b, 64);! d: W0 J3 }' x2 _0 d
9 v O# L! v3 {' _/ |" w server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
. r' p9 t+ L) U" P server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; $ p' K" z: d1 q0 J; J+ f
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
6 I, Y9 ^+ F. U" ^ I1 G8 z server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
1 z N# _; N' B) ]7 }9 Y9 y2 I" {
; r& A; g4 h9 W# q* ]" ~6 v9 l memset(tmp, 0, sizeof(tmp));. L9 h0 o# y5 j8 P0 \
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
( w1 s; T; N' T* W6 A9 T sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);( H& c8 r. v0 d
server_msg_send(server, APP_CMD_LOG, tmp);2 K+ n8 v K, p
( [& |; c. f7 c upp_error_count = 0;! T8 ~' t6 }9 u# z Q
upp_dmaq_int_cut = 0;. O5 x0 V$ n$ m, [/ \4 U
// fill in data $ n* q1 }, F; i, I2 j2 U
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); " U& [( h; S1 P. z4 f
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
! ^2 @. h* N2 h8 R0 m* V
- Q9 x6 B2 T: E4 B. P0 Y // wait send success( n; m; Z0 u5 `7 B( F& A
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); * h- U, E& S% A% B2 ^! F
$ }% Y) `8 ~; r; R0 D$ ~' x9 S // make data node in free list 3 s+ h- \0 d7 V: B; y
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);7 ?% g5 Z0 c, R) |( Z x
server_msg_send(server, APP_CMD_LOG, "upp send: success");
: A) h# C: K& M5 A. z3 D }( |, c8 n+ {4 d% C9 q3 O
return true;0 q8 U8 l5 g6 ?( s
}7 R8 i/ T& V8 R1 ^" _
9 y/ ]* {, O7 G$ c* W' t5 S+ A/ o% a( u" i( f: h
5 \) ^+ F; x8 S8 B( P9 {+ s
& Q4 h% A. d" x' n/ A
! Z0 x; k( a7 z A x$ J3 J |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|