|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
' \. ]9 ?% q: ?' h, A! \) g/ p( L: J
问题描述:, P2 t; r5 R& V# A( c! U
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
! H& w0 R% o. I6 b! a9 G* L" c: J, u
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
: a/ G8 J9 @4 k! [2 ?- v# ^1 Z" R# }
测试结果如下:
$ ], S7 |3 n+ c" R138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
3 d0 z, u2 |& R9 X" i6 h: X* c) |# b6 _9 n ~! v/ C9 G0 @0 [! s( ?2 }
9 D0 \$ w/ F& Q+ G" U* \4 ~7 u
备注:. K" e( c6 d. s g! H8 m3 _
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?+ N/ S7 _& I" R6 [ V
2、相关代码如下:
7 j) m) i9 e+ s& E i6 } C0 J//UPP DMA缓冲大小512字节& L) Y1 t$ u3 R* X5 L0 ]
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
~! L8 F1 c7 A7 t1 L# Y#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT1 R% s- }* a# ?" C# A8 \
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)+ }5 @/ Z6 {3 L3 ?" x5 h
1 q, f, f" z8 b1 E6 s
/ |, u2 a$ S0 P- ~3 E//upp接收、发送buffer
; `1 A- _# @: A4 N: x#pragma DATA_ALIGN(upp_buffer_a, 8)
4 Q% O3 p8 n6 z. q( l2 y8 u#pragma DATA_ALIGN(upp_buffer_b, 8)
" V# k. a; o, y# ^+ U0 |+ V- U) D; L% k: k. e" w+ {2 @
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];4 a; A3 d- e' V1 B: G6 q7 H& T
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
* K4 ^' p3 }/ A3 W- @8 g5 P, @0 a N2 `" k
8 Z% I! x6 w5 S2 Z) f
static bool server_upp_data_recv(Server *server) + `. r: }$ c6 @. e# v( F. a
{
+ ~" q2 [5 K+ q: [ if(server->upp_channel_a_recv == false) {
# T* ~6 ]5 [: n$ ^/ R+ T$ a server_msg_send(server, APP_CMD_LOG, "upp recv: start");. [9 S# N, I1 U: x) C1 H
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {) B8 t6 C# q- J* s- S \
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
6 k" B8 g0 a: {6 j# o3 Y5 M5 X, r+ c& A L
1 f. q0 N1 U, J$ I9 u
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
5 C- Z0 ~9 r0 U' V) G0 q. m$ T2 e4 {' M& w4 p( z" T
server->upp_channel_a_recv = true;//
% s V) Z5 h- P2 r# w server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
# K+ v) _- [, t2 k+ _% R% f7 o server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;: c2 e9 `8 F& h& ^% @- {' p2 Q# q# i2 E
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;' |: z1 v ]* B/ k) H
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//8 x; S6 m j' N8 z
t' w2 z( Y' d: l- n; b; ` upp_error_count = 0;
4 e, I4 C+ h9 Q& p upp_dmai_int_cut = 0;! l4 ^; y" x3 S& M ]
3 o+ W5 ~' O2 K$ k$ g // fill in data
5 F. L X6 Z/ V5 W" N' e; v uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);5 @3 ~: Y9 {4 i2 Z! R6 i6 Q4 v
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");2 F" c) g5 X! Y1 J
}. d- @2 e# a, O h, ~# [% b( H0 H
}
0 N! ]4 Z& C$ K0 U2 e' o* j else{% Q- @) `! s. P/ }% C
if (upp_dmai_int_cut > 0){+ {0 n+ K& Q0 R, i/ O0 ~
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);2 H) z, B9 V( Q! M4 R {$ t8 {: j
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);5 c8 Y: i$ i' u1 A& M, S7 j
8 T6 h1 Z- a* `! n- _1 r6 G/ v
& I" N9 X7 g, \2 G- D9 b3 { //copy data to upp_recv_list_busy C6 c) z# p8 @% S' l3 h
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
( ?1 o9 K& O- _5 [/ @! [- B+ }3 X
1 c9 G. _& r; G, s" ` //8 c# Q1 I r) a4 z1 n
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);8 h+ |) b$ W6 l
2 f3 N/ Z* J/ q9 {
//$ X0 U H% y, E/ L
server->upp_channel_a_recv = false;//
" U+ M `) l; r" E9 H& t( R7 }' j1 v! {9 \, b D" [" l* s
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
+ U& E. x8 q( @# }. E* f }) Q' M! b# T8 c. S+ P. k0 G/ \
}
2 K+ B2 T6 h/ T; c& X A5 S$ q' \5 g$ K) I8 z# N+ S
: n/ B) _/ _* n5 x
return true;
; I7 H9 Z& {2 }+ b4 @}
4 N M+ ?/ b) M7 L: [3 g9 W9 O& Z1 r8 i) f- M! i/ \! ?% W* w
static bool server_upp_data_send(Server *server)- X% }2 a/ J4 V2 X
{: S7 Q. E( l$ m, k* ?' U2 P
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
/ d: Z$ k/ v1 M/ t. j, L$ t DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
% A: z0 f _1 d( L, J$ C unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);* [( |9 ?/ _5 ?3 t
char tmp[128] ={0};( D% V3 ]; O" f6 l/ h3 s
; Z" F* h4 `0 @. H- x) g
server_msg_send(server, APP_CMD_LOG, "upp send: start");
: o/ @( N, [, Y1 T print_log(server, data, 64);
: {& U. |! n& D/ a% ]9 B5 o8 J7 q9 k) ^1 X. s% u
//% ^8 e4 [% ]9 j) ?0 `9 e$ w- n. E
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
2 G3 X2 ^: V2 [* W( k memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
B J5 q; q8 J4 ` print_log(server, upp_buffer_b, 64);, X: R3 \' X, z3 D4 L. F
+ P/ Y& |( l' t* ?4 x
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
" r+ ^% \, u4 N$ r+ e server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
6 s: e0 F! ^& y3 h5 x( r1 ~ server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
2 w" g( f) B/ @6 s( ?8 H server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
$ x9 {" s- ?+ ^" r0 X5 v, M$ P5 e, B1 j& X! l
memset(tmp, 0, sizeof(tmp));
& r9 Z* W1 Z$ c( W* N) z( H sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", " W) B& p6 \8 ?. T2 n0 p
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);+ ?; U8 `0 s/ {' P M$ C
server_msg_send(server, APP_CMD_LOG, tmp);
$ x* k1 }, Q/ v: ]- v+ ^( y
, J: p+ X* h q S2 F upp_error_count = 0;. o; t$ W" Y" W2 S7 w1 }
upp_dmaq_int_cut = 0;
2 ^! k+ t* g- d8 ^: C( { // fill in data ' v$ N+ @; E2 ~# A$ g: {! g
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); , N% T. I* n; d. b6 t
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");! O& g' L, ~4 G) `8 l
' r! s R; j) s9 B) ^% A H' _! @ // wait send success
: R5 t0 ^6 D" V/ B while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
5 d6 F' u! O4 T4 i! ^4 p* k# A! ~- [- _; r+ T! i
// make data node in free list
8 r% a" X/ d9 m2 G' ? ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
6 V+ b3 s' q: @6 z! y5 l server_msg_send(server, APP_CMD_LOG, "upp send: success");
1 H6 I. m! C; I. q }3 W" U! L9 W) Z& U* ^6 t2 ~
return true;
2 W4 x1 W5 H5 ~4 i8 |4 p}
5 Q0 g# c' j- h0 d6 ?$ `
4 Y; |; r4 U* r$ q4 t H: m9 G" U2 [0 a& k
v3 U! t; Q5 }. Q5 {) G X6 N" l( J$ T/ z. V% u
: {5 c# }; l4 l0 l/ w# }8 D
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|