|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
) K" [8 \% M U; V, J5 M+ u7 j3 Y" d5 C* t1 _, S3 ^
问题描述:
! V' A/ r% h% d在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:8 k% [4 E; K7 I" r. m) a
9 J e" W/ |, q8 X4 r% g图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。7 k4 N) z7 E: N- A) Q) Y" c
0 M$ P- g0 P$ i. F8 Q
测试结果如下:3 x; {; o/ S6 ]" k/ \) ~2 S
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
7 s; M8 B) N/ v( z& X+ o M. X7 T; F/ ^* u$ m' s, i1 x# i
/ B, N) ^5 {% |" p8 p/ z y
备注:
# x: w! k" D* e1 k! Z4 V5 s! o1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
# V; h, @8 O- Z6 C$ i# t9 W9 c, r2、相关代码如下:
' d8 j* O. ^, t A- R J' |//UPP DMA缓冲大小512字节. ]/ ^6 O# ?9 V0 i4 R! d
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍4 D* m' W% n' B* e7 l4 R" R
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
$ d1 h, R9 S1 k: S/ c: T7 ^5 [9 z#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)( q4 F. F X5 X/ _3 |( J7 w
, j% {1 O* J% s, P1 c9 c
7 a0 ~- u# }6 V( u: P4 C4 |* \+ O: ]1 O//upp接收、发送buffer, a6 C* ^& O' J/ b% Q+ U6 D
#pragma DATA_ALIGN(upp_buffer_a, 8)
( H$ G4 S* C' d( v: n' p#pragma DATA_ALIGN(upp_buffer_b, 8)
) Q! ?( F" `. k$ l& |- P1 K0 r3 \& B) P! B1 A
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
" d' ], E: M: Ounsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];) M5 Y% }1 A& g% B. }
1 |' X" A0 @% {( \, c
- k. C/ ^4 n1 j( m+ a& s( T; ~static bool server_upp_data_recv(Server *server) 4 [5 i1 g) d3 ?7 d1 M
{
9 K! }/ |8 s; }9 A. R2 p# ?& r if(server->upp_channel_a_recv == false) {
3 K: E0 k; y1 D server_msg_send(server, APP_CMD_LOG, "upp recv: start");( J9 t$ {# O/ U7 v, o
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
9 q2 ~ ^( y# |# q8 G u) { server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");# u& x4 W6 U( L: g$ U
9 s( W6 v4 P% U: x% w
- O0 ~5 t; D h: E& | memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);$ O3 y1 v$ X# x0 J6 x, [
) r7 @5 K2 h/ g0 ]+ h: ~) X
server->upp_channel_a_recv = true;//
* D* l* a$ c& r/ U server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);4 X9 M" ~ G! O
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
$ i- |# J/ {% A8 |; g" C; R9 B7 U server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;% D" l9 J& V& |; W9 y0 |9 ~* J
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
; g* g+ H* z3 @' r4 d+ B5 F+ Q- u5 D v. d
upp_error_count = 0;
( {9 A, `3 Y4 G upp_dmai_int_cut = 0;
/ h P- v6 s3 R3 V1 a4 q
6 r4 t$ o: n) n // fill in data ' }6 J8 H3 ~5 Y* C) v
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
7 Y! e& j0 K5 r9 b' I! [ server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");6 X' k& o* M( U; y, r8 n1 |2 G8 d
} e- y* s4 h! Q0 I) R ?3 _
}8 @& ^4 m+ Z, v) i3 }! y; G( Q# o% o
else{5 L \; A) A3 d9 ?( A. R& z! p, Y
if (upp_dmai_int_cut > 0){
% y: ^/ W. r6 K7 p DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);- Y: f- [+ m: i, K' a7 v
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer); R$ d' D. T7 S$ X
. R% x5 e: ~3 j- h, W& a( Q1 b) r6 F5 D) ?$ g7 [2 P
//copy data to upp_recv_list_busy$ L! A% v2 e d5 q0 t# j$ Q
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
+ e+ F5 z/ V, `6 U5 W1 D4 [: y$ x8 g1 k6 R: o& d
//
2 ?4 Y9 D/ `5 b9 n: ] ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
! u5 i' J+ H; `: O! `7 C
6 K3 O- h0 _* i9 p; f7 @$ Q //
. c, F. f9 N4 R- \ server->upp_channel_a_recv = false;//
* k2 N: N+ t2 G f Q" I! G5 P% x$ x7 g. @0 Z* y
server_msg_send(server, APP_CMD_LOG, "upp recv: success");! J+ Z& E& p# h$ w* }
}
, m* W9 q& n9 r: z. h }$ H$ T+ b, j) @6 t% ?/ W
$ L, u3 a" B% v; V
: k. `( p& O3 W/ {7 ? return true;1 i2 Q, P9 E) |& g
}% d" M" O+ m" e7 T: ?" G, d, e
- I% H! w8 ~" u3 ?1 D
static bool server_upp_data_send(Server *server); W; n, j0 n6 ?$ M
{
2 }7 D: ~0 u7 {( f: _ if(ListMP_empty(server->upp_send_list_busy) == FALSE){
- D. a& k$ a a+ J/ c7 Z DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
: k! x* K- h5 p! F' M, j. x: _ unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
# q' w7 F2 r6 \' r* v char tmp[128] ={0};
H; O( Q+ a% W- `+ B6 z" i- G) u( o4 F& W/ ~! B5 k
server_msg_send(server, APP_CMD_LOG, "upp send: start");5 P, I. Q5 D) h1 B) \) C) g, K
print_log(server, data, 64);
- J, x) b" x/ r$ O3 ~! k6 g% X9 ~5 f# P" q( T8 R2 @5 O* [. g% Z
//
/ Q, V! D K( r5 \8 v: s6 R+ M memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);+ M1 i' s' F3 H! f5 ~2 r3 q3 W( z
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
& W: z0 x% c' f! b3 K% k/ ^0 R print_log(server, upp_buffer_b, 64); {; Q( G: u/ L X! e8 X1 [
4 p; C2 m# `5 _# ? ^4 I server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
3 `; R- r# e% _+ l0 \% O server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; - p9 d' d/ @" N3 m n
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
. N' H" U! }, ~9 H: m0 P server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
- i3 }1 f( g3 W8 w6 H& k _, U. l9 Z& y
memset(tmp, 0, sizeof(tmp));+ @0 s) W8 J K7 i# C
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
' S9 O% S* c) d sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
, k$ x6 {; P: H1 g/ O" z% X( U server_msg_send(server, APP_CMD_LOG, tmp);
3 k6 Y7 c& K& B& E! e2 o7 V8 }5 A. a9 E6 u
upp_error_count = 0;( `4 H6 X& @ [* ]
upp_dmaq_int_cut = 0;- D$ O6 o" d3 C, a
// fill in data
4 E- H# c L& @, [. k2 B) `7 b uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
1 y$ s) Q, P$ E# M# n" Y) n server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");' B9 G0 O' r Z) k
* R+ ?* `7 [1 i+ b u# a8 k
// wait send success1 ], s# b, z- U) C( y3 ]
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 0 |7 P1 T6 }( u4 ?
; j/ t* @( R1 O% E
// make data node in free list 9 l/ R( d! G0 i3 \
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
9 a" T- _ L' [& S4 F; P2 M( ] server_msg_send(server, APP_CMD_LOG, "upp send: success");
3 y! s6 P8 S. R+ z' e( d }4 u% x- s P$ P
return true;3 `, p, o# o8 C, A, C- ]
}" d# `% a8 k' a: t) f6 r
. u# E# x9 u T9 d
/ U' t8 F$ ^5 O4 c+ b+ \1 ?6 R; b2 b: e. N7 ~' q% ^% ~! p
/ [! O# X% n' ^/ i
& T8 V: p1 q! C# g3 X |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|