|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
7 A1 R4 o6 Q2 `0 V3 d
9 a& B' b! ] r% A* P& g: u) e问题描述:
1 T. g9 c$ S$ _1 v4 Q在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
4 p( Y; v/ w/ S. v# G4 ^
3 n8 L) v% G$ i& I) V$ U; l, h图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
* a! O+ e, X3 s- ~6 h& q F Q/ R2 k. g
测试结果如下:
& D% n- f0 K* i# d7 a" l138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?8 b/ V1 _4 O. `5 K" Z( p
' R' m; ?5 A* n ?, B2 L. P) ~# A8 E8 s6 O6 L ~( z
备注:; s( | X) \3 J3 I( R
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
8 n+ `1 v: ^+ |% M2、相关代码如下:. Y) p) E6 G" {$ u2 y
//UPP DMA缓冲大小512字节: H* |$ J% n& I3 P0 E* T
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍; m! o% H. ]$ c9 u. e1 }7 @
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT2 C1 \, G* c* D: O7 K9 R7 Z9 R0 m
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
) `' F9 i' A0 U2 L4 X% y; y+ ~0 w" r% w; n2 F1 O0 O
8 ?3 m: J) ^5 [9 H# @
//upp接收、发送buffer
1 @ t% Y5 R' V; j1 L#pragma DATA_ALIGN(upp_buffer_a, 8)
9 K- G! _ {3 J: ]+ O#pragma DATA_ALIGN(upp_buffer_b, 8)7 n. x z6 {9 }8 c; d( E8 G0 q
- z1 E. ]- g, O* M8 D8 Bunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];4 b3 u* z5 x! ^& V0 ]$ ?8 c
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
( Z1 \$ N1 T- s o8 B% I( n9 R( A. {
! T; s7 o8 [" o6 _
static bool server_upp_data_recv(Server *server)
$ Z: |! G0 S3 [9 g5 u* ?{
. u+ i5 I' L; N! K: h if(server->upp_channel_a_recv == false) {. J/ m' n; e; c! o8 l+ p2 [
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
& r" x+ Y- D8 G if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
6 t# V* W0 v$ k% p2 l# D, W( T- W server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
( x! M( a$ }) T
8 Q) a& ?4 {, y( t H* o* a
- T. q8 K4 y) p5 B/ C' R" c! R memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);( Z3 ]% O* {8 i
: x6 D2 x! l( g' V5 M4 \ server->upp_channel_a_recv = true;//4 U1 L7 N5 E+ I9 y
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);% J' S" A( Y- R. q+ ^ T4 h
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
. E6 l2 I7 z1 q5 v3 a0 T9 m0 O server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
6 ?: z+ \6 \% h; Q A+ d server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//3 \1 {# J" u# E9 h3 @( {6 D
: Z0 S8 P' w7 q, q7 V
upp_error_count = 0;
* k. c! k! j0 k6 S: n ` upp_dmai_int_cut = 0;
0 n5 L; F0 E M2 B: q G6 H0 X% S% j' {+ K7 [- I
// fill in data
, S9 _ q) c) B uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
1 `, d; x0 F1 K% y* t server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");6 v; k4 k" t3 @+ b" A
}
v+ i, T ^6 W' z }" k& A3 I/ n2 s8 n7 h
else{5 N! t2 q. x' E6 E3 ?- O2 e6 H9 u
if (upp_dmai_int_cut > 0){ Y( B% J6 ~' C) r- l s# `# e5 M& K% N+ ]
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
6 [& A. C: i: ` Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
2 B0 |# i! r5 J; y3 c+ |* F% R% T _/ e
* e7 S" v* p) h: l9 ?- i
//copy data to upp_recv_list_busy
& `0 ^0 D: n" }& L- N% i, G7 @8 o memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
8 b+ d+ p. I; p
" E( y, J0 p* l, ^8 W! p, b //( N& {: j5 B0 g' d9 R2 I3 ^; t6 y- Z- t
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
7 I- g- S, Z" S5 ]* j) Q: x
! ^% g3 [) g" x" i3 O! L. P; y //! Z7 c) q/ ~4 ^& B
server->upp_channel_a_recv = false;//
$ E5 B) H( x; L+ P
7 b- z. R3 q- B9 ~. d* { server_msg_send(server, APP_CMD_LOG, "upp recv: success");
+ z( E ~* m1 b2 X* }6 o }
1 |+ u! ^6 L( z; R5 ? }
3 g0 i2 r0 l7 Q# B) p; ]- \
) F I- j5 R% V4 x7 G$ d1 N* R7 o0 L3 ]
return true;
( o# H7 b) B8 O}
6 X+ F2 A. I' y" e
1 q E$ ~5 o3 {! R3 I' Qstatic bool server_upp_data_send(Server *server)
' G0 b! C2 _, @) A' g# O{& x2 z$ G0 N$ t* \1 z, Q# _
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
$ S$ L! }, u+ P DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);# }5 s! {7 H/ {; ^/ [
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);1 `6 d& `, X3 {5 ]6 z ?$ `
char tmp[128] ={0};1 S( M4 t, w' |1 X6 D
0 Z1 B: }5 n, j server_msg_send(server, APP_CMD_LOG, "upp send: start");
# y1 L3 L4 U8 |& e! N3 _ print_log(server, data, 64);( c8 g4 o2 G8 t- g9 q
: W" J+ a8 ~3 Y- I: I- J; W //5 v# ]2 m( H* O0 s" s; F9 c3 q! k
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
* }8 {% r4 f3 A j1 y/ q memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);1 V( y: B, w( |0 t2 N; |
print_log(server, upp_buffer_b, 64);2 K7 U% _0 I) ]2 u# T* `; X! C
4 a0 l( e9 Q9 J. c server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
% d a2 R v8 k" P server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; + @: |7 _! d) C5 m W% A' s
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;$ O6 }# a" l4 X. q
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;1 l: A* w# j. [ L2 t, M/ S+ m
: L- [5 f& O+ Y) R
memset(tmp, 0, sizeof(tmp));% n! s. Q3 m' }& ~- s1 P
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
+ X" W7 D) g, l" }; A P$ O sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);# f5 g# w0 y p( ^' [
server_msg_send(server, APP_CMD_LOG, tmp);' j, ~) Q( F/ I1 q1 p3 X
9 `) Z2 h8 `+ J
upp_error_count = 0;
: ^5 _, H' ^3 K( _$ o: _. T upp_dmaq_int_cut = 0;1 r+ V$ w0 q% n7 d. s
// fill in data & o% r5 O; R& H9 [9 b
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
7 Y, X+ I7 {$ }4 Y. C& @( q server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");. K: {3 o' J) L* G
+ [+ I) \. Z9 \8 G: g4 | \ // wait send success- J& C, `! r+ ~8 E0 E$ C1 u+ d
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ( }: X/ v p$ K
0 q7 c+ F5 X6 i. R4 P6 Z' L3 `: y // make data node in free list
* l* P) [* k" V" w6 x ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);+ t. F/ ?5 O0 I* K& @# w7 i2 C
server_msg_send(server, APP_CMD_LOG, "upp send: success");5 \/ `2 |, z; G( J, B
}6 g, l: e$ D9 ^" ^9 E: r. L9 A8 X& R
return true;+ `* j4 `1 U- L" R) w
}
8 a; P# [1 D# K9 c$ X
# ]% E1 N" \9 y- f) f5 |5 i$ S3 @; U; H- l3 S. @
! g" x# \0 H$ h. b7 R- a+ ]: S5 }1 J3 I6 S" R) [
6 S, j2 T5 W0 |5 C; j' q2 s# N4 Q
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|