|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
! l& M' A( m! x3 D- g& W: m
! }" ~& O. `. U: U* E2 J& N! S: p问题描述:
! o2 e8 d. h3 w4 y$ Q+ X/ f; C在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:* A' E0 k# ~# `/ f$ @
/ Z$ U3 I3 w& B
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
; y& f G" ^* A. s* q+ R4 v
% [) G A0 S) J$ _" Q: ^% c* O测试结果如下:1 `% D0 V( M" }3 E
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
. ~- g5 o# z; i
8 d1 w j% y( m! ~' O
% ]7 j. S% f' K' B9 L$ E备注:' n0 l5 f- V# w8 H
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
5 o6 @2 [+ Y, I$ d2、相关代码如下:
* M+ ]" `$ | M% m! c. _//UPP DMA缓冲大小512字节6 e' T5 u/ W( |
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
7 X3 W& d& }( x, _* c& F3 C#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT+ W3 k9 A6 t( K3 ~# H6 s# e
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)$ T- T9 S4 L: c5 v: _
. ~# u, }# ~# `0 H* `0 _6 O/ {5 O Q/ _7 D5 l- r+ R5 m x. J' `
//upp接收、发送buffer; s M$ g. j0 v, D0 H B# k5 G
#pragma DATA_ALIGN(upp_buffer_a, 8)8 T( H( y# @" h) Q+ Z9 {4 H- Q4 l# o
#pragma DATA_ALIGN(upp_buffer_b, 8)1 r& ~& _0 v& T1 q
4 H: ^' l/ K+ C8 |7 u; Q7 yunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];8 [8 n: Y2 n9 N( p* Z* B- X
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];" R* W0 b `% y: ]0 }$ z1 A
" a) G- J% a w W& h V
$ @0 O3 a9 a8 I5 lstatic bool server_upp_data_recv(Server *server) ) a4 e7 c }* L6 n
{
1 _- c8 P J. j. M4 j if(server->upp_channel_a_recv == false) {3 E$ B T* a: Y$ J- L
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
: @+ L0 x, {: p2 ]2 | if(ListMP_empty(server->upp_recv_list_free) == FALSE) {& E7 r: t" o2 F0 I _
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");7 W' A; W& ]* C; F8 ^2 Z: ?
2 L2 J$ `* V3 ]' y# v4 L* k. N% v* |: q
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);8 `3 }7 Y: l4 A g3 Y. l, g
' ~, [% ~& R( `+ f, O6 A7 y server->upp_channel_a_recv = true;// Z: e! v$ }& ^9 q2 t2 a
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a); F# h9 a2 t$ _% h8 w
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;7 W; |7 H( W! {( a2 t. r, Z
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
# w7 \, A0 }7 g! q i& Z server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
/ W' E7 A2 V; I
W; g/ p" K( h% d. @/ L upp_error_count = 0;
! Y' l& e' u6 v3 }9 h upp_dmai_int_cut = 0;
0 L# }) Q/ G3 [8 [& s9 r( y# p
. \+ h4 i+ f7 R( B. g& g1 I' W // fill in data
; t. V% @4 v. d& t% i* x+ h+ u0 Y" F, k uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
' Z, s( G* c+ C) C/ q5 f9 u server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");1 x+ o! U3 U& S6 G, R2 U
}
* f4 S9 L7 j( g% d3 ^ v1 x4 C }
C& a- ^1 q0 O* }: C! P3 t; A else{6 P# C7 ~* _. Z! B7 S( z
if (upp_dmai_int_cut > 0){
, y; e5 ?5 K5 C DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
~6 l2 n }. a) t1 S0 C% A Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);6 J1 F3 {# A% [
1 o/ o. C' k( K" m
5 E$ e1 ^1 F9 `+ o1 Z9 ]
//copy data to upp_recv_list_busy6 y6 v! v0 z8 h% q" @# D
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);# S: V( Z8 B0 a# B) g
4 g% t$ Q }4 n, X1 W! n- z0 b+ C. ] //
( x+ R4 t+ w" O2 S) I" H2 {- @4 d ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
# F! { u' |# g0 t) Q1 _5 ~5 d# F+ f: W( a
//$ U' c# r# p: ] u% d, D
server->upp_channel_a_recv = false;//
2 l0 U: y8 w! a# r+ g# r
0 W4 c; x$ g* }# ?- _ server_msg_send(server, APP_CMD_LOG, "upp recv: success");5 Y- b7 A" x. c) L) A
}8 l! @. Y9 `# a5 v* E
}
3 }2 x/ V& R) u/ o8 d0 q. z8 f" r4 W) T5 A; ]8 g# q, }& l' {
8 O& P, x" y1 j, F8 w2 ]- Y
return true;
& v/ N8 }2 J2 b2 q2 v}. v) V7 \- a/ q- n% D- K
: m% @/ p8 U }, L! H& e$ k H& J
static bool server_upp_data_send(Server *server)2 |# _4 Y, G; j( a
{7 Y* ^) U7 ~! k5 u
if(ListMP_empty(server->upp_send_list_busy) == FALSE){6 l4 n3 N) j2 b
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
+ E0 q" C# Z/ K& J unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);( V( F5 v) V* l- K* p
char tmp[128] ={0};: A% u9 o! G: q* l5 e- w2 A3 A v: @
$ i+ S# L- j; Q9 ^- }( k
server_msg_send(server, APP_CMD_LOG, "upp send: start");, d: E1 e5 M! {1 h% r
print_log(server, data, 64);% k7 h" A% N; @* w2 _
+ r* f- o4 v- h* h* r: p
//$ D1 M( i! @9 v9 V1 q5 G
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
# q; Z* h" `) f2 v7 l8 g memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);* j# ~& a! A' R |
print_log(server, upp_buffer_b, 64);% }2 j* N: f( s2 ?3 b( `# s2 o5 f1 O
# n6 x) U" U( ^5 L: O/ t8 n' l server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);* L& v9 Z+ x1 D2 P+ h$ U
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; / w; |/ Z# |. G. m8 N
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;, E* d. N! f: F" t7 V( z
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
- {& A+ M3 X1 q7 g4 n3 M( T; N# i3 S4 \8 s8 z3 ]
memset(tmp, 0, sizeof(tmp));: E6 Q' Z9 T: ?6 d, [
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 8 ~- g, Z% q" A4 H2 }. Q: b
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);8 O5 G1 t7 A P7 W( S8 Z
server_msg_send(server, APP_CMD_LOG, tmp);" J5 h) N8 f' c. L, ~! r L5 G
& C0 R6 ?8 i# F1 r
upp_error_count = 0;
b1 o3 S( |1 Y% B9 k upp_dmaq_int_cut = 0;
4 c; H. U; `3 _, ^# \( I9 v // fill in data
6 Y$ W1 | l, k+ l- x- k: D4 L- i8 ? uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
+ H2 ?* {* K% a6 V2 Y server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
1 m/ g& [5 @" l0 G) n- M' }6 }6 {3 j! D0 I3 F0 `% ~8 a: q
// wait send success3 P: Y. ~3 a) C' M( j; B$ `6 O
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); + _' k; V- i! f0 q8 o
( s3 D u. o/ |6 V% x! W) z* |/ W // make data node in free list & V1 l4 U3 i5 Q4 z7 t" g9 _
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);( y8 a. E3 U4 B+ K( S0 V
server_msg_send(server, APP_CMD_LOG, "upp send: success");( J& U/ L; M$ y( T9 ~
}
7 m( j' |; l3 r+ C* W9 | return true;- s% Y% Z6 B3 @: n$ Q: t9 R3 r* h7 P
}+ u$ `& T# H# N( `/ k
! n. R1 Y# d; b+ ]
6 r- V8 [; i' ^. [& y( u3 m7 D1 K4 c
1 {$ ?7 X+ r& m8 Z* M
. M' R! v/ m( i3 u; z/ ~! W# {; z- Y4 E" x$ u+ l9 i
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|