|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ; T0 a/ K# q, z: |+ O
/ P6 F- @/ b+ B" q; J) O4 Z
问题描述:9 n+ }/ \7 e( r4 g9 n/ Z/ k
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:+ a1 x3 g! a% c2 a; ~" m
$ s7 r6 u) G4 h图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。, P: `9 W# p" u& f( k% X4 V
* r/ _# @" M% Y1 E7 a7 o测试结果如下:# m; l+ l/ J1 O
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
, z) _( Q8 h7 o, ]. F& \
4 A3 U# W, J! L* u& ^4 H, e/ B2 a* Z9 X' w" m6 p/ ~8 h* l+ g5 k
备注:
9 P: O+ z+ H" F8 }1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?+ J: g7 a' L4 f" G6 z# Y
2、相关代码如下:
3 R& t1 x9 d3 N( ~" z//UPP DMA缓冲大小512字节
- I) y# |5 S! t8 ]' b' \* l- [#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍/ k' d; a @4 d0 x) ~4 h
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT I7 L" ]; ]6 l" T t
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)7 o/ y. z" c& ?( {7 m. C
, U5 O8 A% l3 v
$ e2 B: C3 c! [; k- _! ^2 M% n//upp接收、发送buffer
- e* o( n# S2 O8 X1 }& s4 d! ^ k#pragma DATA_ALIGN(upp_buffer_a, 8)1 U4 l8 e0 R4 E# }: `& m5 M" u
#pragma DATA_ALIGN(upp_buffer_b, 8)
: f) X" n2 L9 B2 P4 _* y
. Y8 z h z' X( H- R" u7 n/ u* xunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
% }- J0 B. O: ]( Runsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
. @9 }. _. J& u3 U8 J% U# O! O. h1 e+ F
& f4 r# c' X1 P" ?; Dstatic bool server_upp_data_recv(Server *server)
6 q% D2 [6 m! a6 T" a7 `" j{9 L* E& ?) \. B4 e
if(server->upp_channel_a_recv == false) {9 M, a) S4 `5 |* f% p
server_msg_send(server, APP_CMD_LOG, "upp recv: start");9 Q7 R, \9 H6 I# ?0 O7 \" s
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {) x$ E; G$ D& {6 T
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");3 W4 @) _0 w: J. ?7 j+ N2 D3 M
$ A/ B! P1 }! c" A
U/ y( i! J1 [: ^7 c memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);8 M e3 _( Q! |" @# ^9 l/ m) a/ s3 k' |
! t0 U# m( v" ?- y- {) S server->upp_channel_a_recv = true;//
1 `- f0 n4 {# H server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);4 `6 V, E4 ^: j8 D( z
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
7 s n, ~& G" t server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;/ q" q8 I4 B. s0 O
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//& x2 f/ P( Q6 I9 c2 V* ]0 R
3 p4 E* }- s$ R$ y( H
upp_error_count = 0;
# R) Z$ s N0 U8 p- Q, k upp_dmai_int_cut = 0;3 {! s$ x7 @: w/ o
E9 Q$ U( r$ I# I4 }
// fill in data # P& X4 t! M# f# K' w% y
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
, }, y- t! ^' g; c9 ~6 u server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
! @. z/ v2 e7 k }1 j: b4 V; I. N. i h
}8 G' s5 a9 i) D* N. Y" e
else{
; w# I; @! d v# B+ y# _7 G if (upp_dmai_int_cut > 0){( c# f. I! ^" I( r8 Y
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);- M1 O( b: B( e/ ]
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);( \0 L/ h& l6 M' ^ e! t& c. W! Q
& ^4 G' y5 Z4 b0 O b
3 b: u6 _9 g7 `: C% ? //copy data to upp_recv_list_busy
( X4 d4 o% t. y memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
3 b- A- @0 `8 W8 _& o1 H1 y& Y* P5 r- e" t/ _
//3 R3 ]* i( N, q. Z- n& X
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
) R5 q1 z% i% J0 Y: ]0 d8 `- _7 T! F8 V! R
//0 k& B- |. p5 @3 ]" L5 P U( J8 w
server->upp_channel_a_recv = false;//
+ v) o. b+ ~, [, i. X) Q0 l/ h9 A0 m6 m0 u6 N
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
2 h: T$ {0 l, W3 K }
( J+ z/ A' [+ p }! |( H& |; m* p: y0 p# Y u7 \
M0 K6 @: R% {
7 e. }* C' R6 l1 J _ d
return true;
3 r9 Z& Q5 e3 @" T3 k$ n}" H3 c4 }# p( N- G9 Q* D9 M: q
: X+ {* \9 W+ p% C5 Gstatic bool server_upp_data_send(Server *server)8 w6 B: \- `$ p7 N' a
{
+ m+ f: B! J& x% ]5 d if(ListMP_empty(server->upp_send_list_busy) == FALSE){
0 |; P% \1 d7 x9 ~5 T. o DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
) q* c* v+ R9 i" L, Y. h unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
7 Q' w- l) }0 }( Y char tmp[128] ={0};
4 {, k8 A8 i8 n* {) x9 F1 e# ?$ C* m& T: I8 o3 C
server_msg_send(server, APP_CMD_LOG, "upp send: start");
7 C: j/ `, K) D8 u' z6 Z9 d print_log(server, data, 64);
" B5 |0 y8 f2 f0 P* C( O7 }& @; v+ c5 }/ F1 s6 P; p
//4 s; u8 Z( H, o* j2 ^' ~
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
. v$ N% d/ j2 K# J+ b, I: a$ g memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
# k6 H0 H+ o) E% y# i print_log(server, upp_buffer_b, 64);
$ r4 `% _3 ~: I" ^* L7 J- O' H( T0 p% ]" y
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);9 h6 {) G" x' r, s5 t+ [
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ( E1 x# X+ b& ?2 ]& z
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
& F/ Y6 p0 O; D5 S) W server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;" ], Q7 s# }8 }' B, B0 _' q
, c9 ? O- O( J# X$ h, j0 t
memset(tmp, 0, sizeof(tmp));+ F% E A9 P- G3 `
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", : M i h; }0 w4 m# {2 a n- { e
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
; p# ?1 D8 H2 S# Y server_msg_send(server, APP_CMD_LOG, tmp);
& N! ~, q. u1 b+ y( I7 o0 O" W( t: v5 p3 ~ s
upp_error_count = 0;
, l: ?1 B7 j! g# } upp_dmaq_int_cut = 0;: D! V( g4 k+ K6 q, n7 t5 |# I
// fill in data 7 w4 r' Z8 o( B' [3 F, E
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 1 P7 f" o: g/ c
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");2 K+ D( X. A5 V
- A& k, [) d; c( J8 P6 J9 l7 |
// wait send success9 Q7 E- B% N% T! S" p5 d( u2 J4 E
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); % g& i" d4 I1 `% G) m
4 i, c" @8 V* H, V+ c: B
// make data node in free list
. S# {: {) z2 @ ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
& h! y$ a7 V0 C9 v8 i! h server_msg_send(server, APP_CMD_LOG, "upp send: success");
! `' n; ?/ U& R2 \ }8 T' s% |& X6 I; G' a
return true;. t, W; G/ i; q) `% @: N4 w4 b1 y
}
7 \2 [! G) k5 P+ g. I# r/ ~' B+ g! s: z- v$ o7 H! Q' w
( N* T, g ^6 c, x8 \1 y) j1 t! t; H) V
' M1 b) P3 }+ a1 H
+ U; d7 S( h; H% y0 q& O* s |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|