|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 0 W( k/ r/ b4 Q
& y5 K. _* E" ^, H4 `
问题描述:4 b2 A7 h; @, |
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
6 p( M S/ \& [- {3 G3 n
' r% F1 I @: r" n: v图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
$ t3 t9 A; F, ~% e4 L0 ^
; H4 E8 `5 Q# b' `. D测试结果如下:/ t4 Q0 S/ |. k6 i- h6 Q" F* y
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
+ L# ~9 C' h" `2 D! p) ]" v- U% o( F$ m, ]+ d, r0 L" {: d
1 ~% v1 X3 g/ x% T X备注:- i- }/ D2 d( @* H' e) k5 F1 @# u
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?4 b5 a; N6 E# t; \ a3 f) i
2、相关代码如下:
9 H& ^2 D$ }, z7 C//UPP DMA缓冲大小512字节0 u' M5 N5 |# ~& d( Q% i3 |5 T8 y* g- r
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
% e$ H6 J, X9 C0 V& v#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
7 j1 G' B5 ?: F- u3 ?#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)5 l# E; B/ O( O/ z+ S
& V3 `4 g# W7 C( V) j: q8 t6 j% f( H6 j( y
//upp接收、发送buffer1 N) X+ L2 M& Z
#pragma DATA_ALIGN(upp_buffer_a, 8); ^1 |* ]5 o( ^( v
#pragma DATA_ALIGN(upp_buffer_b, 8)
9 R# U1 T+ d( g2 {
/ Q( ]0 p. z: T, L6 o, v% a# Y+ Iunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
" n4 K: A# E1 P. d1 \( S( s1 _unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE]; B6 x( V: V6 U0 o. G
) R/ }1 t" \. l; Y: q' e4 v5 v
& }0 _2 b, Y: i
static bool server_upp_data_recv(Server *server)
0 `9 i5 p% v4 b0 q) w- [{
c" p B2 c z8 w/ G/ G8 v if(server->upp_channel_a_recv == false) {5 j( ]3 T) m: u9 p( Z$ V
server_msg_send(server, APP_CMD_LOG, "upp recv: start");: T% d+ X2 a& z; i
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {5 C5 O" l, y( e* r$ j- }% ]. W# W
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");/ Y' G3 `! ] L- w
( B5 ~; G p; j* @& i; S" I
$ h( V9 u8 p3 e
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);4 \2 ?, D0 a# L8 D- {
4 p) P8 `- Y# V O h2 Q- l
server->upp_channel_a_recv = true;//
' i& V3 O* Y* w t4 T3 U server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
' E! G1 \9 { B6 Z server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
. E- O( r+ _; h! F C! Z server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
+ G8 J# ?" ` O. K7 o# \ server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//1 J8 Y o* g) h7 n' l) w
/ r4 H* e* D* s! ~2 T9 N2 x( M% r
upp_error_count = 0;) F5 k& p# R9 L1 k4 l9 v
upp_dmai_int_cut = 0;
: y) @7 a/ l$ @; Y6 {, q( @; M( ~/ u y7 ~* f8 G; i
// fill in data
" x( h. @; z8 ]/ _ uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
5 H0 H) w: }& E% q; z server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");5 a2 c. A% s# \
}
. v; ?3 W+ m3 n! Q! T: w6 R' ? }
, O4 k. e& w% K$ ^% U1 B else{% [5 Q c% C/ |) f
if (upp_dmai_int_cut > 0){* ~ E# g/ E, a0 ]4 r/ [* B, Q
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);$ o/ P, m* ?- q9 q& L) n2 A4 p
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);' ]6 l* P6 r/ s. j0 W
6 _0 m: }' H+ r2 {, b* `
) L. e% ^) a# u; k/ T: m) ~
//copy data to upp_recv_list_busy
8 q1 Y( W$ L2 w: r- j* l memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);! Z* G' ]) l9 F- r7 d
, p4 w" T+ d/ j; c* B& E* ^
//
' L( u9 [% `' Z8 j9 Y8 [3 }5 r3 p ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
0 ?1 A' u# G$ Q& N9 ~$ N9 A' T+ Q
//
O5 m8 p; {% M0 M4 u! C server->upp_channel_a_recv = false;//8 T" r, Y, x% Z. H9 f$ |+ ]4 f
; ` H' D$ s! y3 Q! X. W; H
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
. \8 d2 L1 f; l$ m$ f+ X* R9 { }
9 `1 x' m, b r! h }
, _0 D/ |3 c! ?! f2 b t
; B) F; e$ l; o
* H0 j: o/ T. S7 N" U return true;
8 i; X; v& G2 A( O) f, @}8 P/ ?" K# j( |* f: \; {0 m# r
7 z# [3 I4 |% `: h) _0 _' r5 V6 Sstatic bool server_upp_data_send(Server *server)' g# l. G/ @! W
{
1 n9 m* u9 \7 \! x/ W if(ListMP_empty(server->upp_send_list_busy) == FALSE){
, _6 P, N: J8 P9 o( C. q DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy); D. I$ b' ^8 A
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
3 a" L% i1 q' _$ @4 n. K+ O) d char tmp[128] ={0};
/ k& Y3 _ b( V1 o% A7 V( ?* a- y* C. n$ q
server_msg_send(server, APP_CMD_LOG, "upp send: start");
+ k, Z4 @8 _0 p, y2 ] print_log(server, data, 64);
7 y' @% w8 I* a% [% D" R/ _0 H5 I' Y5 \" x2 [
//
0 T5 c( B" ?3 p! R2 e$ ^ memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
1 f2 v1 Y6 q- u9 k memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
/ ?* z( I) k0 d5 P6 p' W7 r print_log(server, upp_buffer_b, 64);
& b, P* R0 V) o& Y3 I/ P! u+ j# n, N& ~5 n3 C
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
5 p7 O3 |- o# u server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
3 k# V$ O" c. Q* p server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;! F' @1 `' M9 G7 y& e
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
7 M `' f) I9 M' z% f
; u4 @) w n$ t4 m# V1 G$ L, u memset(tmp, 0, sizeof(tmp));
; U" g5 \. R- ` sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
1 Z* ~. Y5 [9 \ sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
7 M+ [$ W: ~+ S% a4 l server_msg_send(server, APP_CMD_LOG, tmp);* y* t% j4 l2 S& Y4 j: H; x. }
3 C) Z" w. I: O0 P3 L* P upp_error_count = 0;4 Q$ N0 n4 I. I
upp_dmaq_int_cut = 0;. {% r3 L# X& y$ c
// fill in data 5 r! C: w( U! J( ^' k/ \& ~
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
1 `" h: C3 I; ^. y server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
2 V2 ]# p: Q1 |
4 x( k/ ?4 Q! Y8 a // wait send success
3 Q; S1 M' n2 }& b6 X+ A' } while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 1 T- \6 ]8 @9 \7 Y
' @4 r7 o2 z& I# e0 {: d3 D9 z$ U // make data node in free list
/ W( S& @5 K2 {: J+ @) e- c ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);: n- H6 Y' V: n
server_msg_send(server, APP_CMD_LOG, "upp send: success");
; x B& M% u) k }
, C9 Z; y* K; l return true;7 B; v* W, H5 `2 H* a7 }
}! `$ `9 ], H7 j8 K$ |7 F& ]8 u
8 V. C$ V4 h6 f2 n ^: a
8 {4 R8 E7 x3 c: S7 V u5 l; X. B! o; P5 h3 {+ @
/ ]/ Z) e. y( C# O+ @ |; @
3 w; m' D- {7 Q4 q |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|