|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 " h7 J! V' A: d' X' v7 Z
) S# \% h) P) I f/ m* S( K问题描述:
3 _0 f7 a) |' @# R$ w2 I/ F在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
0 q% z8 w: z: G+ y" p
+ F6 E, d D2 G( t图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
' q0 u) ^+ [: |- _# p0 M+ Y/ _! a U( h8 t4 @* j- I3 q7 n
测试结果如下:
) l4 A1 J& k9 J' m5 B138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?( `# b7 Q# B, y- A, w" `
# n3 {" k- o. R- ?5 S
5 Y. a7 L3 F- k6 Y. N7 U' j2 T# Z备注:
( {# b$ `6 }2 h7 Q- O9 O+ O1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?% j8 I& N" S9 ], k H: [' U% ^
2、相关代码如下:
M4 m0 w9 o6 i! T2 _! U! q/ C) ~//UPP DMA缓冲大小512字节
) v. @5 y; @6 p& \, ]/ E7 O% r1 [#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
6 g' X) n, l: n. r) v' G#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
, }; Q- P( g: w3 p#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
) o& Y% Z8 Z8 b! ?1 m c7 C( {4 q' f/ u+ B& L% @" v7 F
! ?' Y! h; R: Q1 h$ Y3 k//upp接收、发送buffer( L) X! N! d s: v( t
#pragma DATA_ALIGN(upp_buffer_a, 8)6 T! @; p) _6 n4 w
#pragma DATA_ALIGN(upp_buffer_b, 8); H% X5 i* S( t- F9 Y
: F) r" J5 ?2 n/ L! q/ p! g
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];' V& M. ]$ c; Q! R, K, g5 ]% z
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];) D. q9 v8 c. G1 v8 J N
! {1 L- j# E3 e5 l. ?* T
) P) u* F3 h( V0 g; |static bool server_upp_data_recv(Server *server) % n- }/ M3 i/ A, ]: p+ i; W5 W( m4 ~
{9 |7 K7 F" ~! Y' l: X
if(server->upp_channel_a_recv == false) {
% R) U/ f. A4 S, P server_msg_send(server, APP_CMD_LOG, "upp recv: start"); o# P! A& A) p% G
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
5 y6 q& G! F7 k$ {0 ^0 }; _ server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
; Y8 |/ q% ^9 ~4 ~% ^5 Q0 Z
: X4 G& J( y+ ]; n8 c! q& `$ ~
4 t4 n1 m+ d$ c9 F. s memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);, h- E3 b8 C; T$ [( `# t
+ _# b: A F' x3 ]4 w' H9 P; h
server->upp_channel_a_recv = true;//
5 L3 k$ x( N9 u$ l0 V server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
) U; Z& ?7 E0 T( d9 g server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;& i# {* Q U6 T9 n9 Q" m8 u- m# j: O
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;2 g' e9 E2 U6 c; W
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//$ y# ^/ o: K4 h5 j
8 U0 Q1 s k4 \6 e! H upp_error_count = 0;
5 q% h$ s1 m, K. F7 f! P) }% E upp_dmai_int_cut = 0;! E6 Z( \# v0 U2 Q1 H: s2 `
& j5 }7 r" O$ ?5 E: y: c9 z6 v // fill in data
8 w: I2 s" s3 A2 n# [( G7 A uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);5 }0 ]& L4 [! |: E1 T
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");! k% T3 y* `' [$ `8 Y) [! q
}- P; g+ i9 M0 ?% X6 E
}, P1 @1 p0 a$ R( B8 }. c* N
else{
& n" m2 ?! J$ g# Z' Q if (upp_dmai_int_cut > 0){! k( n* o/ i! a: _+ R
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);4 E1 k* v$ w" D9 }
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
/ v+ Q5 P; O) [# F# t; E5 F/ S% I+ Q8 ]: j0 T4 g. Z3 R% k, s
F' r5 h) f! I4 a. f6 b1 u
//copy data to upp_recv_list_busy
+ k% @; D7 E8 r& b5 _1 p5 ] memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);7 F9 O0 V* }, w* A
* E" T% [1 o( I0 e
//
- Q) o ~5 y/ \7 n! c2 Z ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);# g: P- `7 W/ i/ d8 m
! m: m% \& M( ]& z+ f
//+ m) R) o8 K' [. L2 _
server->upp_channel_a_recv = false;//
4 x2 @9 [) ~1 ?- |% r. K, `; u
8 a, ?# ~7 I4 b& s+ s server_msg_send(server, APP_CMD_LOG, "upp recv: success");
; {4 {& B6 ?4 L" v1 G( d1 y }
+ }2 z s- B. I8 [( C }
& s/ ]- X: [. Q, h9 z/ r& c# _1 Z! \" {2 g
* C: F0 V+ K ]- B0 I9 d. x1 O
return true;6 Y1 R* a+ d, S2 a" X9 m; S/ Y
} @; @( ?9 U& z- \# x8 V/ W1 x
$ T2 @$ r; ]& b4 h$ ?- {
static bool server_upp_data_send(Server *server)
; y6 v* u' Q9 n{7 d0 R$ U3 D. Y& d
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
' ], _. {5 Z9 t+ t; L b9 A, T DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
5 q3 }5 [' M9 S Y3 E unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);+ p* G) ^, V' `, ~
char tmp[128] ={0};
7 O5 V1 r2 w& N/ t) H
$ x: O. j' l7 }% { server_msg_send(server, APP_CMD_LOG, "upp send: start");
& X4 _! f$ y6 Y5 B: N print_log(server, data, 64);
2 R+ L/ s+ k# V9 v$ [- [' j' ~4 o- T8 ?' z, X, t4 m8 x1 m7 @" t
//2 G. n- c% g4 A: U" Y4 h2 H% F
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);$ ]; N" \" n8 i; q
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
9 m" G' ?% q) l/ D8 | print_log(server, upp_buffer_b, 64);5 Y) P% o7 {/ @7 L6 f
; v" G" ^' {# ?5 m4 s server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
3 r: J# M' D4 E; _, C server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
& B7 B5 p( Y% X9 _+ K server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;; |$ E$ ?3 C6 B! z2 Q8 s
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT; V) W# ?0 D/ e" z4 @
1 f2 j! {( p) g memset(tmp, 0, sizeof(tmp));5 P* D6 X8 M5 f/ _9 N, @; c+ c
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 8 {- o8 F+ r; |
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
+ \% \% `; v% n2 }3 S) X6 J server_msg_send(server, APP_CMD_LOG, tmp);! }, X' I: N# M3 T
( Y. j+ b& G9 y' B4 S
upp_error_count = 0;2 S4 z; O. {% z
upp_dmaq_int_cut = 0;
. l! z% a, P; X: f2 n/ ? n/ s // fill in data ' z; z) h9 w, ?1 l/ G+ B
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
) t8 a; b* n. Q* Q& R" d8 N k server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");; D; s* P. c, B6 ?8 P
& G |, Y6 ?( u // wait send success
+ e8 o1 H M$ R& K5 @3 [* ~ while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 7 G6 \0 f0 i0 [) j* M. V; s
A9 n+ N0 K3 ^- |* R
// make data node in free list L% q3 {( q, D: Y! t3 u! f
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
# |' x8 N$ r* Q& O! \; c server_msg_send(server, APP_CMD_LOG, "upp send: success");
0 X3 ~- r# }' |: m/ `6 k/ q, N }
! z7 w% z% n: j) }8 l return true;
% Y$ J4 @# g; e" h. [}
* S B" p0 o+ U: ?1 {* g" T% H- G% k5 f6 W0 K0 i# X" U
$ ^9 i) i8 f% \' A; q; z7 O0 p/ {
( B, P& o8 m5 H( z6 a/ o8 I& U
% @2 m8 @5 [/ U4 c# x$ ]
' V% \' J- S% ? |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|