|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 $ j1 z+ c G. h4 M3 j! G, ?
3 a2 x3 N$ V7 ~1 W/ | l( z4 \ M问题描述:
8 m" L- s7 r$ q$ x6 W3 Y在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:7 o6 @6 c) H# B" q/ ?
( _. u( Q6 C0 r4 e" x2 Q
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。! a7 c/ m+ v7 a: f- Z! I" v$ G
( ^7 [6 S; y& Q6 P0 \测试结果如下:
9 G8 W5 M6 F# H- e/ ^* c+ v138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
: E- N( j2 n1 W( x$ M/ h0 G* u+ I
9 m* W8 A; s; S: U/ w3 C. d0 ~
备注:
/ c& `! s6 B% s7 Y7 O: F1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?5 M. i# D$ S, O6 V6 Q8 F3 H
2、相关代码如下:
6 p$ n* f: C/ G//UPP DMA缓冲大小512字节 G7 h0 d, N6 w5 b+ T
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
* H& n' g+ x, m8 V#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT" U @ ^2 D+ X* q# B$ k
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
! X4 k9 z1 z+ t) E$ `
6 ?+ B! q/ \- o( i% L1 I6 D8 x
) M5 T ]9 `! I$ N8 q//upp接收、发送buffer0 T# g) E- g! W: H
#pragma DATA_ALIGN(upp_buffer_a, 8)% t' Q+ i1 T8 M5 k Q4 l
#pragma DATA_ALIGN(upp_buffer_b, 8)
4 l6 h" D5 }, j$ [0 T8 T( ~$ R) b; V" g* [
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];: h' d: a( X, @8 u( W q
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
# x. L, y" {; C9 X: i
& l+ p2 x; A$ p7 I5 P' l. X3 Y4 J5 _( [1 B* ?8 x1 B8 b# ?
static bool server_upp_data_recv(Server *server)
8 k! E% e! |& g9 Y `. D{
% P r3 ^, I1 m4 ?4 Z7 i! k& G! ]3 k if(server->upp_channel_a_recv == false) {% w3 J7 b4 y' v* o0 K
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
4 ~9 @* A5 b9 K4 R; I if(ListMP_empty(server->upp_recv_list_free) == FALSE) {) A% ?1 [9 w8 [: l6 K* ^
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");; H0 Q+ i- x8 `5 o& X/ J
2 v0 K, a2 I6 j, [4 R
8 ?: s0 O4 P7 ? L
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);# i2 F5 l& ], V; `5 O( v
! `; L% L) o: T T/ A( K
server->upp_channel_a_recv = true;//
. w. {2 a; c+ k7 O1 m% L server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);; e' |- Y2 H6 Y% c4 t9 |
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;% N% w4 A e/ L+ ]" N
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;2 h; }2 g! T) t7 k' [ ?, n
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;/// Z+ X) k: I \: {
* r7 o; ^# _! w/ w% U& R upp_error_count = 0;' w$ ?9 D7 V4 o) z& M& L
upp_dmai_int_cut = 0;
% a. e: p8 |! Y F7 ^3 i6 l! C; T, C
// fill in data
4 ]- `, V' y3 u# O. ~+ f6 w% D" d uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);4 Z/ w1 M" H: t$ ^- j
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
` {8 V1 f% e, X; F4 R. |: @ }
1 R- |1 O; d9 b$ z* X }' ~8 s9 Z x$ k# Q8 y x
else{
; [" R9 P/ m7 ] if (upp_dmai_int_cut > 0){$ @5 o: n0 d/ m( P0 \! Y5 M
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
0 z+ [1 |! n6 ~$ `1 Z7 g9 p Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);, C$ _9 U4 z" o& V" ~, X
6 y$ A6 f# H7 v0 b3 L, q% ~9 G2 C: e7 M# Z& V7 U9 T: }
//copy data to upp_recv_list_busy
& [+ T3 S: ?7 X9 G1 e" l memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);9 f, g# e- l* c2 e! P) {; M) z6 G+ f$ N
8 N5 G: v) {7 d+ r //
3 q; M, c6 n: ]. d+ F* J ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);5 S% t3 K4 }5 @' N( |6 _
/ x9 {8 F7 n0 N! T8 m, P0 j
//) Z, Q$ J$ j# ~, G* W0 h! V
server->upp_channel_a_recv = false;// f% P3 k% i- D. j
/ a. B- U' c9 g) U
server_msg_send(server, APP_CMD_LOG, "upp recv: success");; ]% `0 Q; b' y8 _
}
% _4 w8 F9 [3 K% @3 C }
; G/ N: D T4 W
# V4 w: L( c6 O t5 e( e- I
- {! p6 p: v+ u& c0 n8 u+ Y) r' N return true;
4 p6 X' m% W* j# k$ u# L( {8 ~}
4 E" T6 d. ]# p# x4 h( `- F$ I7 n# U" s
static bool server_upp_data_send(Server *server)
. }& q0 a5 S0 J2 ]9 I/ `. V{
% s* [4 L% y! x5 U$ t0 x if(ListMP_empty(server->upp_send_list_busy) == FALSE){& ~+ y/ F) ^: z: [1 G
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
, `! g% a: o! v; |7 z k# y unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);6 @" D" A: a# t! H% B0 p( ^5 Z
char tmp[128] ={0};( ]; y5 k* c- h5 X/ r4 L+ C
5 {6 D7 r4 s; L) c# I5 _! M
server_msg_send(server, APP_CMD_LOG, "upp send: start");
5 V( j! f6 v) F5 u$ S. W& e$ ~ print_log(server, data, 64);
- E- z5 m3 ~5 z }) w0 g3 K9 N( h, ?" A5 Z, ?' n
//
6 A5 k" _. ~1 k( o. U' Y0 @4 @4 P2 @ e memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
) f7 S2 M4 u1 L L1 q/ E9 z7 S memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);! [+ [$ x% K B+ z$ J& B
print_log(server, upp_buffer_b, 64);; }& c! e+ Q7 v2 v& r/ B }
% _4 }/ a) H* U4 w; w0 k7 v server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
9 p. `0 r" ~, ]" l$ r( A server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
- W+ B* I* w6 k3 C+ r* i! D server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
: s, L" ~; R+ W) ^ server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
( M% z# v2 o, ^5 {
, P" e1 V0 L* u" {. l! D: z- L/ v memset(tmp, 0, sizeof(tmp));
, w# q. p2 b7 M! I8 ^ sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", - _* w* G5 D% N/ v" S
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);! D0 Q j4 u: K: l6 \( t
server_msg_send(server, APP_CMD_LOG, tmp);
) j* D% I& T2 T9 O* n2 H
$ F+ `- a T- }6 M5 i1 ^ upp_error_count = 0;9 U+ M: F: a' H1 l3 G3 l- N7 q
upp_dmaq_int_cut = 0;
$ X3 {' y3 T, [: p# H8 I4 _0 k // fill in data
, M; i8 q' T& |6 m7 e: e uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 2 Y. w& S" w. [1 `7 |2 s
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
( e, u$ ?( h6 a6 ^4 q s; Z" }8 m4 ?- s8 A# k; I. m3 }7 `
// wait send success
; N4 M$ ~5 \1 h ^ while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
0 {" ?/ v9 p. ?, G/ d2 V' ?+ b( z# H7 j
// make data node in free list 7 g8 q2 P: x9 t& U9 ^
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);& R5 z, Y2 v9 r/ B& H3 m* a( X6 D' |
server_msg_send(server, APP_CMD_LOG, "upp send: success");
, x9 C4 v; o. k6 k1 O }
2 A4 }$ K* E( u return true;
7 B" T1 o+ K, p5 Y: [1 h! w}/ p3 I9 h+ R# D# [) I) z
4 }% F5 G7 e# i6 c
) ^6 D" m# h4 ~- C) \, n, J+ \; W. h: y, }& K
4 w4 S$ g& t1 ?6 [7 j) t" u+ L. O
/ |$ [2 i5 c( K
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|