|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
6 B& f' p# B# |3 S T
- g% ^3 ~. ?' v8 a问题描述:
) m1 w. [0 U# M在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:( ?' K% {- L X q8 d( N% E
" v9 i! l4 f6 _, P; d. w" h0 u5 @0 c图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
* ?' a) a1 C8 j4 T: o
6 Z7 R/ |0 C2 s w) M4 T. ~- [$ Q7 Y测试结果如下:1 z/ h/ D8 ]( p+ Z f6 C
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
0 y1 r O0 R" c. A& V! ]( L
8 z0 w$ |5 F* J: w2 t5 `3 n2 l
V- U! E* |. K1 ]2 h备注:
& L- G7 f, @4 X8 v0 d1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?0 t& L8 [1 R9 o6 b
2、相关代码如下:
5 r" H& g$ R+ y//UPP DMA缓冲大小512字节
" U. j0 W" ^+ E) Y6 q#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
9 t% x5 [9 j5 C#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
: Q# _! Z6 [) Y; \#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)0 m5 o3 ?$ x! L+ y! d
7 Z7 U4 E q6 G
3 J$ ^7 Y9 B, x+ i
//upp接收、发送buffer4 y$ w7 I7 N M' R, W& Q
#pragma DATA_ALIGN(upp_buffer_a, 8)* r2 Z* E/ K' S' r
#pragma DATA_ALIGN(upp_buffer_b, 8)
; A4 K- M/ Y% ?
4 s. t6 m' x1 tunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];$ x: V. X8 k5 c& K
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];* H, Y, [9 U; v" s
2 |2 Q- g- w6 v' d) c
# y2 z$ N- u. q1 }7 P
static bool server_upp_data_recv(Server *server) : r9 \" C" t7 e& f$ I* a
{- ~; f2 A$ I) d, h1 ^# V
if(server->upp_channel_a_recv == false) {
5 K( i2 ?8 d6 d& A7 ^6 ? server_msg_send(server, APP_CMD_LOG, "upp recv: start"); O* a& W4 L2 ?& x4 j$ I$ o/ D1 ~( ]
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
9 v0 q8 J D! h) y server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");, L3 w4 V* d4 \! \) i
& W' U6 H% Q- d) B/ N! k
& C' R" M& M7 U5 [8 N+ I8 w" P memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
6 E* {- r3 @3 x' M" W$ T+ ?0 m2 B
server->upp_channel_a_recv = true;//
7 | Q- }8 J; o: r6 T& _ server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);- T0 D8 P4 ^% q. }# J+ {2 H
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;4 H+ K1 U3 z' H
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
7 w& C- z7 `; d) u' j$ O1 ` server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//2 X( o) G& a( W
+ e# k! d( s% C: A/ a. r upp_error_count = 0;
5 m; j5 \* ^) J7 |3 f1 }7 L$ } upp_dmai_int_cut = 0;( }3 L8 G; ?/ F/ n" a6 T
% L: \* X8 u0 r; y // fill in data
$ ]) {* ?; U, c- i$ w3 h& z- n uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);1 w7 F+ B6 ]6 `; f
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
& N' B* t8 x6 m2 k- U }; ~. i0 `6 j4 ~ ~- N6 |6 C* N4 d
}
, G! k; L7 A5 S h+ a8 p else{" F6 `7 m2 x. B( a" @4 X* ~
if (upp_dmai_int_cut > 0){5 h$ Y2 }# W- g# ]0 z' ?2 }. P+ i
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
/ `, V& |) I- E) Q/ f Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);1 Q% l5 {+ J' ^4 J3 L, ~- i
" w1 z: D2 u( N: [
% ~ ?1 Z s; b" \5 {8 E+ i1 b. I
//copy data to upp_recv_list_busy# o& I# V' y2 f2 M! C! m
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
! x, b8 ^0 _. }6 C) u: k8 q9 w% W* G& _
//: q$ l" E2 o& U( {" {/ S
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);" T4 I; ]8 s! J6 _1 y
- J1 g0 {$ ^2 r( V: d" F" Q //' l1 @ ?' h( k- T* [- D
server->upp_channel_a_recv = false;//) u0 u/ ]( e9 G/ E5 ^
- i, s E h7 d, |; j+ R. X( D; i
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
: S6 ]! r9 p5 m; N' d& ] }& r- J1 b) H) m* k
}7 v. r- l1 j7 h: m3 a
/ T' p7 k" d5 w9 [) D! X
; V4 h% t4 I' m% M! m return true;$ i+ L0 X) h2 G9 w7 |9 r V5 W+ M
}8 S. e, J( T' j- B, q* ]
7 k7 K% U* M1 y T; @6 H! z# N/ u
static bool server_upp_data_send(Server *server)
! j: M/ O% e+ c; q{
/ d' D2 h" @& A. S" c" Q% H if(ListMP_empty(server->upp_send_list_busy) == FALSE){ x8 C$ U* [! Q4 c) {
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
0 K' G. l# D+ g# H' U* n+ f unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer); q1 h( h- F$ c3 A% ?9 v% b4 s
char tmp[128] ={0};
2 I) P* l7 n, ^* u- A3 I2 S. ?4 Q: a! V2 y ^( J5 ?
server_msg_send(server, APP_CMD_LOG, "upp send: start");
/ i5 J; G4 O6 a9 P2 y print_log(server, data, 64);; ?0 M1 t3 ^/ `- d8 s" p6 E8 l
1 F" a, S* [( p% j$ w. p. Q //* `6 ~0 T1 g' L
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
. C2 a) ]) s6 G( X memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);4 T2 i% X" H$ m2 h
print_log(server, upp_buffer_b, 64);
) n: Y: ~: ^4 T3 P3 W7 k7 C3 h: |% t2 b* g/ O7 C7 z+ h( W
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
. T" B6 P; ?& ^- ~- ?- M5 D server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
. `# d( B7 k0 C i( y4 { server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
; v* ?& g5 e2 ?- r! y server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;) n* @; A% g6 S- G
( @6 g0 a+ q# c memset(tmp, 0, sizeof(tmp));
$ h* V# a5 U- d1 }1 C7 } sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
7 [8 {: i+ n O4 { sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);: x- L R* l/ y
server_msg_send(server, APP_CMD_LOG, tmp);) F% w3 k$ i$ n
) L* v% F/ w- R4 W X upp_error_count = 0;
* b: U7 W! O- W: ~( ` upp_dmaq_int_cut = 0;$ O, e$ q6 z! o, n; G$ P
// fill in data & }& I) |! T+ R' h- l
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
+ a3 ?+ \4 |# ]; k( R/ r- U; z server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");, V, [& j; l9 c, X
" Y1 ~- t) L6 T {, Y+ h
// wait send success
/ B$ C2 T- M$ l. B* S while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ! ?$ ?4 c6 d7 R# l# G
|3 w1 E* a( b, H' k' L4 Q* y1 o& L
// make data node in free list 3 E" f& P) f5 P% g [* r; x2 P* Y' b0 |
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);+ q6 i7 q/ j# V8 C; ~9 S, P0 H& d
server_msg_send(server, APP_CMD_LOG, "upp send: success");
- A5 N( R9 `* i6 w9 _/ { }
, m8 D2 V1 B$ n. f return true;- |6 {# Q8 }) f# y) t2 Y, E @2 ]$ ?3 N
}4 M4 q# d) n$ A- m
" o$ \6 G2 A$ M$ K; x1 L8 a3 k; Y! G- F9 s% H5 g2 L
( g5 x; E, H) G
8 r" E$ ]! F A0 Z+ u' j$ N6 {; A$ B. {7 ^7 ^+ J
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|