|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
/ T' H: z Q7 l8 \2 ]8 t
1 y, O6 p9 p0 s4 {$ e2 O/ n5 V问题描述:
" R$ e3 H, V0 m8 M- Y/ e- }在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
* i9 \6 J/ {, J; }4 a6 T4 ?
' V% B: F. {$ K图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。' G0 b! E. t1 l1 Z5 A n6 u6 E/ G
+ P4 h) |/ n4 T2 e9 S( D" v
测试结果如下:) t5 p6 ?6 T& O/ D
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?( }+ O8 K, M. T, |2 K+ Z5 O8 H$ u) ^* e
5 A( T: N, U: y0 O, x: u* P1 J
. _2 G$ O- H0 s4 v6 f4 H, a
备注:, m* l5 c8 W7 W- h( T; G' s
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
- `- h& g7 @: O% o2、相关代码如下:3 K* m4 h' c" V* G! y
//UPP DMA缓冲大小512字节2 C8 P: z; X3 F [9 H4 S
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍- e, l3 F! p* H$ \
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT1 Y7 i) o* D' P, x/ e
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
/ U( ~6 N* C6 c
' A+ W; q8 N6 P& X2 U
! M' T$ k! P. [5 d8 ^# N% L: X//upp接收、发送buffer
6 z- w( U+ q4 u* r#pragma DATA_ALIGN(upp_buffer_a, 8)
4 N/ d2 ^$ R9 y#pragma DATA_ALIGN(upp_buffer_b, 8)
; v! C1 W. F' M8 ?( |
8 q" s5 l$ S7 B, j! S1 Uunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
- z, }3 g; H; O7 L# Aunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
7 @, W. J% {- s! l$ {5 ^4 h# D: C1 M" T. c1 B: m* J" B- g. A7 p
) w, K7 z# a6 p. o& [$ pstatic bool server_upp_data_recv(Server *server) : V3 K3 S5 o$ i
{2 S3 S( P/ Z& n+ ~# Q6 p# X) s
if(server->upp_channel_a_recv == false) {
" t0 ^1 h, ]& Z0 e u server_msg_send(server, APP_CMD_LOG, "upp recv: start");+ d6 Z0 m& o' \8 o# ~& d: m
if(ListMP_empty(server->upp_recv_list_free) == FALSE) { s% o. w4 U F( f. r# p7 k
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
/ o# N& t* r& b# J7 a4 W
- y8 a- O2 B+ n+ K- f/ A' G2 J) ~# C1 m2 _- M: {% B$ b
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);" U# u- d9 ~! x" o
1 R) B9 F6 l3 X# l1 V* v& a
server->upp_channel_a_recv = true;//
6 h( r, `6 T+ A' x1 l* i server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);- i" s% M# v T" x w0 w/ d
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;9 h4 A: s" S# {5 N! y' q3 v
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
) ]# }, M a) b3 X9 E+ z+ ` server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//, i' F& e8 Z1 G( |8 Y% D
& T3 u- X" N% k8 L9 c upp_error_count = 0;
" Q8 a- l, J; b# ~ upp_dmai_int_cut = 0;. U6 J2 X$ x3 ] E: o0 N4 O
: v4 U' U' z) K B5 G4 Q. F: o
// fill in data + A: G9 ~( ]. `
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
9 |+ l4 i* e: C' [8 D+ ] server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
: ]' V8 O5 Y4 R, e! H/ X$ N }2 I0 S' { I. e; X5 a
}7 a! e4 K. K3 ~" a% y6 T8 z
else{
. Q: n4 E- E4 O9 r' y5 { if (upp_dmai_int_cut > 0){
$ H/ q+ x- |3 ^1 q! t DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
7 R1 ~! \4 [' X7 H Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);8 i1 |: V9 a s4 l" [3 d) w% L! g! m4 p$ T
. \4 _) _# T+ A1 z: q
7 s+ O( c" b ~6 {' }: p) ?' e //copy data to upp_recv_list_busy
5 K+ Y. Q, v U6 j memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
6 K! D2 {$ e- z+ Y; P9 i) z( ~
1 f; T2 O: e3 D //
6 c# L f; v* r; D9 U ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);9 ]7 E7 p/ W$ ~4 L' r
$ v F" ]9 `5 |- o; L+ k1 c; Z //
4 w% k4 M* I6 U2 q server->upp_channel_a_recv = false;//
1 o6 t7 }+ k6 f! ]6 X b: q& W
. O" H5 y l. g, A server_msg_send(server, APP_CMD_LOG, "upp recv: success");
0 K1 e+ e9 w% c9 m# R }
) E; Z4 V# o5 t% e! P# g9 S. V }: s& H, ^* v: M7 \1 P( a3 ?* i
1 r, A6 K, h+ d* A7 a- r; S; K) C2 j* h' d5 e; O4 \& ~. T; f1 K+ u
return true;
! L) F# `5 w% C' s9 }}
8 Y( K) j6 e; z) {/ B0 a) B
% B+ a _+ Z$ istatic bool server_upp_data_send(Server *server)6 J& g1 R7 q" k7 O
{
3 C, r$ ]9 y w) d" V if(ListMP_empty(server->upp_send_list_busy) == FALSE){
& K, ]+ M" {: z5 F4 ` V0 n DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);5 v+ D. K2 ?+ i
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);: H+ ~2 c& Y6 E1 a' ^( q" w! O
char tmp[128] ={0};- ~8 J5 d* A0 H$ }
! N/ `7 L) ] _6 W: b, V server_msg_send(server, APP_CMD_LOG, "upp send: start");
7 E( ~* U# \1 U1 } print_log(server, data, 64);
% [+ v4 i: U9 w5 E6 M" u, b! |, t% g+ X& S% Y& F& f7 ^
//8 O0 S! N* f8 r4 k
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);2 t3 f( k+ ^# O* }
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
% M0 N. `9 c2 ]) b" a" D2 u, |0 N9 R print_log(server, upp_buffer_b, 64);; F7 W4 P. D' T0 c; B
6 b% x/ L( v7 x* D
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);1 R& z# ]! f) o- ~
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; # V( Y% d* f3 F$ s0 m' V/ @* q8 _6 H
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;. Q) ?8 c8 S1 q4 J% ], j0 m; O
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
1 h. s, R* i S8 s$ d
4 E( G u2 p' D, }$ u! A* J memset(tmp, 0, sizeof(tmp));
~' D1 X, [5 B8 ]( v sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
6 {% f0 `! p1 A* y; I( S sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);- s& l8 q; C) z* s$ m" ?
server_msg_send(server, APP_CMD_LOG, tmp);
" T) u! [) R) Y. Y/ X3 m6 C* |0 V9 \8 c
upp_error_count = 0;
* f5 m- V4 Q4 e3 Y upp_dmaq_int_cut = 0;
: `. ~5 w) H) g. ?- u; v" l // fill in data
/ ?% _# Y7 Q5 V: l. t1 O& e- a uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); " a" N; D$ r- J2 r3 G& F
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");# Y p# g p( u' M/ a2 _- \
6 l* T; x6 e( V2 e; m+ g. T8 h) [ // wait send success: [( S$ v' G0 M' X% w* x
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); % @8 N7 }' N6 |
/ @; p- j) a8 K1 K% ^& Y" W // make data node in free list
7 ?. w0 Z- H( y2 P: i/ F! n ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
" j7 u: c5 d+ Z k) V# r ? x server_msg_send(server, APP_CMD_LOG, "upp send: success");: D. T% q6 O+ d# C2 D3 U
}4 I2 M, b" f9 K
return true;
, x2 i, M V; {! o4 P}
( R8 D- X5 ]6 f# L( N4 O. v; f+ |3 O1 C- U! R
, R/ f1 b+ `" n3 N! r3 j* z7 U
& ^8 e3 t2 q) O) h6 o) G& R+ e1 R: A9 \: G
- R% g' a4 ?8 f6 q |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|