|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
: r' Z# x' ~6 A" O& n5 J! _; u9 G4 U) T) n8 E' e* w5 u j5 U
问题描述:$ y$ U! I; Y" b$ V8 e) d' s6 x) b
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:5 o! L) g, G2 ^: H0 f! L1 p# U
& X& E9 F+ c: S- Q4 f图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。! E7 `- f( t4 c# A" y& d
% M% o+ ^* y- @( l8 S7 O测试结果如下:& x2 ~; t }4 _% t% L1 n$ w2 B' j
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
) F5 ? X0 R" F' D" ~
7 d/ x" s+ D, E& p* W7 q& c0 T0 P
备注:
$ }* z. A1 ~& k9 y- X- @+ C8 F1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
) b5 ^ g7 @( R+ ]& f2、相关代码如下:5 [/ t* o) Y" G: F
//UPP DMA缓冲大小512字节4 {9 f& k6 |4 H# V0 s
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
! V0 b9 {/ z' Q; d#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT( N8 Y1 Z# F; ^
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)/ D3 B* |. a* K. ]" s
5 }: C* i3 t, i: [1 u# D6 m' _# s) g4 f/ ~
//upp接收、发送buffer
0 `' b6 i& h- C#pragma DATA_ALIGN(upp_buffer_a, 8)
4 D7 Z6 R& B9 t( n#pragma DATA_ALIGN(upp_buffer_b, 8)! F$ j9 v' ]. r& F2 }2 ~/ w& S
( k9 h/ j' D% ?unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];1 k9 N' s) E' }: u! y) w
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];9 Y- C4 d3 T) P! K; A' z
+ T* g: {; H' }2 S- Q: B
# F% d1 G3 k; u, a# e% z
static bool server_upp_data_recv(Server *server) & F/ f- f; x; ^
{
& F- m6 ]7 f. B. ~6 C& W7 _" z if(server->upp_channel_a_recv == false) {
- C' c$ U% y" m i% k" d* G. @ server_msg_send(server, APP_CMD_LOG, "upp recv: start");
$ y3 i8 {# a$ S9 {# ` if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
( T) {$ Z! e; R( u server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
' A( |" K6 ~& l8 T
( m$ g7 }6 m* p1 `
% A. u" I% }$ C6 J' c- X$ S" x. e memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
& M- ?( }/ b" e8 d+ e r
( [6 s# y) `& J$ I server->upp_channel_a_recv = true;//
" | O B+ a, }/ K9 ~ server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
# p v0 X# ^- ~, R9 \2 ^2 ] f server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;8 S1 \$ H: |3 t6 b
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
" x0 B7 E/ [# G- j. u: l% M' y+ Y server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
1 A' f# j+ B/ L, ?
' w, P9 I6 u0 \( T upp_error_count = 0;
3 e5 o) a1 m& S- w upp_dmai_int_cut = 0;
, X: m# W4 [6 s6 c2 H. R0 g- \6 W# U' e/ B
// fill in data ! h7 d- s7 F! B7 q: x+ |9 w* i' a
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);' V5 O4 m: V, `" W/ i* _
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");9 n- I0 C. i* T) f/ r
}
5 D: m6 |- t. q( N% e1 \% ~% I }
' r/ ?9 ^9 k3 ^, I else{6 n: K; s/ `( S; ]& u
if (upp_dmai_int_cut > 0){% A* l- Q0 J5 q
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);4 K) I/ f5 b7 v- d+ Z4 y
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);3 @0 H% F9 M; C: Y& O% ^
& a+ R- x% Q/ i/ }" C3 | m* M4 U9 j' N- x: U+ ]
//copy data to upp_recv_list_busy6 r0 e% k' @, P2 k; c5 e- E U
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
2 l \, l* u9 r/ d- Y# k& n7 S
% _2 p& f) R: ]* n" r: R3 P u //- b' O& @# F3 l0 m" Y& W
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);# j) v$ x, P1 w8 V; w3 E7 M, ~
1 ^3 j- U! a0 _4 T2 p& ]7 Z //# Z0 u' `. A1 j# j! D
server->upp_channel_a_recv = false;//
9 f8 ?2 B% t8 _- E( `- O( a8 K1 M8 m) E2 ~
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
1 u( [; d! {/ { c8 F- c }
\! x8 i6 `& N. \5 F/ v }& [ ~( y+ a8 K4 f. k
# M* O7 Z1 `6 J( R' }
6 Y4 q* I& E* \* k return true;
& Y9 D1 z1 X) f}
8 G3 b. _# W3 r! E' F! n1 ?# j1 Y/ V% \- }. j0 K- a
static bool server_upp_data_send(Server *server)( @$ N) R$ e0 r. i6 r
{. E1 n2 t( I) h, O, b% J
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
8 }. \) M9 b7 `4 V5 a/ Y0 T DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
2 u( R% M* }* b- n# J& b unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);$ w, |' ~7 Z8 D" B" K
char tmp[128] ={0};
7 I& j" E* ~7 x6 E, H' A
1 i. u6 _7 F' P* ~ server_msg_send(server, APP_CMD_LOG, "upp send: start");
2 i8 I" r+ I6 c+ u+ X# s print_log(server, data, 64);
( i2 g8 P5 d& ]/ u3 C
/ o6 i' Z! u g$ h //
! ^6 I. e9 x. r/ u& F$ [+ B& k memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
5 V9 _2 ~1 k, x" z- v% x% t memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
5 m' w- _' K' m$ ?' K% p print_log(server, upp_buffer_b, 64);
8 |7 z) l8 z/ b) C2 e! j
' _8 @" x: U% T' B3 Q server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);8 ]3 E6 }7 U" J' ?8 |5 L& C) s$ F
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 0 }9 D, k5 v: p3 a. V; f) E
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
/ b% G% l7 m8 ^& O- } server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
^$ {& u5 ^+ X8 f e8 a% p) `! r0 B0 ^- E/ {6 Y
memset(tmp, 0, sizeof(tmp));
* ]) k6 [7 t# q+ l! o4 M4 ]( l sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ( }6 ]- c* Z& y8 x
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
) m/ q0 v/ C* _7 Y$ w' Y server_msg_send(server, APP_CMD_LOG, tmp);
# q3 a( \8 }0 e4 V% G" H. S
. W- q' U% r% y9 z6 G upp_error_count = 0;
* G; d1 [& V4 |- y upp_dmaq_int_cut = 0;8 `3 b" H/ A# z; h. L S
// fill in data : g) C% B. A$ o' R
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 6 j9 D2 [5 M. v* m: I8 J' D
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq"); s7 `, \' Y9 d5 | Y* [
/ |/ |& j( A0 B. l* i // wait send success
0 V1 h1 y7 y2 [4 c7 ?8 o$ W" I while (upp_dmaq_int_cut < 1 && upp_error_count == 0); $ r* O6 k# A0 O5 W$ O! O
6 ]& z0 b, x9 k9 R- } // make data node in free list
! r% {& ]( n* u C9 x. r' J ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);' V# A9 E1 x1 _# Y" L+ S
server_msg_send(server, APP_CMD_LOG, "upp send: success");
4 ^1 L8 }8 X/ M: i& ^ }
2 X# V; u) m+ i! U return true;
. J" I" W+ a2 o# q# b: A1 K}
, o" h5 `# J& E: o; v. G# _; n
& D3 R# J4 m- R
$ p1 e6 V9 T# c6 ^+ X0 W& D, t0 g6 U+ J9 r8 B6 |9 K
) r& S4 X: A+ N$ f! ?6 k& ^' Z' r- `- B5 ]) i9 p# N
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|