|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 8 q% @/ ?' [/ ]- I* l4 F
8 _4 x: S' N" {& R& F6 E! d" J# @, F' J问题描述:
( { F% {# Q {9 p7 k" }# Y在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:7 S* z& c$ t/ W0 F0 Q9 o
6 p" ^0 A: B ^图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
. ]7 {0 V1 p; m- V% z
4 e$ Z; Z$ ]* L( P" \测试结果如下:0 H) N/ W: R( Y' D4 @
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?: o$ o1 }1 |/ ]/ H! H
5 Y; K c- h- |# z
, z! W/ ^) ]) Y) U% M# s备注:( X4 ]1 a, ?: ]6 p
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?4 w& W; f- U3 `2 G( X2 R, y$ F8 h9 d# I
2、相关代码如下:
5 ?9 D7 }9 T. S//UPP DMA缓冲大小512字节
; p& p% I) j8 I; a4 K9 E, `4 o! c#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍9 L: k) O l3 T; ?8 v
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT' `' ^7 M$ @* h/ I2 m6 ^
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
# o: o% c) n* N* Y! N: ^$ S5 x4 O9 u$ u3 z1 v' X
5 R) k' L1 C9 X: \, ~" I. H//upp接收、发送buffer
8 K0 A1 h8 S- \. J5 b#pragma DATA_ALIGN(upp_buffer_a, 8)
- S1 }) B0 E& D1 @- n#pragma DATA_ALIGN(upp_buffer_b, 8)
( m! _6 s5 J! S2 O( ^/ m' U1 i7 F
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];6 ?- m% x# r7 V
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];0 G" o1 i2 x; e
! _, z% s1 q. e- m2 Z3 M) Z% }" q
) B, f* {5 s9 _9 w) d- ]& f9 m! Z9 ostatic bool server_upp_data_recv(Server *server) & ?7 I" {) k# u; g( c, @# }
{) T+ D! B% M5 X4 T8 @" J, R
if(server->upp_channel_a_recv == false) {+ j0 S; @$ D% x8 z2 a+ M U0 |3 y
server_msg_send(server, APP_CMD_LOG, "upp recv: start");! \+ B) Z2 f: c6 o$ F" o% J$ G& B, E% w) `
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
. X! h8 J6 k0 z, n* c. G8 G( m server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");# s0 c( s) O$ S# _6 z- S g1 u5 P
4 {3 V7 Y8 r$ m' J; w
- P# A2 E5 Y6 W: w; l: v8 }! w memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);1 S: E3 `9 h8 P% D
* \' N( d+ p( U0 d
server->upp_channel_a_recv = true;//
+ E5 N( v4 P- R" `- d server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
$ G! |- B4 u" U1 N0 O W server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
& p, w. q' P# b: g server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
8 S m5 W" v. N% f. f server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
1 _' ^ ~" |0 ?% n5 }9 D2 n0 ~0 e- `' `$ c/ @& p+ b8 R4 X3 v2 R' n
upp_error_count = 0;
2 [ a$ I3 h4 `0 _* [ upp_dmai_int_cut = 0;
# s; S7 V% @, w6 _7 z! j; E1 P# E! w' i8 d- K+ w
// fill in data
% n. E& A7 n' u+ j7 q' [5 Z) G uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
% p/ W0 B b& ~# g% n; n8 ~8 m server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi"); g% u* U' x) k \2 H( ?$ d
}
3 t+ t: U/ H( M+ V }3 e9 r6 | M/ ?6 X$ e G: H
else{
- I* M6 C, p* _! X5 V9 p8 ~5 n if (upp_dmai_int_cut > 0){
% t) I9 s. ]+ L+ n2 s$ D DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);0 W9 K+ `! g. F# u
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);# K# p6 J$ r4 f" \8 L
9 A# S% A [* o" x ~/ _
% Q8 Q1 n# f& [, @' E9 A //copy data to upp_recv_list_busy7 z& c4 R& y# E. `2 r0 Z
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);. i. U: N I' R7 m
2 Y% R3 r( x4 [1 g- x; D# w/ [ //) ~7 x1 Q% B6 X% E
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
, ~9 I0 k0 K5 y
" a4 x6 ?, k6 s7 B8 I- S //
) S$ O' G6 |. o! M server->upp_channel_a_recv = false;//9 u# V) \* y# J( K C
6 H$ \2 g9 o, B; t, O
server_msg_send(server, APP_CMD_LOG, "upp recv: success");9 n1 q4 E9 {( D, b2 Q) S3 E' K" V
}
0 S) a0 X% g6 s( E4 c; p* D9 N }6 o9 M8 z' \0 g) N9 j( p
; @% k% P- l% ]; B3 u/ b" L
+ ]6 V) |8 k1 _$ `/ S return true;
5 }3 i! B% I( j# _# [" s( c}
! T' V+ i( k" Q
7 [5 J4 {/ o$ U- l# estatic bool server_upp_data_send(Server *server)& Z* n- i: _+ }
{
* O) L4 e" k; x7 p5 c; \ if(ListMP_empty(server->upp_send_list_busy) == FALSE){
, p' f( [& S. C# x5 f DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
7 Z& U% b( e, A5 w* L unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);: [, E9 D) L: e! }# J
char tmp[128] ={0};
: ?- a, P( k& L* p! F& @
1 P& k( k) |+ X$ I server_msg_send(server, APP_CMD_LOG, "upp send: start");
3 | I% [' ^1 H print_log(server, data, 64);7 p' n4 }, T, ]. p) h. p# e
5 ?* ^2 R/ U4 g0 t- o3 T
//
+ I. L+ e9 P# | memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
2 A6 K" R& D: g" B2 o3 I memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
7 ^$ T! B, k% m3 P% s" n* Q print_log(server, upp_buffer_b, 64);5 m2 P1 ]. Y1 Y: A+ A' }
" c* d4 A# j; ]8 Z+ z$ Y server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);% z7 {" [) h5 q3 X3 ?
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
' k9 c& I/ Z# Z* A) T1 b% F. R server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
. x- w) T" n$ i server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
1 }+ w. o, i! Z0 n' o! ?8 l3 J! ?" c& w. N
memset(tmp, 0, sizeof(tmp));
+ z' J' s0 Y. r: k$ C% S7 P sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
( s; u9 Z9 d9 ?: h! K* F sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
# D2 }5 L$ D6 E$ r/ C server_msg_send(server, APP_CMD_LOG, tmp);. N% F2 ]- W) g; G
6 e0 v" H+ j( @( {" }1 \* c upp_error_count = 0;
' Z- C2 ~2 k& `5 Q% b' z0 F" E! H upp_dmaq_int_cut = 0;6 A4 x! h' P( j5 c$ L
// fill in data
* m g7 _( O8 Q% J7 E uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 6 w3 U* U+ W& c9 l2 O, n
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");6 L, y2 X# o1 S; D& k q6 n3 v/ H
% [; o$ A6 \& Q5 h
// wait send success+ t+ m: b9 Z, q6 Z- s3 m
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 3 U$ D/ M# ^2 f' }" d$ A2 R5 B
8 F7 Y0 `: V4 E; `) X( U
// make data node in free list
3 X9 b N( G2 ?# p2 Q ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);* M5 ~+ ]8 N, G* q5 ^ i `. V( E
server_msg_send(server, APP_CMD_LOG, "upp send: success");
4 {7 \, i* h6 \. X8 d }; V& h5 S: P4 Q) j z9 d8 ]
return true;; w+ `# z+ [6 s. Z/ Z
}
! Z1 m2 A" u# i0 J7 |2 o9 `& U2 a4 i) O+ ?
3 ?; x ` R+ q# X& K3 x8 \
' z( P. I0 y% n0 I9 l
* O! I& u; `/ _8 o) m7 `6 Y+ K: S$ F k( k3 ~: ]: `) {. f
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|