|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 8 K2 \& [: @7 A. b7 @- S9 s; m
: X! O; m+ K0 i/ L6 y问题描述:! v- V1 w& @9 N4 _
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下: W! f' @6 ]" F- L+ ~1 f/ L- N
* C+ w, P0 H f& ~: s- Y
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
3 e/ O# _4 M: T* b2 t3 A6 e
4 K8 s" N2 q% k- U# m4 m& ~3 g测试结果如下:- F1 k! m! D: Z% `* A4 x% ~
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?9 A v+ v. z G P, b
7 I$ f1 {6 i) F: }* G+ A
2 p8 N- q P& p4 t4 N \备注:: {" G: w5 z/ l) f5 C* [5 |
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
! N5 `8 q8 Q- v. D1 D) E2、相关代码如下:/ z' h) l& B3 E( T( ]
//UPP DMA缓冲大小512字节- Q9 v/ \' X1 \* \$ Z: x: {
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
; L N5 X$ @: Z& {#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
, E; L% A6 J- ]# i2 o#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
4 P4 ?- w. Q' i
9 w4 S+ t3 l9 F$ C- ~8 ]" Q+ E! s2 C- b8 M
//upp接收、发送buffer
2 w5 c& H6 _# u4 T#pragma DATA_ALIGN(upp_buffer_a, 8)9 N) [3 P- m# X9 y/ F; I7 l
#pragma DATA_ALIGN(upp_buffer_b, 8)7 P6 X5 [: L7 v
! I1 ]. N Y) k! _4 H
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];6 o) }$ N- K2 ?5 K
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];4 R. Z' t4 H }5 X; \2 o2 }- [7 f3 ]
& Q, \: [5 |3 ?# z- R
! f! h9 n# ~$ U. R/ l) r2 ustatic bool server_upp_data_recv(Server *server) ' o7 \/ R9 ^( T. @1 g. j
{6 g; z- h3 w0 x
if(server->upp_channel_a_recv == false) {
& {- U6 {/ w% ?8 J9 U+ V$ c7 A server_msg_send(server, APP_CMD_LOG, "upp recv: start");' T$ q5 w, x: @+ W7 _9 \, Q
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
, [1 d& e# k2 P, H: p& E" f* x$ M3 ^ server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");4 W9 Q; B$ P/ Y' D
6 ?1 {" h0 I2 n8 {; }5 N+ @
7 v& s1 O6 Y/ h s memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
* F2 E: o T. U1 B% N: d, X! W' ~
server->upp_channel_a_recv = true;//; c3 i; A4 V) s: Q: \
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
) M- j9 |7 B. `1 _, G server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;4 h9 T9 ?$ Y) J. ?3 u! v
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
% ?; y9 J1 u0 y+ B server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
3 g+ S1 n+ l$ P* ^( G# y" T
! S- j+ \9 N% Q) e! F+ Y% e upp_error_count = 0;
1 k- d1 w: K7 Q" I( G. Q upp_dmai_int_cut = 0;9 E; e* `, u9 W$ ^
5 y7 E: d) t; D5 P0 O, H; a
// fill in data # q- |% j9 {3 Q
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);6 J: l+ Y# e+ R; I }! ~
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
7 M+ H0 t' }; e8 G }
" k" \3 Q4 w, w2 ^ }5 M9 g& i2 |* K* i
else{
0 B( E% M/ n, ] if (upp_dmai_int_cut > 0){
; y& W9 X1 C6 x' n! X) c DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
2 x5 Y8 C: V2 m1 G Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
$ N1 x* C8 }5 S5 x5 @ k, B7 t) q# Z# P- T& F
- \0 J0 y" {* B
//copy data to upp_recv_list_busy& k, g. f' @# T1 P. J
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);4 N& J0 c# o! d
( K& I! D& Y9 D* [. O' F( P //
n* x/ e% L7 y2 k6 C ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);: [# W8 W5 u( G1 W. a
. c6 `# |7 k8 t
//
7 l( f! K; ]/ A/ q6 |) |! d server->upp_channel_a_recv = false;//
: x& K- h( Q" T. ~0 T5 S7 h) I: G! r( F7 w" [
server_msg_send(server, APP_CMD_LOG, "upp recv: success");3 Q4 o! ~ k' \1 x
}% j* w6 T% M8 y" z5 Z! D4 A
}
! f2 h2 Q2 t* G' k. H5 d
1 i0 i" I% c0 W- U0 Q
: U9 d* @' y' { return true;' D8 ^ M! J8 d$ o
}
4 V5 R7 e' M% c
. U1 ]2 a1 J# X; Nstatic bool server_upp_data_send(Server *server)( V3 k. y8 I% n
{, ]- t7 [4 ]" k9 o
if(ListMP_empty(server->upp_send_list_busy) == FALSE){: E) w" V( i$ N# r5 C. {" J
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);9 ^7 V+ \7 d/ z& t& B6 p& ~
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);( t9 b9 @1 X2 G7 L* N
char tmp[128] ={0};7 E, `* G6 ~$ }: ^: R. ^
% U/ X0 K' m# ^
server_msg_send(server, APP_CMD_LOG, "upp send: start");; X/ T% H) x/ | G
print_log(server, data, 64);
0 v1 [& a( G5 v$ s1 w8 _6 E2 c# I5 x5 j$ z7 [
//
* |6 l( p6 @! u$ E3 U2 i memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
; Y& l; \6 P5 I3 I U' B& E memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);' F6 N; X& f* b
print_log(server, upp_buffer_b, 64);, d6 R. e% x9 i' Q {% q
: J# M" W# Q. m& ~ N; m server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);% L# \4 G% f; w1 v9 R2 c0 l% m! y
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
/ ?2 V- ^8 z5 _( ] server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;3 z {: b" J: O7 |
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
* K& T0 @, e, z( d9 v
0 O z8 S5 ~' i( }* ? memset(tmp, 0, sizeof(tmp));
8 e' ` ~" H/ u9 n9 d sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
3 F- `9 g7 E, n sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
" m+ _/ R1 e* k7 W/ N server_msg_send(server, APP_CMD_LOG, tmp);$ L# A) `( F/ p: ?
! `5 @: ~, [% H
upp_error_count = 0;
4 l8 c3 _2 J5 M- e- @: y) U upp_dmaq_int_cut = 0;
' Q6 ?. W$ R G$ y& c- n // fill in data
9 n2 I' V" w2 i9 T0 {0 g uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
$ a; P& t9 h0 x server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");( m4 `, W0 K L5 L- S* @ k
5 i* c; W7 K, L // wait send success- g# F- u1 K: B* N' l
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
) O1 o8 X: d! r& ]$ p1 Y9 J- T" C
// make data node in free list : y2 v% ]' D7 v
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
% U( G) R3 s' p! Y8 q server_msg_send(server, APP_CMD_LOG, "upp send: success");
X& x; w0 s+ o; b }) w+ I. n+ _( A9 D* {2 c
return true;0 {8 m% \- E/ ~9 ?- U
}
8 {* [2 i b3 I" ^5 U& h# b
$ E, j% [: H9 o8 |- ]1 B% z7 o. C) B2 p) K. w/ ?7 }
" m$ |+ @. `0 ^7 c# x, o# h2 Y6 _
: p3 o# ^1 }. U* f0 w. a; ~6 ]" Y5 b) ~$ Q- N" M
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|