|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 # I) U+ j% e7 p3 C2 Z2 D
, y: S; Z+ c7 t7 H
问题描述:
8 {5 e# z o$ V; C# z; j y在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:+ D. D' R+ Z: g; N' Y. u, d
3 I/ E0 g! m! k
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。( R4 ]2 c5 \( q0 S$ b, {
, \& [5 H* l0 I3 b" M7 s% b. C! v测试结果如下:, y9 H1 r: d9 m& X1 G
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?# @4 A+ T+ Q& \: V# ~
5 K) ?$ x& q5 N- L7 H' M! h1 I% O9 P6 q: C1 _, q1 H b- f
备注:( @! h& n% y) D4 h7 p1 U( k8 w8 o
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
u) E3 O* G( x8 y. l2、相关代码如下:3 k% ~; k# n5 C, Y: J& Q
//UPP DMA缓冲大小512字节& _- z' b& P2 j# C- k4 M+ w0 n; W @
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍 `& y1 o* r# d( s6 D
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
5 G6 y# a8 ~, w#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
: D' J! J- H s) o( Y2 L6 D2 x4 M5 ^
# O- v! v1 V. d9 f/ i# J1 e//upp接收、发送buffer+ o+ ~4 @" c" l) [
#pragma DATA_ALIGN(upp_buffer_a, 8)* c8 S f( T4 L! r
#pragma DATA_ALIGN(upp_buffer_b, 8). r) N* I* R3 [5 w9 W
1 e; V! k# a6 I0 c6 G, r+ T: L$ Aunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];7 o7 U1 s6 V) e6 d9 K2 ^- g! K! U
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
+ ~7 \$ T7 m: V: ~/ b+ K; m' ]+ ^4 H5 a
- X) g! Y! w0 K! Q, b, c: b. P
static bool server_upp_data_recv(Server *server)
! Q% f, J4 I7 m1 B+ a8 g{
0 U- l8 c2 @: I, ^! h: | if(server->upp_channel_a_recv == false) {
# T. l" J Y: o @ server_msg_send(server, APP_CMD_LOG, "upp recv: start");: T& q: a" A. U0 T* v$ [: y* ^
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {* }) V* d+ g8 o% m) y2 o) Y0 U
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
$ [3 o5 t! a: h: h" S8 Q4 s9 z" O7 G% `$ _/ o5 B$ O8 ^
M9 l$ f2 l& u* C" ?- T# J$ | memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);3 I: V; R2 Q! W# v
, G" E7 d8 ~- z' q* h4 M5 q _5 m server->upp_channel_a_recv = true;//$ t% s2 E! Y& T* m
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);* L. \" {* H8 S, k# D
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;1 I1 [( k7 S1 Q* y; b
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
S! X1 v* _& a' S9 Q server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//2 R5 X- ?" S+ Z2 C9 J' |
2 U4 P W6 W$ X' P' W' m& {' }' F/ d
upp_error_count = 0;3 A, x& }0 {! C% T
upp_dmai_int_cut = 0;' g( T: u6 i; k& U W3 c1 q1 [$ P
# `/ {: {3 ]8 ^8 y7 h
// fill in data
5 {7 ~: L, m" x2 f' L uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
W- O& ]% I5 p9 ], P server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");. O4 v4 A% _ w
}
3 i/ j$ g* \ h; l, E }, [' ]: R, i l
else{+ y3 @6 \" a7 ^) A! h
if (upp_dmai_int_cut > 0){' B2 m. _- z6 u: E4 t S6 O
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);6 a+ E& _2 n! ]5 {8 h, X
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);" Z+ q/ F4 L+ I* ^( q
4 n. i; b2 [5 o" s8 a' d/ g6 j# P* }2 v L+ a: w( v& l5 w) E
//copy data to upp_recv_list_busy( l5 S/ }, {7 B6 Y
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);) w; A: z7 m+ g
/ K& h, ?# Z+ ?$ {6 ?4 m //( \: I, J9 p7 X( o4 h( S8 T
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
$ u! M$ [# a1 |# u" `$ h! J+ ]; v Y( ?! {5 p
//0 [1 [& H% r @. i3 c* }" M9 m2 Y
server->upp_channel_a_recv = false;//
/ g v% n1 k" ^2 o& J, h1 c. S: Z G2 A# A9 K/ f- E% n5 n
server_msg_send(server, APP_CMD_LOG, "upp recv: success");: M+ M& q% r4 {4 K$ U ] r& I
}
' Z3 F# X; R5 p }* \% m. \1 q. `/ o0 k+ j/ G) o& U; y
: o& ^6 L; M. T4 \$ l0 x, x. n2 |$ @6 L# x4 N. U
return true;; o% W( L6 A6 a8 d' S
}
, j2 b8 m* a1 M+ g' n( P# E- u* l; X, Z1 q5 e9 U4 y
static bool server_upp_data_send(Server *server)
! a+ ^* W9 T) H1 J) y{
$ I* K8 b' G" Q7 n4 U if(ListMP_empty(server->upp_send_list_busy) == FALSE){0 v; B" G& e; ^. _: H
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);% h: `' t m9 d( a3 A
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
7 f# p: A P* f# s: ^ char tmp[128] ={0};. S# z1 ]7 ^7 v! h1 r' ]! ]# [
! Y$ Y3 }6 ^$ f y, b" `6 C9 R7 I
server_msg_send(server, APP_CMD_LOG, "upp send: start");
8 U" e |5 o* J+ i9 G3 _& a print_log(server, data, 64);% O+ M1 S% @" X) Z( c
. x$ U: Q! j( \& J7 U+ o3 D //- V& ^& [" [* x; n
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);! K1 I ?6 O2 y7 A [
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);/ r7 O, h- @! D* ^: [, ^+ F
print_log(server, upp_buffer_b, 64);( e2 l2 E4 D3 r' e f
2 s" j) u3 \) n, z7 h' @ server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);+ t1 `0 |7 @6 G+ P p% C
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
3 M' X* r" F2 k6 i% O server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;" q: S$ y. y4 D* w" M/ i* T
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
, l8 D) H/ F8 B
7 i" D2 t2 b- [9 k memset(tmp, 0, sizeof(tmp));
+ \3 j5 t8 b) X6 W sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
7 s4 R+ E5 Q1 Z9 u$ y sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
- _/ g" k8 _5 \: K7 v- b server_msg_send(server, APP_CMD_LOG, tmp);
6 j3 R$ @) V5 `( h0 w, ^; K. G( q) t# n: b3 n( z6 Z
upp_error_count = 0;
$ T" R- }( h- @* d5 ]- D/ m upp_dmaq_int_cut = 0;, l# K+ _& b/ d$ `% I; j
// fill in data
$ w( J& m* U) S/ H! Y7 k# ?, v uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 4 ]" `+ H) J$ A9 |- d
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
) M0 d) x6 J+ T& ?0 x; u+ p2 j- i6 I3 M% N& V. U+ m
// wait send success, t/ V0 n! J* v3 H' n+ M/ `: ]
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); - I/ }7 K; ~: d0 }
( ?+ i) N$ T y& ^5 ~7 ~ // make data node in free list
9 [3 P& S( L9 b1 @7 X ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);/ @/ c' x, J& |, W
server_msg_send(server, APP_CMD_LOG, "upp send: success");
% w0 V8 t! K1 G5 h4 m- Z }
. U! s- [& c6 U" _ return true;, K. ^4 M+ H, l; C3 J$ i
}
$ f+ X) p$ j/ g
! K$ u! F4 f* x6 s0 l, M5 O% n" ?& @3 h9 J1 N+ _
* q7 C- k+ f2 i
9 s, `, O5 P7 u5 q, x5 }
" G2 y% p# b7 t1 z$ [1 p/ ~6 U |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|