|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 , C( }3 _& e+ W$ h& M5 _
5 i2 |$ q5 U3 U$ k1 W; W
问题描述:
; x5 N P ?6 }& k k3 V/ k1 B在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:& U) z. b: d% \0 I( ~- k. R" j
) `! y' d l$ F& _8 _% f0 k
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
7 h: m9 b9 d. p" R1 Q
d. z% \ t; V8 i测试结果如下:
; G1 r4 d4 d+ U3 W138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?8 M. k$ v+ A7 d" R( I
8 I, f8 ]7 f p" e$ p
3 E; Q: I* J% m: k8 t
备注:
+ T1 ]3 ?* l ?6 K6 j1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
* ^0 C1 Y; W% \, B& o% G" k- v. }# D/ ?2、相关代码如下: c8 r- F N! X# W7 z
//UPP DMA缓冲大小512字节, N' F- T% ]7 n, j
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍" o2 K5 U S; a& d) _% z
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT: T" _; m. o" y
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)7 v2 B# @- x7 f$ i" C
' a( O3 f# b, }0 ~$ A+ z p6 W
- |$ t5 P3 t) d//upp接收、发送buffer6 C" O+ x0 r$ `* R/ N `. O: y
#pragma DATA_ALIGN(upp_buffer_a, 8)- ?; p2 Z- A0 O
#pragma DATA_ALIGN(upp_buffer_b, 8)& O, p2 N/ O; l
' _5 k' b5 l) M2 [* zunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
& X* D; Q, H9 C8 h+ Runsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
8 U7 b' g7 a7 m5 O0 ~8 F* q' {7 R4 q: X+ c0 o/ d3 z/ z6 R/ {
2 U5 M D4 e) E. e3 Mstatic bool server_upp_data_recv(Server *server)
' @( X; q& M7 l _8 S7 t6 b{
' z; N' m9 I( q0 l' T if(server->upp_channel_a_recv == false) { B" W& O7 w; e v( v2 G3 h b
server_msg_send(server, APP_CMD_LOG, "upp recv: start");% B: F# x: m/ F* P: y/ Z6 ^& G
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
# w1 t' R$ z V$ k. |; z+ `3 ? server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");* V ?2 ]% K6 }9 A1 \
4 ?1 [* S3 T0 y$ L9 |7 [# U; O( q5 O5 c9 d" c8 s1 s' L
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);( X- W" V! N! d% }: e% y* b
7 @/ T1 K) A" v server->upp_channel_a_recv = true;//
/ m9 z& T, K; R, p+ L. i4 |; P2 Y server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);2 r6 c/ G. ^; x: O6 Z* o
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;& o* C" Y; r! l9 S* ~
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;& J( ~7 T' i! O5 W7 \
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
4 M1 E2 R! |3 {3 I1 ]- O5 e* P- j; n* c" C
upp_error_count = 0;
& z( Z0 {' p7 F$ w2 a upp_dmai_int_cut = 0;/ X* y) H, [5 u
' G; a' N" Q& S
// fill in data
7 I+ G, [3 z, N0 N+ t2 r uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);, ^# e" d$ D) {% ?: R& R/ l
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");- F# g; C8 p7 @* y* r% y* E
}, ^6 E! s0 p( q+ w, n& t! H! l
}0 l f2 M/ k% Y$ u& ~
else{
$ F' P- U! d6 @. y; R" D! C# U if (upp_dmai_int_cut > 0){
+ v, @( G1 Q ]; p2 w! x8 ^& ^ DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
0 o! y' w& a ?" Y$ E Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
. k" R& W, b. g$ [; _. S
! `4 ?! n" k5 }* s z( b8 X- s9 X9 a) a! |' F! ?6 X
//copy data to upp_recv_list_busy
9 ?/ [7 C, F& a, p* B memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);+ u+ V! ^: ^+ c+ K, E* k- K
' {. P$ l1 J. A
//
; l; P) n1 o! `4 `' x: s! R ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);5 {1 @) [( F( \' R' v
/ X; w% F* q' S9 J4 K
//
/ t) L' v3 I" v6 m3 r2 n server->upp_channel_a_recv = false;//
; M1 e* P9 s* e6 s; @6 K; a8 H" V# f/ X) E
server_msg_send(server, APP_CMD_LOG, "upp recv: success");+ O4 Q! N$ e% U1 [& K
}
1 ]! T: a( x) `8 a }. C# J9 N8 e! w% p4 K& n7 m8 _: t
1 Z9 m5 m' f+ h6 P
; F; B* U! x* s1 l3 }8 w return true;
' X* Y2 i5 D% h}( Z G2 y1 [& i* P ` V# r
1 p" X/ ]; N/ |) N, [
static bool server_upp_data_send(Server *server)
: V* N0 W8 r* g4 f% @* e2 Z{1 C9 e {/ h" ^- \+ W# e* D$ Q
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
6 v( b% v' o" T% p DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
' o. x4 b3 w" z unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);+ k Q0 B' X" Q: [8 L
char tmp[128] ={0};( P0 M! B6 T" s6 E' Y7 A+ ~" u
! t+ m$ f! | S; ?4 ]3 I$ F server_msg_send(server, APP_CMD_LOG, "upp send: start");8 o* k9 {* {. x I4 H" O0 B" F% ~, o
print_log(server, data, 64);3 D& Q! l! D# B3 v& h- D3 V0 e9 \. I
( L2 K6 `1 k! c9 O& S5 m- \/ e3 f //7 T* _: R( V5 F- ^2 j+ B
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);5 R ^& D# a2 w9 z
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
7 T# K4 T, }, ?1 u print_log(server, upp_buffer_b, 64);/ O& q& L5 U t1 Q7 H/ \
$ f: v/ u: M6 Z( `8 B
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);# q' a4 k* R: W4 w
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
8 d# e/ H$ `) u, i server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;; ?, F: y( n( B8 P
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;! y1 P* [7 w! \# ?
, J2 V& A+ w5 \- n5 Z memset(tmp, 0, sizeof(tmp));! ^" J# q; g0 P9 j" h
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 0 Y( [5 m0 u# Y- H' G2 ~
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);7 G% o/ c& H/ m/ A, S
server_msg_send(server, APP_CMD_LOG, tmp);
+ s& J8 g. u, M
, c+ Z- ^. O. W5 v upp_error_count = 0;
9 X& R k4 A( x7 a' B0 F. s* ` upp_dmaq_int_cut = 0;# Z# `1 t" F) o; ^/ F
// fill in data # {: b$ t+ V) \3 ]/ T' w
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); o$ l0 S6 O: J! }
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
9 K% M+ R5 Q$ v% w
1 ~+ Q1 H5 t4 y! m2 @6 L // wait send success$ g3 C0 u& a( b( h, l! f$ C
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
" u2 [& u e, [5 [9 K7 V; {/ c- c% e+ c, h' q7 X: `5 k
// make data node in free list
/ ?/ p8 J; _* K8 D# S' R# B2 C: R3 Q ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
d( ?* k% e- C0 c, _1 V3 w$ W7 I2 P server_msg_send(server, APP_CMD_LOG, "upp send: success");
5 Q! G. J' t U% U4 z! D+ z/ L. ? }
) v! s6 B! @& E return true;
# K- u1 F0 t7 f! p- p6 x m2 r7 t}" ]+ V; O# d4 y. W1 f
. m8 Q M; f+ C" H! _* s, ~ Y
, }' }9 |2 O) _
& g! o z) x5 G% ?& y# R. j
, H9 Y- ^4 Y; B. l8 L+ ]% m7 K, h; [) M+ ?9 O m0 g4 i* Q
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|