|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 + v2 A. r8 k, D
' F/ |/ g. |( u6 j# Z1 J问题描述:
! O8 b: M1 X& o% B2 k y5 z在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:5 `- k4 G" ?/ o8 n) J8 q( g- Q
- d% v: X3 M$ r2 |( g
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
% b" p8 }) N$ L+ M
4 k% c7 `& @0 S1 F测试结果如下:
6 w0 p" C/ x8 D/ B) u8 i7 Q$ r138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?' `1 t( U6 z7 k. a* d i
% B- q& p" U& A5 V; b$ `& f
; F, m) v" Q" `( V0 c/ R
备注:
& l I$ I& i- u, i# }, G7 p1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
: w$ B' O. |% S, `4 @2、相关代码如下:- C4 f0 j2 w8 y6 L% k
//UPP DMA缓冲大小512字节
# N6 N3 L8 T2 j* M#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
2 W3 y! R3 ?* h- N#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
5 J1 W+ C, g/ {* q1 y3 ]#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)! Z8 C2 M0 F: I* f6 B
2 `: }! ~! U* T! q
: v& i: L7 W) E9 I& E) t5 Y//upp接收、发送buffer4 ]0 o: l+ v& @& s' C R7 w( r. j
#pragma DATA_ALIGN(upp_buffer_a, 8)
2 A9 \/ e! P2 N/ j- M8 Q#pragma DATA_ALIGN(upp_buffer_b, 8)
- F9 d; H. X5 ~* j w
- o& ]; r4 z) V# z$ P& O! ounsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
& z4 R! ]# n/ P& x! Vunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];# v: P" D) \* k5 z" X V
: f6 _ J$ W8 P9 l- Z
( C# H4 `7 X- @4 V0 zstatic bool server_upp_data_recv(Server *server) & B; |$ J9 _/ V* |& c' p u
{
. T) Q! [) J7 V2 A if(server->upp_channel_a_recv == false) {5 x6 K( N6 c% }) B
server_msg_send(server, APP_CMD_LOG, "upp recv: start");8 V% c0 U* s: n" m5 A$ V
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {6 F5 u: o2 d# h; f' A
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
6 W$ x+ N8 m* C( d# x: J1 P; _
9 Y, ^2 P" F& q
) j- q; x2 A- R( s memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
1 U; W; |8 J9 c( c' o% R l. d7 d8 x3 h% _6 z! Y
server->upp_channel_a_recv = true;//, e0 O7 O2 E; _! f: g6 N
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);3 h0 f. o/ P) n2 x+ B2 Z/ y2 j
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
- e, t" W. [& L2 P; M1 w8 k server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;! r0 H. H- R/ f* `. q; c; y
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//% X7 E7 W# c" l0 `
4 I( H0 t7 P$ V+ o6 H7 W/ n upp_error_count = 0;! t: m& x% K! N7 Y+ S$ M8 _' E
upp_dmai_int_cut = 0;
6 _, V, D" f s1 u9 F0 U. v6 k* o& V |( o4 A0 C/ @/ _
// fill in data
+ f% ]9 v% z0 |$ M. n uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
5 e% j: W" o0 t( M- G0 I server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
' w1 A3 H: H' d; R2 _- w }
2 h* Y$ p& F" ^9 v8 Q; y; R: a( t }; N( y* L. I: f& ]
else{
. S4 e6 O- Y4 u) W% P( C if (upp_dmai_int_cut > 0){
9 }8 |* F: e0 E5 E4 s DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
2 \# a" N2 w% r Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
3 w3 ]& l( H$ `( @+ A8 `/ E, p, u) h/ ^' m4 S( L* _# m- | l$ F
( S; D2 h% Z) @' ]
//copy data to upp_recv_list_busy2 }6 ]8 @; |6 H" i, ^8 |, v; Y# l; r
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);+ W- G: P3 k4 \8 _
P/ D' Q. S! d6 g- N7 M //
3 C/ e" A: R- w& `, ?* }6 A5 A ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);9 k3 f- A* s H
; l+ ~# I3 L( s% w //
3 ~8 A- P' }3 J p: {/ e/ s server->upp_channel_a_recv = false;//; s# W8 O. G6 j; t4 z3 {
& w- ^" I7 W1 z0 f1 u3 ]6 k
server_msg_send(server, APP_CMD_LOG, "upp recv: success");+ ^# g% T# a, m0 [
}
3 S& ~' j- N. O- M4 k1 X }
' F/ A9 ]2 f5 u) l: B/ W M' x
0 |/ o4 m% |7 A4 @& m% K) J! Q
4 z$ J3 F$ E6 ]4 R0 U9 | return true;7 H& l3 ~9 E, w
}
4 f+ e; W# m2 u9 Y2 o! @! \+ Z, s: U$ S G/ D
static bool server_upp_data_send(Server *server)
. n/ c# H x' ?5 B{
[, d+ r, v5 w6 j) M& R! z if(ListMP_empty(server->upp_send_list_busy) == FALSE){2 N4 O# h$ ^; O9 E+ {5 R
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);. }9 g5 v3 a" B
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);6 ?% U" d$ s% ?% p ] a+ m3 F" F
char tmp[128] ={0};9 n* P& \2 L; R! y, v
4 R! Q7 `. t4 l, i d$ |- V
server_msg_send(server, APP_CMD_LOG, "upp send: start");
" j; Z1 u/ ?( A/ b" \* _ i0 b print_log(server, data, 64);
1 A9 E. X$ S( I/ J$ m' T, A2 B: M m% N4 n1 f
//# d$ J, V m* r9 i( [+ _# E
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
5 }6 }* ]* P7 ~ memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);( K% E( O# n! H5 ~7 C' P# V" n
print_log(server, upp_buffer_b, 64);
4 Y2 v" l @# {, }2 @# F1 y( b3 `; B" @
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
6 a: d0 s' ^5 F server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
7 a, J" r& v' r, l server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
' B0 K. g: w6 k! }, l7 }: N server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;) j- I6 y+ {* F7 d( u* J* e6 G% R/ |
* f* T% T% ?' w! e
memset(tmp, 0, sizeof(tmp));
# l( h% t9 W* p+ t- E1 M/ t+ [ sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 5 T, R: N! Z+ R) }$ J8 {6 a
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);' p, V/ |7 H# T; ?6 X* y
server_msg_send(server, APP_CMD_LOG, tmp);* K/ h% } q8 R9 m9 a. _- J
3 m9 J6 D- ^8 |9 i
upp_error_count = 0;9 Q/ w8 _* H0 ?$ N
upp_dmaq_int_cut = 0;4 z7 l( Y. G. C1 _3 Y
// fill in data 5 h6 h/ ]! G! }; h! a
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
3 j) u o9 T H server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");; p, q" t# q+ s5 `$ W# Q
+ f4 _* ?5 S0 Y
// wait send success
* m- n# Y$ C2 Z' V' S# K& T) o while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
8 [3 d" g; r1 j8 B
' b2 w2 X, l2 L5 A8 \6 M, z3 Y // make data node in free list
$ s# j/ _. d% N ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);; B& m( z! X6 g2 w$ t+ s) i
server_msg_send(server, APP_CMD_LOG, "upp send: success"); t1 _. q/ O7 [9 K/ p) x }6 o8 y
}" T+ d/ ^ E3 e' ]: K! @: O# _
return true;
+ X# j6 n% n4 E6 I1 H0 B0 l$ i}
j7 k4 _" g( a3 ]! k
( C: x/ c: ?" b! `0 b
8 n$ D. X( _2 `- O* [5 |- b4 t% n& s
7 A9 M5 U, G; {% Z; J1 @; p8 R4 d4 F( C9 S2 O9 D3 k8 X, I4 Y
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|