|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 4 @7 L; p" m6 [1 |( M
! E7 W; Q# y( O问题描述:
9 m% C; a$ y+ g _在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:& \: S5 G* b3 x: d. q
/ E4 i; ]& \& O7 \" j2 F
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。/ e3 F' R1 p4 Q
) E* M- M% V5 X6 D8 }+ `3 ~' p5 S/ h" x
测试结果如下:, z6 K7 D5 j4 h, ?$ i
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
W) G& f5 h+ |
' j: c" Y" D9 y! j) Y* e, p6 z& ~( Z, C4 G
备注:
. ^9 t+ Z* T7 |# N0 H9 v, a+ B1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
) k" Q3 |4 _! {8 U2、相关代码如下:
& E! ]; ^) r% D2 I! L//UPP DMA缓冲大小512字节: K1 `3 I3 K9 G/ c: N
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
7 |' D: l! w }% d3 H#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT* N+ Y) E7 H" ^9 r' S( ~
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)" L4 t( r4 S! ]& g. Z
, r# K" U+ z) V. l( I0 W v
( N9 o7 m3 q) g9 k/ L+ I/ X$ t//upp接收、发送buffer# v& |0 Y! E3 H |7 |6 h3 o
#pragma DATA_ALIGN(upp_buffer_a, 8)
8 P+ V1 w5 T; j; F' W+ E#pragma DATA_ALIGN(upp_buffer_b, 8)/ y, ~5 I. I5 p* d9 g3 c
0 O* k$ T; h1 junsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
5 N; ]) u# H: G5 a- Punsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];: ^. `' l$ b! |
5 P5 l- r' d& @, N& {. {# K
0 ~) @' I" Y9 E$ |8 N/ ~" e& R. Z
static bool server_upp_data_recv(Server *server) ; j2 Q' Y- M1 ]2 E* r* z) ]& j. c
{
- q( i7 |( c9 ]' Y0 D/ v if(server->upp_channel_a_recv == false) {
& v0 L4 D# u2 [& O8 ^" F, M# A server_msg_send(server, APP_CMD_LOG, "upp recv: start");' E3 S2 g, ]% P
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {3 c: y& Q: g3 T& M9 [
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
3 d. z& }/ X2 w0 S2 l4 h/ C6 p8 o
0 i |! `* U3 |1 e7 R3 V- y' V$ I" ?3 d4 o8 V
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE); y' Y3 _) }; \' L% R" ?
8 r, B, D/ ?- y& c O( o0 ]% V8 }8 _
server->upp_channel_a_recv = true;//" V1 d7 S! S/ z' S
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);, h+ _4 {- F; I. `
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;8 h N" _5 G+ D# {* x6 M
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
& D" U0 [- c+ M server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//7 m% I0 Z, X4 Z
' H) _. t* e" N. f" j( S$ b upp_error_count = 0;% O' C' Y' v. n; W! S' n* C8 U. h
upp_dmai_int_cut = 0;# p3 Y# w9 U% k- n$ h3 k, v6 U
$ C2 z0 ?8 Z; V8 L* q% |
// fill in data ' q# G! A- Z; w' I3 c
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
+ f( j/ Q( K! s) A: z2 j, A6 I) @* a server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");- t9 o9 B2 b$ h
}
/ v& O. }/ }: V& H0 G }
8 y+ h* |/ x7 o4 J3 h8 K: _ else{
r- h$ |' J8 x6 z% \. B$ o, v if (upp_dmai_int_cut > 0){
+ w* N4 w, ^2 ?* p: @ DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
3 h9 Z3 J, o1 N$ Q Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
) i% b- R6 g' g: g" K2 h
# e' Y/ z8 ]5 N. T* c5 i
: }& `+ y0 B5 k. v9 A //copy data to upp_recv_list_busy& ^# {3 V% d- K% t7 y
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);& R" ]7 s& I! t2 {
4 m: E6 ]: `7 r; ^6 V
//( l7 B0 c, Z8 o9 M# T$ ?
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
! `( n% |. |: a( i) L/ Y
8 j' r3 f% X* ^. ]8 l: M5 W8 k //
* w |7 s0 g- ~' R7 h server->upp_channel_a_recv = false;//% F2 e- @% d/ m& x
3 F( C; W% d \( g server_msg_send(server, APP_CMD_LOG, "upp recv: success");
! V) {% k8 @& ]6 p }
1 N7 D) X( Z4 y5 s+ n }1 V( w5 A! P1 p+ ^: p' R; y
* H0 k: `+ c1 D: d; W+ ~" g, V
" r* K( K4 }3 q# x return true;
$ V& d& A) K5 Y, V6 E) P}
7 n8 D8 s; s J, h7 ~4 h: q! Y/ \# u+ e" U! e6 P
static bool server_upp_data_send(Server *server)
0 V# F% F! P* d) X9 F4 v1 A/ S/ O, [+ w{
( I/ s9 U! V8 Y7 h1 k4 s0 n if(ListMP_empty(server->upp_send_list_busy) == FALSE){
: Y* l6 D+ f, c DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
$ u* S! T' t4 P. m unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);" J1 ^$ n9 z) B+ B* _+ x
char tmp[128] ={0};
* ~% j R/ s' {9 _! f# `$ s- t4 T0 P/ [% {8 W9 C; J: E% n1 G* E
server_msg_send(server, APP_CMD_LOG, "upp send: start");
4 _, Y3 `& I9 m& }6 X, ]! y' ] print_log(server, data, 64);
' {3 K) \! f2 m% l
" @/ I/ u( q, G$ ^1 E2 _: C" D- b //" |" d Y; T5 R" N/ _7 T
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);& |% d4 _% K1 m: v5 D, e
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);* p+ V0 A1 K% r& t* f3 `( p
print_log(server, upp_buffer_b, 64);/ v& y+ `) K/ Q1 x( C% D5 s I$ S
% G; u6 E" z$ D2 I! O
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);& x6 c' a; e2 R% v; R, D3 C
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
: L) F, e4 y. |+ T6 I server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
8 T& ], d4 X+ M+ |& L- ~2 O+ c server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
' c" Z' R1 K- i' K- B$ X/ K7 e% ^% A* U
memset(tmp, 0, sizeof(tmp));7 |: T7 }& A- O! X8 ?- H& x& K' ]
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
" k# t ?4 r. S sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
) |1 t' m5 [* Y server_msg_send(server, APP_CMD_LOG, tmp);% L0 c# ~$ M8 y H7 W
( ~4 w4 s$ U! }5 Y5 ]
upp_error_count = 0;3 X; j: Q# _% X+ A+ i0 M
upp_dmaq_int_cut = 0;
; G. O/ {, y) X; F // fill in data
6 n' ?" |+ a8 \% S uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); , D$ k4 l8 z1 l
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");6 G# a& _' `5 g4 t
B1 K7 m2 `) y5 _" T4 @& u: b // wait send success7 C& ~" n0 e9 ^ U* t8 I
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); # r1 r5 K. k* B0 v( D! |
9 E( x3 ]. D; m: a1 j1 l5 v$ ]: { // make data node in free list
! f' _, q1 v/ m+ W8 s ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
1 G% b, D. u: @' k* Q server_msg_send(server, APP_CMD_LOG, "upp send: success");
* W" M7 h, c( A2 G$ j8 R }( T5 L: s; X' ?: G
return true;/ u: E, x% r& M( I% l# ]
}
1 S' G) U( g' L4 t1 a. D8 p" k3 q3 m1 `3 c0 Y y9 a$ B
- Q" r) d7 y a4 ]( v1 l
8 i0 C, `6 t( z% u
6 }- c+ v+ s8 G. j
2 t/ ^. r9 p! c5 g, l
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|