|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
8 X# v/ T/ A* W! w# z
% `' ~ A0 }& Z7 [1 k问题描述:& g# m# S f: ?# q( m6 I
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:2 n: U7 v1 [ r$ H& `
8 N: Q, N) U4 K6 g图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
6 t, E2 a3 N: Q# X
7 k8 B" L7 u% `- ?# D测试结果如下:$ t8 l0 o1 x8 E3 O2 s
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
/ w6 O) K6 c- z
8 [+ k9 W( U. K! n* b/ T2 X; H$ D9 {2 ^& W1 ^- Z3 o
备注:4 i- `' b) g1 l6 H
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?) I& P' N+ W- Q) z: f! m1 H
2、相关代码如下:. b' k( |" {4 r
//UPP DMA缓冲大小512字节3 Y+ W; r" @+ e; a* g8 T, y* Z
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
: ]3 a$ \* }* [ A#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
3 K* h: Q. D; n# h#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)9 x6 q5 s# f5 B+ e& S4 [# A8 ^
5 q [- t; F/ Z( k3 Y& K: q. ^# z; o9 k ^
//upp接收、发送buffer
% h! s: L4 Q& \9 P#pragma DATA_ALIGN(upp_buffer_a, 8)
+ q* o; Q' q5 k% ^#pragma DATA_ALIGN(upp_buffer_b, 8)
1 d" e( K" Q9 m* ~, b& K: \, H, y
! y; h+ j0 W" g( Tunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];& z$ n8 p4 t: b3 N
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
8 M" `4 `3 a/ V- {3 n
; s/ f( `9 _+ |/ g( p1 [) L. |' Q% H. L( S1 ?/ e/ d) n
static bool server_upp_data_recv(Server *server) + o# P. k/ p' U1 y1 o7 N- L
{' X4 u6 z' s; `2 e1 L$ R$ X4 b
if(server->upp_channel_a_recv == false) {
" m( g# t# J2 F7 p server_msg_send(server, APP_CMD_LOG, "upp recv: start");
7 J* `. N( e5 i3 c+ y- b if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
1 R6 e) t8 {& f, d0 z; W' Z server_msg_send(server, APP_CMD_LOG, "upp recv: get node success"); }$ ]: T/ @: b0 m$ |
/ X( O% _) o. k2 {" u
" T* Y+ M2 e1 _5 R, u
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
0 M3 j+ h. @! G0 n: X" q
) o4 @1 Q! |( x/ o$ K; y* }/ s server->upp_channel_a_recv = true;//* C" y+ _$ v3 C( I# \& l9 x8 ~# c
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
! D6 i9 W9 K1 K8 { server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
G8 O7 n" e2 w" I$ } server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
3 J$ Y; r+ K2 E* i/ o. v3 x) O! M server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//5 c; ?# j% v {, c O: ~1 E$ i F
, K( s) h D9 @- } upp_error_count = 0;, P$ O: Q+ R: `' T& [
upp_dmai_int_cut = 0;9 ?' _+ i: ^' S+ h6 `7 Y
8 ?% M: K7 T* V& b) Q5 n# ?) R
// fill in data
: @+ ?/ H6 R/ ~3 X9 x uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);3 }4 b% z! o; s1 |8 }" h
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");- s4 }' G. w1 w$ v
}
; u8 s4 Z# L1 J8 }/ A }" d! a b% p: S) V
else{
( Q0 }/ ~5 y& j- X* V if (upp_dmai_int_cut > 0){
$ z* \8 `5 D* j' }5 m$ z0 n9 K DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
' p+ E$ d; l9 I' P; a: ] Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);" L0 w* f' F5 R& ~$ h# D5 `
. |9 G9 o- z, Q' T2 ^4 {2 L( c
" S3 i7 a% H: ^1 N! m( _ //copy data to upp_recv_list_busy
: b6 Q" [/ L: {# _1 l# J memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE); U9 [* Z, M: h4 r1 {
8 u) V# Q9 J! N* s* x! h& | Q //
8 _9 w+ @! ~* Q9 k/ r ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
* X+ L. g- M N* I+ ^, {& ~* ^2 g" H* |1 l& b% {8 @' q
//
% h Q( X2 o/ ^0 Y" ?. ~ server->upp_channel_a_recv = false;//# @2 L X; e, S1 U
0 ~4 E$ l6 U: m/ V0 h# C server_msg_send(server, APP_CMD_LOG, "upp recv: success");
: R1 a+ X* d9 i2 Q0 E }
: p C- V D8 u0 T }
1 _& }6 y2 Y" n5 a% J; }% p$ P; V6 P
+ F6 `; o% E8 m0 s
return true;
& @! \3 R t* \4 d; B) s}, ]; w) T( s) j: L7 x
8 @% q6 T3 u: W6 l, u' Y2 S, ^
static bool server_upp_data_send(Server *server)
% p9 R& J5 i7 N. g- M; ^7 m{7 Y' y$ T9 B% P5 ~; V
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
" T& `4 U& n t DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);! c* q$ P5 G0 Y: l; p3 k3 g! Q% Z8 F) ]
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);% e# F8 J9 k7 V% t0 Z( |7 j
char tmp[128] ={0};- F* A6 e( d% v/ j* u& y
- s) m# E. @& d2 a: z# ~/ w/ H% d server_msg_send(server, APP_CMD_LOG, "upp send: start");/ ?% R1 g8 b) }+ n& S( p3 b
print_log(server, data, 64);! G% Y# |; h* h
; X V" B3 b* v/ d9 K //
& \6 s" b# o9 U9 y memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
- Y5 }3 ~; m5 O/ d, t. g, H memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
) q: I/ N9 z) J print_log(server, upp_buffer_b, 64);# N4 g4 M# D* U. ?7 ~9 n6 U# r
5 e+ c& ?8 ]1 _) q
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);$ ~& v* _, q6 k: V) y
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
9 Z8 t: J) i" D server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
1 O2 { Q/ q1 F5 ^; s( R$ p: K/ f2 V server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;- [1 a: Z9 b" }+ J' G) _3 |3 n
1 m+ H1 @- d+ H; i7 C
memset(tmp, 0, sizeof(tmp));. }- B( P% q3 c
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", & N0 W8 q" j* ?8 W
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);; d. R0 K, O3 v6 f; L& M1 W9 j( l
server_msg_send(server, APP_CMD_LOG, tmp);
; `- c5 ~# N- K' q b0 A
- H2 z" u* [3 i upp_error_count = 0;/ g# I# W6 x- j @6 p) P% @
upp_dmaq_int_cut = 0;
9 R, A ^, w* W; e6 V5 e // fill in data
0 [4 o' j3 T3 H uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 8 Q* F2 K- p$ h* }0 b: H: ^" c- `8 D
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
1 B8 y7 J |+ Z: U
* ~; f5 ^! Q) ~: J // wait send success0 L! u9 v( |8 ~7 _+ Q
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 2 D# [! j- B) k' \' [0 i
# T6 E' i9 V, k$ [) k
// make data node in free list % C5 V! w0 v/ c" Y9 T8 I8 |
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
" R6 \: A% `4 R server_msg_send(server, APP_CMD_LOG, "upp send: success");
I+ I7 C( |( M8 V" o }
; D; V' ]- J) \" d; [6 F2 f return true;
8 f S$ c, k% ?2 ?- f- R}7 F8 a, q" K& \2 Z3 ^. O. {
' o8 D- c+ t. P# s
* \: e+ }* K9 l$ n# U5 t/ n5 i9 P$ b" C
0 {+ E- m6 k+ [6 p! @2 t4 S( M0 A
4 {: }, I4 ^- i8 h |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|