|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 : u k+ b, `4 s9 q" S) h
6 I& L$ I6 Q. k! f/ _- s, Q问题描述:4 W( r: e+ o5 q' C/ N
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:$ o- m6 A) o0 u9 k p; y5 g* e* v
4 @2 }" Y9 {( [& O3 N
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
% L# |8 r W/ L3 k! T5 l9 G+ V. Q8 C
9 u! B' h9 Y9 ~8 G* u测试结果如下:
6 t9 A, o# f7 V& { i; U7 ]% k138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
0 n2 i+ L. x5 ]9 K" g9 E" g- S
b s8 n( }; U/ R# R+ D
& k6 K f4 C4 Q6 B# z1 V2 |; [( t' ]备注:5 s* O1 Q( Z0 |8 j7 S
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
, }4 {1 L/ E5 {8 ^0 M- h/ d2、相关代码如下:! ?- R/ Q3 w# ?" C1 f& y6 H
//UPP DMA缓冲大小512字节
8 v+ A* X+ v: r#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍' k+ ~2 _6 P7 `0 f; v. L6 u( l# p
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT# V8 _# u+ m! v. A3 B
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)3 ^" k) U/ Q. S) S( A6 l' C
5 N9 f/ \, G6 a0 J5 D
, Y0 N. K' R5 `* k1 [
//upp接收、发送buffer
/ X7 f/ h! \4 `- k#pragma DATA_ALIGN(upp_buffer_a, 8)
5 u A# F" i* A2 D/ i#pragma DATA_ALIGN(upp_buffer_b, 8)- r. T9 H8 Q [
T( P2 F$ ^! E; Q' ?unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
" {. ?, W# p* sunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];- U! s7 E1 \6 c
* ~7 s4 ?' G6 [0 o) N
& G: @. I O6 Q6 I
static bool server_upp_data_recv(Server *server)
2 v; e z, x3 H{" d5 f( O$ C" ~' [# a
if(server->upp_channel_a_recv == false) {
) j( ]' P% [8 P5 Q% f: ` server_msg_send(server, APP_CMD_LOG, "upp recv: start");
7 Y5 o" [+ z; H1 G; A if(ListMP_empty(server->upp_recv_list_free) == FALSE) {; y! W7 \: I8 S
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");# f6 l5 G5 ~- ^3 _: l0 K8 H8 E
2 X6 Y7 J7 a5 a1 d: p) `* c" y; a" Q7 s$ U1 T) i4 @4 q& @
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
) t4 }; r2 Y& D7 q7 ^& E2 U$ `, U* e* f: b' t, K! V! p; \
server->upp_channel_a_recv = true;//( y/ A* S$ f" f1 w$ E
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);7 t* B" _5 a5 H$ P% G2 x I- `
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
0 H- w& a7 A3 @4 Z3 ] server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
: S" E) Z6 e( a( S7 d; e$ h" [ server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
# t0 q* }* _3 K5 h3 d% Q
4 @# K" U8 s/ Y, V1 ~ upp_error_count = 0;8 P7 R+ Y+ t4 K& _& c
upp_dmai_int_cut = 0;
, T, M% W# O! c0 H% y% s
6 }- [2 S% S" c2 [0 I8 M: o" w // fill in data
; }3 F3 e& l- x uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);. T7 {: }: M( j1 N' }1 ]6 Q3 H
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");( _2 ~' T! s& A/ e8 t
}
# {" J1 z3 ~. B! F }
. E9 C* Q: I7 j, k$ Q( @ else{
. f4 K4 F' y/ F3 ~7 i" J1 p if (upp_dmai_int_cut > 0){
0 c5 N& X5 b- k8 s3 \1 q DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
! l. Z3 \5 [- i& M/ F, [5 n Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
4 K* |' v: g; Y, N. d
5 n% J- U# n2 w" w y
4 ]; m/ I3 M$ v% a //copy data to upp_recv_list_busy
# \( `, O6 r- ~" W memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);$ T# p O* O( Z; w' B$ G, ]9 P
' D, s c! s/ o7 ]
//9 V' S) E, b# c8 J A3 x' W& q
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
6 E; D: @4 W1 x1 u5 _% A% B- K& p' N- J2 P& c* H
//+ Z. l# r: H, f$ J1 ?6 L
server->upp_channel_a_recv = false;//
' ~0 C! u% R: n0 l) B
; ]& U4 Z8 a; e9 K# o server_msg_send(server, APP_CMD_LOG, "upp recv: success");6 I5 W M' w y, f, |4 b" r
}& C6 Y n3 `5 v/ [
}! [2 [2 e4 } M" Y4 g; w
! l5 W/ C% C& E" n7 T/ c, K3 J% b- Q" D
return true;
6 ` z. D3 b* x5 @! p} i, o: i+ t6 q8 N8 W9 S
3 G1 P6 l2 ]* [, Nstatic bool server_upp_data_send(Server *server)
; @1 u8 u$ \+ ?/ m/ o{
& K2 D$ e5 E3 |0 Y2 W if(ListMP_empty(server->upp_send_list_busy) == FALSE){+ d% b- i* H3 `4 ?
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);5 o$ `2 p% g+ g8 x# p
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);3 H; N# ]7 V# j& R. S7 D
char tmp[128] ={0};6 b6 C Y& K# J- j$ `$ c
4 W/ p; [. S b+ T8 q server_msg_send(server, APP_CMD_LOG, "upp send: start");
3 P5 }6 N p+ \9 I# I' O8 _& Y& Y print_log(server, data, 64);: W& L( g% o7 m- X" O
! ?: }: L0 D: v7 Y9 J
//
/ j* Q* Z6 n+ l, S3 y9 L6 f: s* i0 ?0 _ memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
) u. W* p# ~2 A4 C memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);% l' ^) x& k6 v# K8 _$ h; k; l
print_log(server, upp_buffer_b, 64);8 f8 ]" `) ?6 K% F# U- r
4 F) X0 [% q6 w$ r3 j1 [( b
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
6 I: z4 k8 [% v3 B2 O8 X server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; $ c5 `! z0 e0 f {; T
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
9 }' S# B8 |1 U2 }7 a- \- V server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
7 S1 y' X9 o0 M9 d5 m7 O
. S: F' G/ P/ O0 r2 x memset(tmp, 0, sizeof(tmp));
1 P+ ~* V" Z& b) H7 C0 s sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
5 O- A2 u7 M" Y" X# i3 o$ t1 L! P sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);/ H* c0 `: o1 e3 ^: f# N
server_msg_send(server, APP_CMD_LOG, tmp);; c1 H3 T3 F6 N% l J: D. m
2 w j7 ~& f. W" Z Z4 }3 k$ I( O
upp_error_count = 0;
* W8 i! O; W0 ^9 A) M% f# c upp_dmaq_int_cut = 0;
$ D, e+ r) G$ f4 F E- ` // fill in data
2 E& W; k/ I% w' c uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
, v! R) O7 J$ o server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
! D1 [* x7 `2 U) R1 t# a9 Y* M" U
// wait send success: E, S' O; I; n P" b/ C9 c: _ J
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); * G/ _5 C& R' z8 Q, f
% E, g/ D& D) L; |% E // make data node in free list ) c" V7 X, ]* o3 a, F
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
* w1 ^8 U G5 H8 z7 e: I server_msg_send(server, APP_CMD_LOG, "upp send: success");
% c$ p4 s s+ d% U }
- L# U9 n. T, b2 V& F return true;
8 S. i1 h, A$ @: Y! t6 y8 f' ]" y# u3 T}
( q- d$ T# `9 V0 `/ f5 e, H" r9 G5 Q. D9 O r3 C
0 L* A: V/ H# D
) L4 i1 M8 O0 `! J! U; F& U1 {, j" M1 G6 o
: |) w: y3 \6 m) p3 g2 x. x' G |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|