|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 - Y: w+ P) c3 P
: J: r7 T* B& q m2 u问题描述:
0 g1 ]9 o7 q1 q, t2 C0 C9 w/ E/ X在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
. P7 D+ Z" G G W8 s& {4 c; u4 p# j" C
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
) F; W- S; w0 G) K8 R/ y- t9 B! B& {9 Q5 E' }2 c& X! b
测试结果如下:' k3 c6 \* C d9 [2 z" ~
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
9 A' T& s+ E& e$ D5 E9 N: w' i: r
+ q! F: R1 ~) u3 x' e7 p1 [
6 X3 g d) [7 q, I备注:6 r0 n5 E: t! s$ h( y4 w% X
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
' f& W& g1 g+ q0 T0 a, T2、相关代码如下:
+ [9 l( n; ]# A+ ?# Z" a//UPP DMA缓冲大小512字节
4 S5 z c7 w. x- o! ] w#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
; H& B6 j. s- {+ B+ R9 a#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
6 M; k! P: B/ v m2 \#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
. Z! y, p/ _+ o, w
. i' t& J, U7 z9 _* w% D: ?' b. R$ G3 c4 u
//upp接收、发送buffer
& A7 f% R0 k, M2 O% D" S#pragma DATA_ALIGN(upp_buffer_a, 8)
6 n/ u0 r3 y9 `7 n9 N% V#pragma DATA_ALIGN(upp_buffer_b, 8)
9 {0 t, W3 R2 M% K* C8 T3 o
3 f# ?, \) \$ s m5 Xunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
6 D% c* U! i) z& s, a* T. s9 e9 Eunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];7 j ~& m7 Z) A/ m( @4 g5 \
: I9 i- @& ]* k
5 u. e- `) Z1 o% `! O2 V1 O2 ~' }static bool server_upp_data_recv(Server *server)
?. n Z' L9 i& ^{
" h4 M! Y" b& K4 W$ _' I$ h if(server->upp_channel_a_recv == false) {" t8 D& c; ^7 `1 i/ D g" C3 Y
server_msg_send(server, APP_CMD_LOG, "upp recv: start");8 N# u4 U; o4 u: b, i
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {7 [8 r3 G$ F0 J) R+ U% O
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");; Z& D/ t5 y, M: m8 E+ K( w
* W: r0 W( A3 m' _& L8 @$ Q
' R* z- I I- t6 b* D7 u
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
7 o( E5 K0 t" w# s& C& E9 ?
9 Q' _2 ?9 e3 A# ^ server->upp_channel_a_recv = true;//; T# Z) p' b) i; v6 L5 F
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);5 I% [* i/ }+ X7 G3 A
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
. [, H6 @' C5 Q/ s( v server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;- i' ^7 [" m; w! R" R9 ~3 S+ m
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//2 w7 X' Y. A3 G0 l
3 v6 V+ l8 R; t) d% b- ^! X upp_error_count = 0;# x/ t1 _! l; p2 ^
upp_dmai_int_cut = 0;, W, A* e) D% b9 |( p0 f4 X/ W
1 Q+ ?; }% l( U( a& p2 i* S8 p& g // fill in data
# `" n& f- N m( N uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
: z& P! \$ ]! a: g' Y server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
0 w+ v. o0 v% }" A( { }9 Q% J8 h9 o$ P5 V" U1 u- V
}# @7 m' S! x/ m3 `* D, h
else{% {+ _& V9 f; v, X3 q8 l# B
if (upp_dmai_int_cut > 0){
* o! n! \* B+ G2 d w! J( \+ g DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
+ t9 Q% D5 o; g# [5 o/ r Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
: C' Z I/ D( D4 A" x w0 V, G3 B4 W; j1 R. [/ K* Q8 m
: L- Z! M) R7 s0 w5 B, w7 u3 p
//copy data to upp_recv_list_busy
3 X2 S w' t2 F3 n memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);1 F- y4 T' ?* Q1 C$ ]; U: F
% m1 g' w8 X8 ^! ^4 s/ T //
' r+ |3 e* y) a( i4 a ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);& O; x# j5 u0 R0 m4 O$ |
. k1 v; p& r8 z/ W! G9 q4 v //
6 E! ]. N# L3 t+ P: R. S server->upp_channel_a_recv = false;//1 g! i1 m6 [7 Y9 q
# Z( |/ A# S, O
server_msg_send(server, APP_CMD_LOG, "upp recv: success");, Y- @( x/ v5 t) a' u
}: U( b3 J/ P/ V% K
}
: H9 Q% x+ e! P; O( A2 P ^% P) S+ X. ~; m& B
9 ~9 u1 E* O: e, X! z! g! Y5 T
return true;6 l2 a" p! ?; I$ W
}
: q6 k# l- `+ c7 D4 P
o, U/ R& U" z" P7 m6 H4 Gstatic bool server_upp_data_send(Server *server)7 F1 y0 h0 o7 T a/ W
{
, S) O0 m1 ?8 e/ {* O$ n9 }5 z/ A# u if(ListMP_empty(server->upp_send_list_busy) == FALSE){
: U6 O, d( ]; P( k, z DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
5 m2 b7 I& o! R+ `2 b2 ]/ H unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
9 B8 k# i: v5 J/ D) L char tmp[128] ={0};6 ~3 x- ]9 u! b( l; A
) Y9 j5 e6 _( E6 r3 H- j
server_msg_send(server, APP_CMD_LOG, "upp send: start");
" W- ]0 \" H& S" X9 g print_log(server, data, 64);
& m4 p% k! x: J8 Q; G5 D" b
0 O5 h& R/ J; x //3 ~: O: w) B) D9 D
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);0 h0 E0 v; Q5 o/ p. Z# \
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
9 D0 G+ m5 i0 v y! H print_log(server, upp_buffer_b, 64);
' Y) L5 M' t4 A$ R* u( }4 N" r$ H# h% M5 P
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);7 G4 S! J: F% l; T2 v8 y' o. ?5 ^( d
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 2 D2 r) J; \0 R7 I6 G, F5 {
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;/ V7 S$ Z' ]) t# w" j8 o
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;7 l" f& H" Z4 p: ?( T, Z3 d. y
) |9 c/ Q! w- i9 d( S+ x. ` z
memset(tmp, 0, sizeof(tmp));; i* {( d1 ~$ H3 Y3 n/ D
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", . a5 f8 u2 ~+ j- N1 S. N
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
. l5 H" J. V4 f7 ` server_msg_send(server, APP_CMD_LOG, tmp);
7 c1 C4 B) ~5 ~# F, B+ ]! G! P: V4 [
5 `) H. }$ A+ l upp_error_count = 0;5 z4 Z: |% X2 A
upp_dmaq_int_cut = 0;2 a( ^7 T p! J. o
// fill in data ( S! \' q7 @/ i. {
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
5 c" J/ }6 L# K4 N) R2 i5 m) X$ z& { server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");1 h4 p: f0 n! {( A7 L; N8 U- ^
' O* ?* h. l, q: y. V
// wait send success
- x1 r9 y. w3 I" S5 M& s while (upp_dmaq_int_cut < 1 && upp_error_count == 0); , }9 N( \" R0 }
/ s7 m. j: J8 _5 S% d0 P7 G% @# i
// make data node in free list
9 U0 l R! H+ R1 Z0 B( y ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
, z9 q4 O/ y" W+ i1 ?" K! B/ c* X server_msg_send(server, APP_CMD_LOG, "upp send: success");5 K$ H, y! S# y
}
" v1 |: q1 m+ C. G. d' A5 e return true;
; b& F) h6 n7 B9 `; n}
3 F/ E! C! J7 v7 q! O" n; u' f# Y( X* x, f, w
: `' N L8 i& q" n. U$ P# z
4 Z: U L- y" ]/ f, T1 t# A7 `( B" q% m" M: O* \; s
* a5 S7 q2 O! L6 I" P/ l |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|