|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
2 c0 ~- L4 Z. {7 h/ z2 }( E
- q/ p- M' S! o3 D问题描述:
+ D) v) t: \; d* g在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:9 C- b V" Z, P2 ~/ U; y
! K. p( m3 v' G/ E/ d9 K" V图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。' z+ N/ l: z w; h# E2 o( S" c
; f# o; j! X, Q2 n1 {3 l4 p测试结果如下:
: N) B# Z" u+ x0 R" p _4 k138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
6 G6 q* J9 i2 c0 H) R
( |. M1 |/ _1 d/ y4 p- k+ t3 o8 O" E! a7 {8 |
备注:7 c9 n. _) }9 g: J1 V8 f
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?9 C/ O) V5 N0 l; h( p# k# }6 |
2、相关代码如下:
9 `8 L$ _9 ` G//UPP DMA缓冲大小512字节5 X& U# B2 v0 I$ y' {
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍2 }9 I. A" @- s1 m8 b; L
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT2 | b2 V& F, Y
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
0 l! t6 J7 K- [6 A+ n0 b
. i+ I9 u) L! m3 X
- c# a0 d; x8 Z. O//upp接收、发送buffer# [4 U1 p2 T9 u: D; D" {/ ~
#pragma DATA_ALIGN(upp_buffer_a, 8)) Q) ^: f; S D2 o) S+ C* E
#pragma DATA_ALIGN(upp_buffer_b, 8)$ Z% J) `- |3 B/ H; T8 y
+ e9 `' R" J( j1 W# G
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];" }0 c. i$ k1 z% Q* [* W8 B! K
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];3 _- [/ u8 S2 c- {+ i, Z1 w
9 m3 k4 K: V1 |% P7 \/ y0 W% L, B/ z
( k5 ~3 s$ M- kstatic bool server_upp_data_recv(Server *server)
/ D; D$ R+ e' |" z6 _' J{
" |1 ?; Y. L5 P1 P- z, G. s2 v if(server->upp_channel_a_recv == false) {
1 n; D: b' L4 Z& d3 B* L; A( O server_msg_send(server, APP_CMD_LOG, "upp recv: start");
2 o' P, L0 z8 l; u if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
$ [/ B H. P7 M server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
4 V9 O5 j+ I( l
* L7 }* x& H/ j: [! Z2 c) X6 |/ z1 a0 i6 G: e
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
/ }9 I+ F8 x9 @' d) p# F1 c/ J* `6 Y3 }: e. F: |' w
server->upp_channel_a_recv = true;//
3 ~% D7 N' m; n' v% X server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);" m0 o6 f# m( {) O6 D1 o6 P ]
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
/ R5 O+ X" J( w1 b' l" J server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
1 K& ]9 ^6 S2 _3 n4 | c% R# g% h. n server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//, d9 z& n5 y4 C! P. Q- a" }* F
( m$ j# [- U% Q' q. E4 K upp_error_count = 0;) `: |2 Z) [: U$ g( R( |! M- J! N
upp_dmai_int_cut = 0; K8 W& P* q" i5 g% P3 I0 k
6 j- }: N# d/ `. \ // fill in data
5 c) O7 H/ Y* _/ `. V( P5 z uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);# d. w1 k, n7 o. d8 s& w2 i2 K1 P4 H
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");" N0 H- ~1 r# V! j* ]/ s
}+ ^; N1 F% L0 `& {) T. Z/ V9 Z
}& I( o9 K0 `! x) M* C
else{1 k4 t1 M5 C3 @( g8 o
if (upp_dmai_int_cut > 0){
6 b0 ^2 h3 {# R DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);4 z# ]; o$ ?# F
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
) Z; C7 g* z/ v0 F& A6 o& k- W. W7 R- U6 X" S& P7 q
( Q2 @* l! q- s
//copy data to upp_recv_list_busy6 U+ w$ |* y9 B: G2 ]1 \
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
2 W& b! `9 X0 R2 k0 {3 M
' L+ U* t) D) _# T; w7 d /// ]3 `% m& j3 @' h
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
# f7 f" c0 W% r9 J9 Z+ v
& p8 G" N! Z4 O0 d5 C; g& s% m# a //
$ \8 V- x% w/ N! a+ d server->upp_channel_a_recv = false;//
. v$ P( d2 J) w9 k- N% h5 ~9 o) K
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
% {) o; I# i$ N# V& R: x }" [: F1 v- U' c4 [9 `4 S
}' n3 F( p, B5 Q( c p0 C
) n. }& N+ C4 e$ F" S7 i
" z5 @. T+ c, k, f5 J* R7 u2 v return true;
# U: v& |0 ]7 G9 A- i# Y* [}6 [! Z5 ^" u7 j! z/ r! K
' t; X* b- O ]' x
static bool server_upp_data_send(Server *server)
7 n+ U0 j }/ X( c9 I9 q- |% _9 i{
3 \, s: \3 D8 A: E if(ListMP_empty(server->upp_send_list_busy) == FALSE){
; _& E" A X$ r* k& W DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);1 i l, e, n2 V9 i* X$ H
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
$ l- ?. E1 ?" V" \ e" F( O char tmp[128] ={0};0 I+ r! m4 H; Z, l' @8 G* T
1 y1 j; B0 A/ @: a I server_msg_send(server, APP_CMD_LOG, "upp send: start");
( ?0 ^5 |( q% T2 D U print_log(server, data, 64);& C# P; ?. E+ H/ q) }$ W
4 Z9 l# H9 K' O; \) A
//
$ y; o$ E# R' u7 _ memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);8 J+ E+ [6 k2 D' u) q8 n
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
9 U6 M2 C9 `+ Q& o& B8 W# K print_log(server, upp_buffer_b, 64);, X/ O% @9 v9 I+ s; k0 h
6 v1 I* o; H' [ server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);( V8 ~0 l+ S+ ]0 Q
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
( l" I5 V" Z; H) j server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
) x Z2 G( q+ f$ T. C& u9 _* M server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
% n# W; I& u' V& c% a
: W- }0 H0 u1 ^4 y( M" K& B memset(tmp, 0, sizeof(tmp));
& O0 M- ^6 m/ X# v3 e/ q sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
2 s" T; ~( J8 V L sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);! c8 P% F5 q8 b1 k" I$ l7 D# c
server_msg_send(server, APP_CMD_LOG, tmp);
0 ]6 k* l+ \( V9 q1 x8 N: }
6 ~6 w; H7 w0 b, e- C4 @2 y upp_error_count = 0;
' g5 \, |0 \2 g: b; Y$ k upp_dmaq_int_cut = 0;. Z4 ^9 h3 [6 d2 m4 D3 ?7 b! h" j3 k
// fill in data
( J4 b) e+ u9 [9 w. H6 P5 ~" N uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 7 Q2 l, Z! k8 V/ r
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
3 P# P; R5 N' u2 F# V2 h: \6 U2 c% @2 Z- @, N
// wait send success7 x4 `+ R9 M1 |5 T
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 1 E% d6 L7 W& S( D3 I& G
9 d2 v9 n- F" Q4 v9 ?" t* b! [
// make data node in free list
9 `( S2 u- g! V8 n6 G ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);6 [3 h- |7 s, U4 k
server_msg_send(server, APP_CMD_LOG, "upp send: success");7 B) h/ t7 R% \
}
7 T- p& P% s9 y' J return true;
- i2 D; \' X$ Q- H1 P; F} v0 f0 K; b7 S1 b2 E" M0 q
# ^* ~# f' _! m
, r1 f2 h+ q# i( ^1 p; D
# z1 ]2 w4 v- } I" e' F. v! z5 V, r g
/ k( }" e0 Z: `; U' a. _2 ^% q9 D+ s
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|