|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 " k2 _0 z3 q$ T* t% Y$ I4 ^
8 \. p- _9 B# d5 k$ D6 R
问题描述:
2 z; y: M( M7 q. f/ i5 ?在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
& y: m5 x) C& o- W
" b: x* M2 S, v图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
. I7 S# \, W5 _$ c! P# C( O3 P! R" D. B0 C
测试结果如下:
/ p: L2 ?4 {1 ~: A2 a2 ^5 r7 L$ ^138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
) ]7 W$ S$ S% q! j
( }. e0 @! J2 }; q5 j
4 \* B. i9 Z0 Q3 x备注:
, ~- y( b; ^- }8 o( ^! V- }1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
, _2 ^& R) d7 `( ]' {# B4 o' l2、相关代码如下:
8 Y' [- p; k7 f2 u* p9 q c//UPP DMA缓冲大小512字节
/ q9 n3 ?( J4 ]( k+ Q7 `, x: i ^% a#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
( |: [* L x/ I: j2 r2 d#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT1 }, ]2 @: ^: U7 I' p
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT). U0 X# Y6 k* j* O& Q- T1 Y
7 j5 [, b9 e, P
1 @9 J+ i' b8 ~. F1 q7 n* {
//upp接收、发送buffer
! D4 a! t* o; a5 P' v7 v2 T9 L, H#pragma DATA_ALIGN(upp_buffer_a, 8)
8 y* ~6 W* Y" _4 u8 G#pragma DATA_ALIGN(upp_buffer_b, 8). \3 q' k, b2 f1 N" ?, K6 ]
2 S3 B, v T4 n: X& \7 Q" ^) ^
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
- D) S! z2 u. j( N, {unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];$ P6 ?& ]# e; C; s
2 U7 Y0 G6 t1 R; q3 J
" e- }( G& c/ l4 ?& \static bool server_upp_data_recv(Server *server) m& j& [8 }) z1 {4 k. F' ?# q \. _
{
" V7 r! G, T/ Q6 i/ i4 @ if(server->upp_channel_a_recv == false) {: a; b1 d9 C5 Q8 j
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
; a9 D1 C& I. [/ |2 X4 ] if(ListMP_empty(server->upp_recv_list_free) == FALSE) {: \0 J5 I# N) p% B( y
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
2 U% n, I* N7 B% G) Z& I) S" d$ j& q$ M* @" s" B
E5 \) w/ g$ P memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);: r. R y. r7 Z' V% t* i
9 X S; ~! k0 {2 `6 a
server->upp_channel_a_recv = true;//( b9 F# h( k& t
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);% T9 c0 ^, X- T, D- T h6 ?) u9 Y4 |
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
: J3 B! N& E( K9 D* T' D3 r server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
2 n1 \) M. l& I, e3 X server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
$ k; [6 B! u% n& e9 S0 V% ~" p7 A/ J( }# U% X
upp_error_count = 0;/ z- x1 V X# _) k: H# ^4 |1 D0 h
upp_dmai_int_cut = 0;$ L3 p1 ?* {+ ?# Y: Y, t* |( I. B
/ v: O! Q1 t- ?$ S# T- h9 v // fill in data : ^" c* J o5 s/ v9 |
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
! ]" o! Z [# G, }& D3 d# { server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
! @' v* W9 Y. O2 Q) u7 E }
" w& A3 y% L3 e& q }
4 D/ e K# _6 b' {( ? `( c% D else{
! Q: Q2 N- M0 V if (upp_dmai_int_cut > 0){
& u, ~, O# y9 Z/ _" u( p DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
" _3 o( c5 i, j! h Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
# R- u) Q' W/ l) }* c8 A
5 k* J2 m! `9 _/ _% {% K: l: ?% I- r) C. R! c* n
//copy data to upp_recv_list_busy
8 d i8 T/ I7 d0 _7 \ memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);" P# u7 F, d- Q2 H
: |, |0 b/ {- t, S+ _. O! j, L
//1 M2 v4 v5 y$ U% O% |. Q ~! ?( t
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
' ]1 J# l$ v3 X) y# `. Y4 ~5 j0 S( k) v" J* |
//1 j h( [3 g2 @# Y. w
server->upp_channel_a_recv = false;//
, C3 B4 i* o4 m; ~ o' {% z! K2 O( _' f `! l
server_msg_send(server, APP_CMD_LOG, "upp recv: success");' E4 l/ _ T+ b6 G2 W" E
}
7 U0 |& E' ~+ O' w% M5 L, M }, n4 a+ f5 u4 v0 b2 s+ C1 U
9 Q( @3 K s% S7 h" L
. t. P$ {# V8 E" S6 ~1 D return true;
# e/ ~" v$ F7 V9 K& y}6 x e" _1 `- n# T
! H/ N" }4 ?$ @7 T" n: e" N
static bool server_upp_data_send(Server *server)
% W5 t+ z- f2 s1 B- ]$ c/ M, u{# n" d5 j. n. P# y8 P; i M& U
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
9 P! C" i0 g9 R8 C1 n7 p DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
6 n2 W8 s0 g: Z/ c% h! Q unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);: h- ]; S" ~# {
char tmp[128] ={0};
' g3 O& Q' s/ }; V' ]- f2 v9 v2 c/ t! ]# m/ |6 k
server_msg_send(server, APP_CMD_LOG, "upp send: start");
v u, J2 h& _5 o: F print_log(server, data, 64);! W6 ^6 h! T# y+ b
% r; Q. y" D2 o! \3 [+ Q" R8 D& l //! [' o: w7 e2 o$ j7 ]
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);3 N7 L, m& r. m# N8 d
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
( I3 N5 |. T$ p* e1 C print_log(server, upp_buffer_b, 64);
9 B3 J" Q% Z- I4 o
% g! W- E4 O$ {6 i! o- u7 P3 L server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);+ I; s1 l2 k' ~; G3 l
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
& R) ~" ?' k- v server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;7 y g/ N6 ^3 \& f# p! v
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
5 R3 M! e* o E& t5 @* o9 d8 w' x' B3 o2 b3 j
memset(tmp, 0, sizeof(tmp));# v E: Q" n" N0 I" U
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", * F5 u% _4 P; O
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);) g+ A3 ^2 U/ a
server_msg_send(server, APP_CMD_LOG, tmp);
. m3 q7 U9 A/ ^0 l6 S" ~
4 b+ b; ?; L2 A5 v! K% d7 o) Q+ A* u: s upp_error_count = 0;
E8 Q8 e5 U' _( X- r upp_dmaq_int_cut = 0;
3 L+ s a' W- v" J3 I1 {9 O# p$ }2 I" X // fill in data ) U0 p6 l# t& ]
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
% ?$ Q; a [4 |: ^ [' C w7 e server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");. q; O6 g( l3 e7 y D
% v9 S; i2 o) f // wait send success0 R, M; B2 ~: d; v* y
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); % @$ {. C+ M$ p" C/ R1 \
7 ~; o4 ?: h, ?. e
// make data node in free list
/ o9 j1 M% `1 ^# P7 i% \ ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);9 y9 D: @) L% m& a, t" W3 _
server_msg_send(server, APP_CMD_LOG, "upp send: success");
9 i# b' L# e- T% n* \$ n }
5 e G: `) A; N# i! z: {# Y& y return true;$ Q9 C1 N) e: O- h/ V$ Y
}
* O: l v- E" m0 ?5 N
$ z4 Q2 Y1 R) G7 A$ q8 f5 U3 I, V8 E& c; V
8 k# p9 Z A+ S# w A, E T. o, @
( H! B' y+ f& [( J8 X( b
* u4 g4 z! @. d+ f! S. T |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|