|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 : X" q8 Z% v- o+ X/ Z: `
6 D& J( |1 ~) s2 [3 h( t, o; ^8 |: d8 c问题描述:
9 m# e T S5 b0 g/ o) Z7 b在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:/ n0 ?" L: C5 {" O! T% ~1 o
. X8 e( C' L: G* [* M) g/ O4 T y图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。$ f* e; \9 ], w( c; r+ l+ O' |
7 V3 a* ?' G4 E, H+ C6 ~) R+ H
测试结果如下:6 z* T A4 S4 `( O8 \
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?0 l5 N: z5 C/ x9 P# ~$ k4 l
. F$ q F: ^6 ?- T# U
) ]5 l! B! s# O
备注:
) R, b2 s1 e) p6 c9 [1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
5 T/ |( \7 a: X6 Y+ f& G2、相关代码如下:! m& a8 g. |' v7 y$ @0 R( Q9 G
//UPP DMA缓冲大小512字节: c9 N: [1 g: d1 {7 E9 C
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
M ?2 t5 y& x" }' h( d#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
: ~% T" m; G) ~/ J#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)0 ^. e# V* E* ?: W* w/ G% `
4 b( [7 ]. V u6 {+ E7 V3 T
1 h, C0 @. Z! I- u$ M0 C" Q//upp接收、发送buffer
' S C& Q: ?6 a' A. z#pragma DATA_ALIGN(upp_buffer_a, 8) @! O% y! S2 K- F; K
#pragma DATA_ALIGN(upp_buffer_b, 8). i+ a4 s3 M+ ?9 @
6 F5 V% j' d* `5 Z* ^0 _0 Qunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];5 J. _9 x' c& U
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];9 F. P1 _- k& o3 j$ \
; J) p6 [3 X( @: U
3 _$ @. W: G) C& cstatic bool server_upp_data_recv(Server *server)
) e& `5 J1 p) u1 u% B& B, \% q{
$ B1 Y9 q' p! q* M$ h+ m% { if(server->upp_channel_a_recv == false) {, i3 z) E0 Y W, l9 g$ d
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
( {5 J# n. q6 Z! e if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
2 g. P# H& H: n. B) Q. d server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
3 H0 o1 z7 C5 t4 \; B
- F' T9 x0 w* v! k0 e, ^2 Q2 ~; p9 [! a# R
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
% j: L! |" N6 D$ I; a2 R- c
6 j( v/ J1 t/ `/ W/ C. M, z7 ?/ R5 p server->upp_channel_a_recv = true;//
0 b; ~8 v+ L, X- J- ~ server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);* `5 Z6 P# s$ l4 |; \& c
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
, S3 ~/ b7 i. Y" I3 `) N server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
: x/ u; B1 G) u0 n+ u& M server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
" |% ^! f& E1 l# u" d4 Q7 |9 i; D" r `. |" _$ R4 y
upp_error_count = 0;$ T' J- ~; S3 y5 I# E
upp_dmai_int_cut = 0; T/ l* [6 q; W4 U3 C# Z
8 ~) y9 M' t) Q$ Y; B // fill in data / g" F) ~3 i( w; J: K- W
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
\, m3 T7 D; M4 n0 u p) j server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");, T/ Q6 x0 y: z& a% m' A) w4 Q" g
}
( S5 c, `& v& x }
) I2 N6 ]6 F4 r5 i. m! i. t5 F else{
8 t# [8 E% k A( r5 f+ h) W' l if (upp_dmai_int_cut > 0){
: X+ v3 p: N1 x0 @' z- s- I DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
/ k1 Y- f# b. P Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);3 C# t/ \- H" [* P" n( A P
9 k- G3 N4 A5 j/ M1 e0 F- a
& K1 |: R4 U! P) q! P) J" P3 Z //copy data to upp_recv_list_busy) H# \0 e" T, V0 L% j
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);6 E6 e) Y) N" w
& J- }3 K+ O' \- m
//
( y; u) s) O1 [+ {) j ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
; b8 c4 F& P. v8 _* F1 J& ^
: U: \/ x( Y+ [: X; Y //
6 [, O- `3 Q8 Q1 g" ^: o$ ?& d- W server->upp_channel_a_recv = false;//+ m! p/ z6 W0 c
0 ?+ H$ `0 v0 c4 u server_msg_send(server, APP_CMD_LOG, "upp recv: success");" R/ x" u2 M- }3 ]+ @ T4 w4 J
}& ~: s9 C' r4 r- x
}
+ @3 A( M5 U% f( n0 n6 \3 I, Y# y( D! p6 J) D' C) G
! G9 ~& w: w9 k; g% m+ U$ [7 s
return true;
. o9 F* W; E4 n* d# \+ M}) {& V: }3 q( ]6 W
9 z' Q6 v" ]5 ^& m. S8 n
static bool server_upp_data_send(Server *server)
# d" a& }/ Q) y% B& f{
, M9 C3 u1 N2 R+ E0 i; g. q( ^ if(ListMP_empty(server->upp_send_list_busy) == FALSE){
7 q3 @" ]) l" L6 z" ?2 k DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
( Z1 ]/ o3 P1 P unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);& L) G1 N' R# X; r! Z
char tmp[128] ={0};3 A- O4 G( @# v& Q, e: |- `+ U# w/ |0 \! R
7 w; _% I) Y# N: t server_msg_send(server, APP_CMD_LOG, "upp send: start");
' a" N" T0 {4 W$ S( f# k. D* @! R4 \ print_log(server, data, 64);% u; y, ~8 y, b
; z' K- y) B0 K1 d& m1 M
//1 c5 D5 @6 |8 S- J5 u6 b# O% e
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);6 k& @( _' v9 w2 c% A, H" r
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);$ S0 P! m, o+ c
print_log(server, upp_buffer_b, 64);1 _- V% W: x* D: z3 ?& j8 f8 M
$ K' {9 y5 Z! W1 g( ]# L server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
. e2 k6 @1 {& _- y. n server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; & w6 R; r6 {- z
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;6 j% j# n- H) c" v7 F0 d
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
6 t. T; E: c: y$ c9 h; b$ `& R4 }$ k7 U g. m; `
memset(tmp, 0, sizeof(tmp));
% @) u" X; X# f& M4 Y! | sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
4 z( ^: E, O; N5 {' Z6 k sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);: A9 D3 T" \8 m: G _
server_msg_send(server, APP_CMD_LOG, tmp);
/ O( X2 a, U- |* s# X1 P% ]/ R
5 K2 s. ?. [' h9 h P7 m& E0 [0 ~ upp_error_count = 0;: `2 y; M2 i& C# o" Q. Y- t- {7 Z
upp_dmaq_int_cut = 0;9 B- J! O$ S2 F* z! @
// fill in data
0 X1 i) k5 D4 [' B: T& J; f uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
1 i. B. |: [0 G' U, }) i server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
. X3 D/ a' e" O* ~0 G% l
+ r- C( @9 g& M. ]& N2 d // wait send success
2 ?" ]4 a: k- n2 @6 a' r while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 2 o2 |0 G0 E7 V, }! T3 H9 X
2 ?, i1 ^, i0 b% B( Q // make data node in free list ' T$ v, ?% d7 T) ~* B8 ?
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
/ J8 ~4 x6 g2 ` server_msg_send(server, APP_CMD_LOG, "upp send: success");
, Z; |2 S1 [7 @. C, b5 ]$ v } a& v# Z" k# i' @0 L1 T2 b9 l
return true;$ x$ o# ~( t. }8 X. ], L- V) t
}2 E7 E3 v: }; V; u9 W, P
) y+ P) c0 }: j' A! h; a" u }. i0 I
; `- ~: J% c, Z6 d4 o7 B6 v" {8 l. `' u# E3 Q/ q; U R) g' m
1 o# V# u" |' f5 Q& J1 R% `
/ J9 x) ^/ ]3 x7 f: Z
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|