|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
2 y4 ~+ B8 R7 w3 u, V
, k4 g, [3 @ p. u' ^1 L: p9 F问题描述:4 O, K, k: F% q1 p+ }* A- [9 D
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:+ w( A4 v# ]+ I/ S
! I4 N# Z' k. T) A图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
9 d# i6 Q7 y1 a, e* d- u+ F7 M; L& ^8 U+ B! @
测试结果如下:# d) i+ c& z9 U5 m: {
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?$ L* S" X1 z) d- G+ b7 p
9 J6 F8 A0 m5 J2 ~+ y+ m7 \! O1 H
- J+ ^ c. F; M( |( U3 Z
备注:* e! e- v. r" u% K& [/ r9 [; z
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?( E' Q! y' e8 |, @% ~: C
2、相关代码如下:$ {$ S$ H* H( R9 B
//UPP DMA缓冲大小512字节) u5 v( N, b! x1 v) O9 a' j% U" L0 i
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
. B1 z/ z! e6 W! L2 e$ m#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT% l. x/ V: D5 B& D1 _: E$ X
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
+ J/ N* i5 S1 W1 h7 l. ?( a
+ y/ R+ f" w% y& S" w! m2 s" T: r
h% `4 S. Y. y2 k3 ~+ |! Y( s//upp接收、发送buffer
e2 p7 w7 K# E c$ E9 }; f#pragma DATA_ALIGN(upp_buffer_a, 8)
c4 `: w+ ~0 [: e#pragma DATA_ALIGN(upp_buffer_b, 8)1 ]7 x# y! Y' j' q7 y7 Q
) |: H7 q2 |2 m0 o# @' G
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
! ^' G0 s# V+ K* M+ Y: Ounsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
, j7 H4 `; F" w8 y4 f/ V! ^7 d8 j4 @. b7 _
+ x; \, b! b2 |
static bool server_upp_data_recv(Server *server)
8 L. @- y, w m* i i{, {! x: N' V# L8 `: E, T
if(server->upp_channel_a_recv == false) {5 Y; D9 c9 U6 G8 f( b( E- ^& G
server_msg_send(server, APP_CMD_LOG, "upp recv: start"); Y- U/ u9 p- F; Y
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {. X y4 B* p {- B# i
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
/ ]9 _2 c4 |2 i0 N+ M. P
5 Z, }1 ], i1 G
6 d. k0 ~ ^; B' I memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);% f! `( j! d! B8 e& J
1 V6 r& R& L) M& o2 b# Z
server->upp_channel_a_recv = true;//' B& d( V: p5 L# R: s
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
% C# j6 t6 j, b3 ?# l7 j server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
+ D u6 D( V$ h+ s6 n9 v; K, z+ X4 w6 d server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
& f7 |9 d0 V! J/ w4 ?8 x# Q% b server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
' e ?) u7 l7 B; w+ E. F. x, O! |, E
upp_error_count = 0;0 j( @3 n# d- n1 I; ]0 X. g+ m
upp_dmai_int_cut = 0;
2 Z- K: c" Z5 c7 [4 u9 c4 i" y4 ?( b/ w2 ]/ S" \ v: a# u
// fill in data 1 J) H0 l8 Y$ g: D6 Y9 {
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);5 H, A1 a* ^3 v+ r
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
. M( g6 q1 o" s+ C" P& U# m% w, T0 V }2 p, M: a. d* ^2 D0 n
}
" V* w7 u3 R2 l( K else{
4 b* {! l$ o% H9 g* Y5 S/ t if (upp_dmai_int_cut > 0){
* ?8 z# z9 T4 {$ I) ] DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);, F3 b Q8 c, ` M
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);3 k7 C# k! X% ^ F- T6 ~! Z9 K1 S4 ^
, l8 Y8 W2 P+ @- P6 S7 M& Y
% v) I6 E) o) ` //copy data to upp_recv_list_busy, \, `( k3 n5 y$ l: m- N k/ W
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);/ ~6 I' R% `% ~& P; C
( X" x* B# L8 u! t( z
//
& D/ Q& @7 z) B) Q, X5 G7 F ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);+ J0 |% ?( _- |5 n
N v3 j) u! ]5 a j5 x, @
//
3 I. j; A6 B% @ O' E server->upp_channel_a_recv = false;//+ t- {" n5 \6 d
& f2 Z3 ?" r0 _0 `& B
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
8 z7 A1 @' T: \* A }
5 h% I. C- x- _ }; f) p) w9 G- j( x# q# e
; C% U- v: U( L- _
: d* q# D% g2 u" s
return true;8 j+ O) x5 J* ^, @) V
}+ f5 b+ C! V- j6 O
0 i! }7 f; y5 ~8 K6 w7 _. Ystatic bool server_upp_data_send(Server *server)
/ m b% p' c$ r; M& E7 |( a" w{# l6 i1 u& M4 m5 O
if(ListMP_empty(server->upp_send_list_busy) == FALSE){' A O7 {3 D, U- I& r
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);# u; g6 `% V6 k" m
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);# X; W) x* ^; q5 @' L
char tmp[128] ={0};! @; H* T; z9 A3 {6 K7 a& I1 ~8 n7 F4 h
/ c Z1 B4 N9 A8 H+ L) X% U
server_msg_send(server, APP_CMD_LOG, "upp send: start");
4 u' A/ b9 R! W3 W9 B' e print_log(server, data, 64);
! X9 @9 s# t* V( I4 j1 J: p* i
# v/ r$ y% S+ _1 h //
' w1 j$ e1 I/ O3 Z; B memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
: d) ]% c, T! n9 l l memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
6 J+ _) |9 ^, i3 f3 {% ?" o+ I print_log(server, upp_buffer_b, 64);
. Y5 E( j2 {3 s4 n
) g1 z( ~- D( r) ]- ~+ M- y server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b); p) D+ v, E0 [$ G
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ) R- p9 b* d: p3 n& X1 C9 _) r
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;$ h6 z1 Y" L3 O
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
0 V8 ~+ Y( m; [0 e, Y' z6 y3 ?) e; I. \3 D% H! ^* g; v3 k7 |
memset(tmp, 0, sizeof(tmp));" B! K- S0 }3 G; Z" y' Q5 {! k: e( S
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ' e9 B5 Y; p# @. Z B R9 B
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);: O6 w% ^! {. X: s' J
server_msg_send(server, APP_CMD_LOG, tmp);
& {4 a7 K [ `( c5 z
5 [/ O% T! B( u8 ]* s upp_error_count = 0;+ R9 ^* t$ b/ @
upp_dmaq_int_cut = 0;
, R" U# F7 C+ V! q( e // fill in data
/ U( f, B+ Q" ~2 m. b# V uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
# |; \6 D% U3 |, F" ?0 J server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");; q' ?: y4 f7 N% T) {2 n5 Q
' O d8 ]2 A7 g) V7 l // wait send success
' C' q: g" C% N3 T; x while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
- G% P8 k- e( F# V4 y
' b& j! \4 D% Z& W5 S! l // make data node in free list , M- [. ]5 C; R; I- p5 J
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);/ Y3 @: G& G' o3 P
server_msg_send(server, APP_CMD_LOG, "upp send: success");- O% i! ^( ]' R5 d9 K8 r/ K
}" N5 i9 [- n1 f. e$ G1 ^9 @
return true; }" H1 X/ X7 h/ s6 x1 n
}+ w+ l" u M7 }. H
3 C. k o) z) `% ]6 u
, h" K v# l0 D1 ]8 w5 Q6 l1 R+ s' J5 e$ O) t* `
9 g6 w% S2 \' ?. O9 f* P0 W5 F& j s! C
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|