|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ) y3 \1 f8 r5 W$ \
; k7 N5 Q6 {; t4 M& W. d
问题描述:! n9 r( e% v& u% G
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:8 Q! y- @2 V$ q6 E) F2 o
; F% C& }- @; U1 B; i% ?
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。: u% [. m& |7 Y/ _+ Q- ~
* ]7 d4 w$ o* D; u0 E, J
测试结果如下:0 s9 ~- C; |' h( M
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?# `! w5 X) B+ l9 N
( d4 `/ j2 F. s0 D9 X; b+ E
8 K$ g3 k- D( |5 U I0 a备注:
3 U3 @, B1 A% |# j; }1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
/ Y1 s) y8 p: f/ B' r# v" Y2、相关代码如下:
1 x1 r2 }! w4 Z& Q& @4 J* S//UPP DMA缓冲大小512字节1 b* O' |# C, C0 s n5 X$ t. A
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍) U/ X& E% N9 n0 i' B1 v
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT3 t5 J' ~, _4 y, s( P: w. g: H! a; e
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)# r; f) @4 w4 B% v, c2 I
6 z' e: f8 Z* R4 P3 h
: d, k6 i. x/ x* ?, l8 b2 f//upp接收、发送buffer1 {- U& P7 G3 P0 M4 ~
#pragma DATA_ALIGN(upp_buffer_a, 8)
# G: L+ ?% z: }( R( @) Y' ^* L; i: b#pragma DATA_ALIGN(upp_buffer_b, 8)- |" l1 W, N/ \1 `4 z9 y$ @8 r
! P/ Q# `6 @. Z/ F: j) Cunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];6 Y; N, `( G* E+ W! H2 A, j) [, x
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
! K; {) Q; L7 o3 V3 L) j: T0 I+ R ?$ V& j6 U/ D
3 S! e2 D9 I- t8 y2 G
static bool server_upp_data_recv(Server *server)
! b5 z! A7 q, D2 D$ b$ Y. C7 g3 ?6 n: \{
( U/ T" G5 b4 J! R* Y if(server->upp_channel_a_recv == false) {
. M4 [2 w5 N# b- g% |, b$ J server_msg_send(server, APP_CMD_LOG, "upp recv: start");
& E3 e; p# D3 v( n9 E' y if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
7 D, ?, a! ]6 k( r server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");0 v: Y7 l4 x7 K6 i
8 |9 Y- T6 e: Z
) D% E* Z) I3 Y1 m% Z6 K% @ memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
9 D: B2 f2 o3 L% p5 u" @1 D
$ V7 C' O! S; C9 P" D server->upp_channel_a_recv = true;//, J8 L# l, Y1 R& ~ e) G4 y
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);# e; T8 B" f' O- L$ O
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
; D1 j! M* i8 m- Y( N, X- o server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
2 w; Q/ z) a* ?% Q" Y server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
, y9 o: t# o/ t7 u" I3 c* R0 j9 j# i) j3 b
upp_error_count = 0;
3 p0 r. X# }, E5 P' G. r upp_dmai_int_cut = 0;+ ]7 f# Z3 D2 Z g2 t7 ^* F5 j
* D$ w1 y$ y. i" A* f( }- @ // fill in data
6 c4 N9 u' `. v+ ^, T3 ] uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
4 b4 y9 H/ ~6 F3 b& F server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
$ b8 Q* ]& B' I- }, r8 { }9 Y7 B- `4 F3 `7 Z7 }
}
! K4 h; `3 G- G* V H: E+ F0 Y else{( ?" l( T" c8 E2 e3 j
if (upp_dmai_int_cut > 0){
; g- L+ m/ K/ A) ` DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);+ ^* m$ L6 h5 c4 u6 b4 m
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);- l$ ]. b0 ?6 r4 L$ c- b) U
& k7 A) A$ D' Y+ W+ F8 V
/ \6 Y; A; \3 g //copy data to upp_recv_list_busy# N# x3 e$ ? u; ^9 j& x
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
, ~6 P/ A5 B1 J: }) |( r- z, A: @8 H8 R4 o7 o5 v
//
/ P9 V4 X9 A7 y, `/ ~( L ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
1 d0 ?& U8 x/ s& q3 K7 O/ ^4 ?/ Y0 G
//
9 I+ _& b" p8 @% q( q8 B server->upp_channel_a_recv = false;//, g. k) x; p5 d7 s1 o4 E+ H
2 D9 Q/ _' ?' x# N _ server_msg_send(server, APP_CMD_LOG, "upp recv: success");
7 i6 F5 z- [: F7 e9 A; N& N0 f }# D! I$ F" z% A% g2 H
}
* S4 ^" ?& j1 k. \ G
5 r& K* v7 w, M
7 e* O$ {1 m! {3 _( e% h return true;" M$ d r8 h' X# K! b3 s
}! Z( n) Y7 V! s, r7 I
: \& D3 I7 }, a5 Y' t7 bstatic bool server_upp_data_send(Server *server)+ o5 N: q0 @* j+ `
{
+ W; Q" l9 r2 p! u if(ListMP_empty(server->upp_send_list_busy) == FALSE){) i- `* [! t6 g# d1 z, \. _
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
" I. V f, m4 N5 V0 v5 ^ unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);2 K0 A/ v% @6 [7 W+ o2 Q6 g
char tmp[128] ={0};
' p! u* b, _: v$ t5 Z6 p7 \+ Q" g' x0 L& I. k
server_msg_send(server, APP_CMD_LOG, "upp send: start");
5 P/ Y0 y- l1 s, W' b print_log(server, data, 64);& y% Z$ {6 k0 V1 y
0 {2 _2 g9 T- {
//
6 K A: \: n) ]/ W# J9 d, V! y- j. V memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
+ Y0 J8 }1 Y2 q2 a5 n) C3 l% g9 T memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);5 y9 K3 l2 @: u" d# D& s0 B
print_log(server, upp_buffer_b, 64);
# N! I d- O0 B( |5 S' \9 |1 l9 b- w. d- Y+ n6 M. i6 N- [! ]& }
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
5 |+ Y" G; j% w# D server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 7 O9 B/ w: |, J; `+ [% p! s
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;) H1 o" z; a7 D! F
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;7 `$ n9 ~$ R/ | J8 i( \
# z( k( M( n; R0 C0 U* l+ q6 J F
memset(tmp, 0, sizeof(tmp));; m" ]& _! G* Q8 H
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", $ s' @% w0 X! b5 H6 W+ _& r
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
, F( N+ [ D) t+ z/ ~ server_msg_send(server, APP_CMD_LOG, tmp);6 v4 s8 A" x# L$ j- E
% M, H C, U, A
upp_error_count = 0;
- i5 D, k. f( ^$ v% W upp_dmaq_int_cut = 0;2 y# w# B8 P$ a- M6 h, a
// fill in data / t3 [1 G+ c3 Y: [$ a* K
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 9 d6 n; X3 H5 `! t
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
( u3 I; @, t& D; E2 D2 w& A) ]# L* N6 p9 P
// wait send success! v6 @) [9 S: M8 o: L
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ; F. {1 i% s, P: d) L
, K% W1 H! t" C4 T, z' f( [
// make data node in free list + i4 s. q$ f# }1 p7 l4 D
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
5 |3 M8 z% N* N: ?& c; f+ U server_msg_send(server, APP_CMD_LOG, "upp send: success");. w f7 b8 U: G& B
}2 `' z+ n. @6 @3 d+ \
return true;6 g. @1 a4 J7 }( ?" f, i2 g
}3 [$ U/ }( U) M2 g, a
2 s# X4 k- o$ s9 p. i: E& L
8 P, }) ^' H2 r; A; J5 i' q# z: T2 {' u/ o6 l+ {
0 p1 }/ L4 P5 P" j# ]
; K% s6 I* i8 w1 r U1 n$ X7 D
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|