|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 / N9 B0 F' `6 [; q7 j' e4 ]+ ]
& E' P2 ?0 M3 l% m( }' c1 q8 l0 y; J7 f$ c
问题描述:7 Z7 M- V/ J5 r4 k5 I/ ~; y8 Y
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
' w# t+ l# F/ P' H- x7 l/ F0 a
" ~- n+ E2 O0 u" T" ?. x图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
5 e; p5 Q) ]. G. ~. @' y' a& t& l8 b3 J" D
测试结果如下:
) S' d+ s6 u/ ], y138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
) ^5 Z4 y- b2 O! n0 t% Y% a$ ]8 S, z
* [4 H1 m6 V3 A- C( Z
W, N0 r: _6 e" q备注:
/ f7 h' ~: g* a5 b7 Y1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?* j4 e1 j2 k: E1 W7 I5 o9 h. a8 O
2、相关代码如下:
f. r( v. l5 o8 P' r//UPP DMA缓冲大小512字节
: w6 }' }2 N# X( n3 y#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
: _3 w3 A# `$ Q, i#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
) ^/ q( d' l$ y' @* M3 {- p#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
! J: L/ J- h$ }/ o7 f4 V
" B. r; K# o. g3 s3 f ?' @+ N! T9 `) c+ S, f! s* v# q# l9 z. U
//upp接收、发送buffer
/ _9 e- U% P' D# b& U#pragma DATA_ALIGN(upp_buffer_a, 8)
6 Z) v* |; L/ l6 z H#pragma DATA_ALIGN(upp_buffer_b, 8)
6 Z5 L& O" h( U/ K6 c; ?" O+ }4 G) w0 \* f) p( j3 z2 Z9 C5 {+ Z
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
; c6 p, j$ n7 f9 Y1 eunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];& L" Q; Z' E/ b7 T! d3 U; a M: B
5 F0 `8 ~; e$ }: j; E1 ?
, T* O+ T' u) o, J" dstatic bool server_upp_data_recv(Server *server)
% n, @; ^3 E+ `" f" S+ c{
2 U S$ ^: n: P( `6 a0 I3 | if(server->upp_channel_a_recv == false) {
& v2 {2 D3 f# Z( c! }" @ server_msg_send(server, APP_CMD_LOG, "upp recv: start");4 ]6 W: z9 I/ I2 m
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
& f5 Q& ^5 l$ W/ x0 U4 n, P; ]. ~ server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
+ x1 U$ C$ U7 }4 v
8 N9 `$ j/ U4 p+ p( M
/ H8 a) _4 T4 V* k memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
8 P- O% e( g- b+ E: S6 y; T# q8 D4 ?" C1 q) l2 E# y4 |
server->upp_channel_a_recv = true;//* i. w9 L, {- g" t0 c
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);$ g1 \& }) N8 M( M A7 ~# m
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;1 v9 r& n3 I/ O; q6 t; Z" M
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;4 }. T% _+ w. u, h$ T' \6 U
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
8 e" X# L) u A0 o1 O9 p' s6 s& d8 ^( Y+ N* B& W
upp_error_count = 0;
2 x- \# H, F! _9 l' X' X upp_dmai_int_cut = 0;
; U/ T& C! [" G) ^/ X4 Y
J' v( T4 l2 g3 M // fill in data
0 a" J7 w% y( D% n' x3 T uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
6 @) B( {, P, m t5 K' y7 K server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");/ l8 y+ C( g: q: g
}' a# _. J$ ]8 ^6 e4 p
}
5 c$ U2 M+ P* U a4 ? else{7 A7 T& x; ~2 _9 M
if (upp_dmai_int_cut > 0){
% ^" M# e& |1 N6 x' R3 v DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
7 ]0 A- N# U( P" ^& c$ e0 Z Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);9 @* O* @, r( t+ y7 G
& Y* u, W0 ]' ~2 u, g2 F k5 I* s1 l+ [; @! ?0 B) L' U; R
//copy data to upp_recv_list_busy2 U, O# v8 c [1 y$ v$ [' V# X
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
' ?3 _1 ~2 k# z# m( O0 u1 {1 j/ Q
$ k1 c: G4 C4 L7 L! R9 p2 q$ G //9 ?% j" T* }+ f$ t. D* g
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);: p. F& W/ K6 \/ ` z
$ x4 i% \4 `! \" D; I: G2 d6 U //
! f8 v. p" l! a' S, S6 k" w server->upp_channel_a_recv = false;//
$ K7 N# @* R. \6 k* T
" z: x8 E$ u$ S/ A$ P5 H1 Y9 _% } server_msg_send(server, APP_CMD_LOG, "upp recv: success");$ g8 H& X. D4 T5 [6 P
}
3 J5 q" T5 v" S1 n: p ] }
7 b i$ D$ Q. A
2 l I: W! T$ o. G0 S9 l
' |4 \% Q6 p7 B9 c$ d4 X( m0 Z: v return true;
: S d* j7 A, r- P" P, ]}# G/ r6 S5 D8 A6 G4 f1 S) ]( K' I
/ {5 y7 ?# }2 @3 v( w4 ustatic bool server_upp_data_send(Server *server) O7 y6 I) H$ ~4 C
{
: P4 S8 J# S* }, h& ^ if(ListMP_empty(server->upp_send_list_busy) == FALSE){7 @+ |3 b) x1 N
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
o/ J- t' V5 N, g3 \ c- L6 ] unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);" a3 U5 ^/ ?, r1 c$ A _( D
char tmp[128] ={0};
& }/ l& N& A# D6 c4 ~3 E
1 V# a- R0 N: O f. c: v server_msg_send(server, APP_CMD_LOG, "upp send: start");
& D+ n3 p5 o+ [2 _ print_log(server, data, 64);
' H- a/ J' ^! o- ]5 t) j) O+ B2 Q/ }% K! w- D* A; T! w
//
# v& Z! s$ y8 E8 N memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
8 j5 G, S6 c" f$ T/ o' p memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);& s- n ?0 K% G5 Q' ~- Y! M
print_log(server, upp_buffer_b, 64);* ^0 n9 [$ l! _/ I3 B4 S1 S6 Q% a
$ o) T: P+ Q m. N+ e t server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);+ _, ]+ l: a4 {/ I
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
& Y+ E3 A5 Y; Q- c/ u7 L server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
2 R: I& A/ w ]7 l server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;5 B( o3 [: C, J8 L+ P
I% S5 q. J8 M5 d m8 W- t
memset(tmp, 0, sizeof(tmp));
9 @) ]' b# W8 m% K! V A4 } sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 1 U3 o0 [. p, |. \; w
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);. A: B: X! n" W/ Y; P, s
server_msg_send(server, APP_CMD_LOG, tmp);- o6 B6 q9 }. S# f8 X0 L# K1 l* }8 b
, r# q8 U" m% h% i4 \1 n0 f% e upp_error_count = 0;
8 e$ e4 _2 k5 D4 ~: w upp_dmaq_int_cut = 0;' P' I. Q* k k [
// fill in data / m) a7 @- E1 {
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); - I, w) j9 {1 ^0 ~4 P/ x; d
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
& j& N8 [: @% o# T' S0 D1 C; }8 h, S$ n, b1 X
// wait send success
3 r& ~! V* _7 I6 H" ] while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
- Q9 R6 {; P0 {+ f# u" `! ^0 k' Q! }+ y( G
// make data node in free list
6 {3 J4 T+ K6 J3 d& z( ]" l& ` ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
+ V5 P6 J! ~' q server_msg_send(server, APP_CMD_LOG, "upp send: success");
. |% Z/ G1 {9 a7 c9 m7 S }- d* x ]: F) {1 m
return true;0 g1 q2 S$ {' G& r& ]& @% L7 h
}
9 `- b' M7 W3 A8 T
7 @' H! }4 a }, l" |' ?7 g G: f: s: S" k' g& W
; M7 B$ W5 _3 P; Q. x3 \( ~- K% D2 f% e
3 U6 h! d4 |: S2 I1 S |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|