|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 0 e0 j5 Z' k$ \" o+ _
5 [( b P" e! d. v
问题描述:6 k$ J: h/ t( c, R" P0 @
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:; L1 ?. c9 S$ s9 K, c
% m2 D+ Q* r. p) W图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
- o t p1 S" B1 b0 O7 R% L
/ Q! e' Z9 i: X+ |6 `1 H测试结果如下:. H3 ~: q0 S& I. Y0 }/ X$ F' i2 _
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?& i" x1 R- g, U" Z8 y- M# Z& @* S
; s) c- w" W# |3 G6 ?$ d# L, j) p
+ I0 R9 @) f; u9 ?/ Q; M备注:3 d) _) U4 ~. \: n- ^3 S! V
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
0 B- I9 D4 }* {% x0 v4 t" O/ n2、相关代码如下:
- h% o. i, A8 c$ b& ?//UPP DMA缓冲大小512字节; m a; x& c2 i0 i$ ]4 R& z
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
b: o' k V1 ?% ?#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT4 {8 f& c3 _/ u, L0 ?
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT). x+ {; ^9 l7 y, ]% u9 I! Z
% d* N- Q8 @* F) } y( O$ H+ C r( s3 \5 N2 }1 B' b6 j5 U
//upp接收、发送buffer* U4 C: U6 N0 `2 ~$ J! h8 v
#pragma DATA_ALIGN(upp_buffer_a, 8)
! W4 g | S6 z/ I5 T* S4 R6 s#pragma DATA_ALIGN(upp_buffer_b, 8)! {, U8 u2 j6 C% B5 l0 F" T, M
$ q* T7 {+ ^) g. D
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
* P# C' @% H- x" i* Iunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];, L6 _- `1 [3 N- _2 k5 h0 o9 N
3 U2 T* ]; h: g" |8 r: m
8 G! S# i# Y8 O; L' Cstatic bool server_upp_data_recv(Server *server)
R# k8 `3 J1 u- x2 C. r$ s# m) I' N{
* Y- z/ z1 [: d& m+ E( I: ^" o. ~/ Z if(server->upp_channel_a_recv == false) {
8 y+ n& z5 w' A* D2 G9 y/ ^) z server_msg_send(server, APP_CMD_LOG, "upp recv: start");7 z/ J: o/ D [+ u- ?$ V
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
, S' _+ q. I, I8 A server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");1 M4 R2 q: \8 `1 k4 T" v
1 v( T0 @4 P. H M' l
1 _' H" o, D/ N8 o" L memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
8 V6 C0 l+ ?8 {2 @
^" ^/ R: @4 a/ y0 g' w0 | server->upp_channel_a_recv = true;//1 X7 h; N9 L H/ J6 b6 f C
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);1 J& z" v) J e0 D- |
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
$ {/ {7 h- D. I# e$ p server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;8 L9 X3 |" G) ~7 t* ^9 P/ W3 H
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//7 w, \1 B: ?# b( f& y' d" x# h
$ |* z6 X: V" ?: m upp_error_count = 0;
# S q8 U% q" ?: ~ upp_dmai_int_cut = 0;
- O) J2 b8 d$ `. u# x0 n* k$ l* F1 ~- ?
// fill in data
. M" P. {- j L. L* z1 U$ D uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);3 j& @/ {# w. Z" H/ u- E C; q
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
; H; L) E8 Y! b/ r$ t% E }: y8 @) H* ~0 ~
}
k& ]: ]4 n3 m: [' S, k0 z else{
5 \; Y! {% i- w7 _' `/ W if (upp_dmai_int_cut > 0){
/ e+ t6 L' g! s5 L) t DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
. X7 p7 b/ `! g Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);/ @. T9 @2 G% c5 x2 D; F
/ H* c) R/ D" u- [" l1 M
% {. e1 E- j4 i; `) K+ \. ^ M4 D //copy data to upp_recv_list_busy
4 C( n4 A8 [! z2 e memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);- Z3 J) @, Q7 ~" a9 d
! s+ m9 Y# M. }! x //
0 P1 H, }9 G0 }, p: T ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);( q; F; S4 ]7 e
; q% K q% ~6 z! _ //
! z7 W, P' V C2 F: {' D server->upp_channel_a_recv = false;//
' `0 a8 q2 z6 e. ^6 s
1 u, T+ u0 y, M) Q$ ~ server_msg_send(server, APP_CMD_LOG, "upp recv: success");# I; r( S* V0 {
}
4 C# [" w5 x3 `+ a& C$ @3 E8 I' w }
( q3 H% ]1 ?5 f q1 j# N
4 ~ c4 `: k' ~/ j3 q/ t
0 x& }2 I7 h6 \$ _, t* r return true;
& F' Y# R$ i) a9 {$ T% v$ y}
! j1 w0 I j: }- l0 D2 r6 ?: _* U# H, V, b- H. A
static bool server_upp_data_send(Server *server)
! H M' M; I# n5 q; i{
! K+ u% X" j M) k if(ListMP_empty(server->upp_send_list_busy) == FALSE){2 G( m4 y/ P$ _
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
7 X3 B: U% L' y0 B4 u" k/ L8 b" U unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);9 c: w, T6 u5 i0 D1 X" K% r, Q
char tmp[128] ={0};
2 d6 N& O& V1 p! A7 Z7 k' R+ U3 r: }; G, c
server_msg_send(server, APP_CMD_LOG, "upp send: start");
- k! W" M2 ?8 e1 ~' f1 u; x print_log(server, data, 64);/ X: b8 R3 |) A: [
* j' ~! e: i# ^* d+ v& O& j& B4 U
// p4 n0 e- L9 {8 ], p6 ^1 r" X) f
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
: u. o9 a4 i! d9 C+ f$ F: Y memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
0 H+ D. [3 W& x4 T- C3 p4 I1 B print_log(server, upp_buffer_b, 64);
' L! ] H) m; u) |3 ~
4 u0 L8 V+ w5 M+ ^# J server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);; H& {0 l0 A* ~1 I$ l; O
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
6 P: Y: W# q2 f$ T2 W server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;( Y& Y! g' x& o$ [6 D, u
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;" V' A1 }" I* W/ D! z) B! ]
; a% ^; V5 w+ S g6 l) { M/ }
memset(tmp, 0, sizeof(tmp));
* t E3 m$ N6 J sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
( l. M9 e& c/ i9 u7 X0 ] sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
9 `+ H. Z# g# J" D server_msg_send(server, APP_CMD_LOG, tmp);
$ i; f; N& {3 Z/ E4 x, X+ T5 k0 S6 s; \4 g/ ]/ m
upp_error_count = 0;3 G _5 c( Y: }
upp_dmaq_int_cut = 0;
4 `9 K; h8 K" F, r // fill in data 8 G; Q3 l) n1 R( S( t' i
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); , k# G6 u2 g3 }6 N
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
- X6 X3 a) y8 i+ U- l. F( L
# S9 M" }7 T& h% X) V // wait send success
* N' v6 I, q% w# H, l$ X% x while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
p \1 h6 `2 ~3 g
. m9 r$ {1 `: Z2 f6 p: ] // make data node in free list + b) H) u8 ]) v/ i- Q0 J$ q! u( K
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);- T) f" Z* H2 A
server_msg_send(server, APP_CMD_LOG, "upp send: success");' e: _, B! y$ Z5 y
}
3 A/ ~0 ^+ L+ S7 V A return true;
% |# q+ Y' h; r6 u7 r}
5 S* y' m( [5 x- k- k+ D) l; v+ I/ E3 p# y7 y. x
1 L7 l7 [& \3 k
+ X2 ^/ m/ T* ]$ h3 M
; Z4 ?$ a7 i' j2 i, s# \
( j3 P/ o! ]# K$ e8 P |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|