|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
$ v( A: J$ ~( g/ M7 G3 z9 s Z: C' N( r
问题描述:" o' t3 t' o6 f4 b( L/ _
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:) ^8 s% {' ]* A( L" k
/ m4 @5 m. V4 B% ` B5 \图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。) M2 m2 Y% K9 b' y4 G. g+ p+ E
4 p( J" h2 v8 k4 ]- W测试结果如下:
& R: m, B% f. q" F5 F5 r138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
6 w p2 @9 |2 C0 A6 F6 h& B4 p3 z5 Z F
' v8 d* l& v4 v7 ?6 L2 V* b
备注:
8 d5 a' y! |2 d" [5 L8 d+ |$ E" Y, `1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?1 o2 D/ Q6 Z. ~& P7 V
2、相关代码如下:
; @* a* a: |4 X8 a3 @//UPP DMA缓冲大小512字节) q3 C2 ^7 U* l# E& _
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
+ n& ^$ C; O" H* A3 ?8 \' h/ J; Z& b: n#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT' u& F( R3 G- X1 p: w, K4 \
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
& b+ E- \2 ~+ B; Q, n% v( Y1 T6 W8 Q2 d( x: f
" L/ w; [& f' O8 w
//upp接收、发送buffer
$ ]' L& [* j) c- f$ m) o# G! E7 L#pragma DATA_ALIGN(upp_buffer_a, 8)
% t: Y1 A, v! \' v9 L#pragma DATA_ALIGN(upp_buffer_b, 8)! D/ I; O2 P; W8 [
4 C: R4 {0 p: V4 X' U Vunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];! H) w1 Q& u8 d! l
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
3 k. U0 P9 B( H: [' ^
3 `3 S; i6 R. B. f/ ]2 D0 i1 t2 r6 P8 D, C( @
static bool server_upp_data_recv(Server *server)
E5 a. x# X* y. ]3 g3 N8 s) }{
5 V/ G& m4 W9 q) A2 o) s if(server->upp_channel_a_recv == false) {
+ T; J2 R! }) {7 N( K, \& S server_msg_send(server, APP_CMD_LOG, "upp recv: start");
7 R6 d( E- V+ {- \$ m* y if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
9 t/ _" W' [+ x5 X; W, n/ S server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
4 W9 T d0 c- l% D5 E
; l9 V) z. a) W' b5 c1 ~+ ^' q* U" z5 V! D, q' ~% u4 ~
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);$ P+ r3 \/ l5 f) {
8 A% _/ g6 e- u F2 Q2 E! [ server->upp_channel_a_recv = true;// @+ G0 o5 s& F+ K% H0 g
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
) R+ \; ^0 E3 L0 d' i server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
% ?' G; R" Q: a. @# u server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;2 |7 k$ X+ X) ~: R
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
+ P! x& X6 W' |* y1 l) H8 ^% E& f+ h7 n9 S$ Y' N- B5 B
upp_error_count = 0;
2 P/ N* n, R- F0 o, {7 M0 W0 T: X upp_dmai_int_cut = 0;& l$ z4 l" G; X9 l* P
) `- B% @. ^5 z, }8 d
// fill in data
9 T. p4 O5 v" X8 Y uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);5 P/ e3 S9 R. T5 U ~& n5 c1 r1 q# j+ O
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
& C7 m% a9 H' b1 F4 o0 u }
% j2 O* p( F5 G, N, M. P B) U }
( V* Z+ u' y, V' Q: E else{
! }2 F0 q% B/ ? if (upp_dmai_int_cut > 0){" t( [ }0 T' _1 m S
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);+ [: p+ r7 n% P3 D
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer); ]! b- b: p4 F2 l
3 m5 R2 a" ?* L8 q" i/ y
) c( @3 j- t1 E+ O5 j
//copy data to upp_recv_list_busy
' |# o" Q. E$ s! B2 ` memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);* f! D3 E( e Q' Z# y/ v
: ?7 L% u% x9 j //5 }9 V }, O/ {* ?, D
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
% R& ]# m3 B$ V3 i2 s4 L: M+ w* x' e
//7 ^3 U9 M& r0 d8 u& Q. `+ v
server->upp_channel_a_recv = false;//
1 K9 \. s) H) |; y9 I0 w/ w" }5 I) e, Y _
server_msg_send(server, APP_CMD_LOG, "upp recv: success");( i9 T1 \. G" Z7 L: N
}! F2 y% G. _) @5 p; R& P/ }
}" e/ j3 t g6 b0 y
+ N9 q6 e1 W9 v; l/ k
$ b6 B9 ^7 {. [0 q3 x! t
return true;
@( `# U( d, P. F}& K# \+ A1 S$ z
& i3 }. N& ?8 y7 u
static bool server_upp_data_send(Server *server)
0 y4 D# I/ J2 }9 R J{, T1 `% R6 @5 Y, f% ?
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
# n \6 t" ~9 i7 _0 O DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy); \! [2 z6 J- f; ?
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
3 |7 s2 G3 C8 [' K7 W7 z. ? char tmp[128] ={0};" W( z8 Q) _( b" W* \
" l. Z% Q# J/ T9 {& _
server_msg_send(server, APP_CMD_LOG, "upp send: start");% q- N, N1 ?" n) s+ i& T; e
print_log(server, data, 64);5 S+ v; _" w# K$ H
! N' d7 h: G$ |$ D# \9 |
//
1 h! a0 \( y' O, E9 @3 i5 e memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
b$ b2 r: S2 _ memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);1 b0 @; Z5 [3 N& P0 o
print_log(server, upp_buffer_b, 64);3 p; i, C# y' ~
: V, M8 J6 U& T1 d/ A8 _0 K, @! I server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);1 j' G4 ]$ Z3 p. b9 O
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
5 \7 \- w0 C; }# F server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
( P6 n8 u. E& e! { server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
5 G# A! B# r F% j/ n/ [( B6 w) H! t9 @9 H
memset(tmp, 0, sizeof(tmp));( ^" G: j- V9 A! I" N
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", - G1 y3 t7 c; _
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);" p, s! c7 M; \7 n
server_msg_send(server, APP_CMD_LOG, tmp);
. j$ h9 b: ^& h5 H* B4 t. f1 d1 a# M/ n# C
upp_error_count = 0;+ K7 w# R; H {
upp_dmaq_int_cut = 0;/ ]3 [/ {6 R6 [0 |4 y
// fill in data
. |4 U! l0 {( k5 ]) S; P z uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); # t! \! K% P* y1 O* B/ F
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");5 b6 w2 W u1 B# Q) v: @
! `+ t z7 }' S; g$ }( K# o/ S7 R" @
// wait send success; S1 N4 A2 w9 n/ r" D2 V
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); y$ W4 E4 l* w( ^7 t$ l
( _( p4 G7 V& }/ O% t // make data node in free list - t) {* n+ U7 Y$ L b! I6 o' c
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);- {# D2 i% P; @2 t A- m
server_msg_send(server, APP_CMD_LOG, "upp send: success");9 h2 R- A! H" A
}3 y- y ^0 s5 u; v. G/ ~1 k
return true;& E \+ l" I" t. t
}* N3 ~5 L `2 C# j6 u R
0 d; z; _. g7 d# e+ X% \
8 Z4 \* T% L$ g, O, n% i( w& S y- y( g7 F. o% V
& y: A6 w* B2 b3 l% _/ M# v9 n' D k5 t2 \% ^! w& B
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|