|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 5 M) x. y9 O Y3 H- X' n
# n6 O7 T& d: h问题描述:' l. E3 k+ q: r# W5 P. v# a( n
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:: D: y \; M0 x1 B P
1 e: G8 s- {* S# {& ]# d9 Q: Y
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。, I- m/ j# o% D* G+ k3 l5 ]$ ^
8 w+ }$ D$ t7 l# ?
测试结果如下:6 d5 g& O. W; q* r9 T
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?4 O5 n' z( x `/ C& O; b8 L
" j! ~* g4 Q# {0 ^3 _8 g+ f$ W c# S- n% o$ g' K J) i
备注:
# p' G6 }0 [9 `' Q1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
$ d0 c# I t! f0 q& N: M/ q2、相关代码如下:$ Z; f8 U8 h/ E7 R" G) N2 i# T2 ^
//UPP DMA缓冲大小512字节
* S5 m) W/ h0 r" I#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
$ K. c6 n9 v8 N* i! i#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT/ f C. P2 U' T/ ^" M
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)) p" k' y; N; V
& @& D$ m4 H- ? f7 {( J' s- f$ r9 c7 `9 s7 x
//upp接收、发送buffer
& \7 L; U1 U: q% z( S2 f" u#pragma DATA_ALIGN(upp_buffer_a, 8)) j( v& k8 b, Q: H% H; Y4 W! Y
#pragma DATA_ALIGN(upp_buffer_b, 8)8 ?+ F0 }/ `, A: X8 y
/ x9 e+ T6 [+ Iunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
# V+ y0 b$ S S" `$ r3 yunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
|3 I0 U- S- K5 s3 {' I" ]5 D: p" E4 W! ?8 T7 y
2 X4 K# z( n/ Q# O/ g
static bool server_upp_data_recv(Server *server)
2 w, ^# h# o4 t& C{- e* W; Q y$ a8 I% w# Q3 ~
if(server->upp_channel_a_recv == false) {
" s( a/ _, s# V- O+ |2 a4 N server_msg_send(server, APP_CMD_LOG, "upp recv: start");
; C1 E4 N5 ?0 z if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
# [2 Q1 f+ E$ f) U/ u7 { server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
9 e4 [, X6 g: N, ^* k
A: K9 `1 V5 { K2 `6 G( o$ Q$ s- y* u6 w4 n
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);1 ]& l" I+ b7 d; g9 k# T7 A* T
' d2 g5 l+ L7 K5 M/ q& R( D. D
server->upp_channel_a_recv = true;//
9 F6 G7 P6 {! ^( z" {4 Z6 E7 f/ ?5 { server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a); V/ A/ ^0 W9 Z* k2 T" @
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT; E! s. [$ A1 H" d# O& n4 q
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
& u3 i' A7 R) Q' N! ^! C9 o% a4 O server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
) ~! v, y: p9 U/ G& S, Q3 e. s! m, _' r- v! f) j
upp_error_count = 0;8 |% Y( Y& Q6 h: a! ^$ c5 M% I
upp_dmai_int_cut = 0;, n" i+ O1 F( F9 ~' q& y
+ X( W P# ] o6 o% z // fill in data ( e" B- Q$ y# G
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);+ u5 w( D$ A, A+ M, r2 m
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");. f! H) p+ x2 b! u, {
}
( V2 L7 n4 P$ j* k }( D$ `. S; m, t* ~! J) k) O
else{$ Y% ^) u# ^# R& ]% R
if (upp_dmai_int_cut > 0){
\ W$ o% ^1 d K DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
: c1 l- H% Q1 T) z* M Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);* P9 f6 F0 ^, Z, r G, d0 S7 @
: V7 V4 B- f6 j2 t V4 @1 P" k9 }5 N8 K
//copy data to upp_recv_list_busy
8 ?& _4 t( C4 m1 P memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);0 W% A( h; O" x5 f
* G. J( [0 a- E5 g; s1 _/ j! T4 f1 a //
7 ?- T% T- y; c1 E2 n3 c ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);5 [5 k6 ^: F. F& I6 _6 J7 M/ w
+ W' I7 b8 B, H
//
2 Z9 H& h) F/ k5 b server->upp_channel_a_recv = false;//
' f8 C1 I$ B! x7 ?( p9 [& ~0 p. ?" l: ~8 [
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
- c" c# A. o$ g3 x h }
: }, y. X2 y8 s/ X }
' _- f$ C, O, ^" j
7 e. W- }! d. h! R9 a
1 m. H8 s8 {. ?+ x) t4 v# q return true;& p5 i }: z* P; O! E3 g/ b0 i
}; ?) H3 L \% A
, \# F% c* Z/ W4 }3 ^9 U
static bool server_upp_data_send(Server *server)/ h- G+ G9 Z5 W
{5 f, K, F' L; y) @4 \% V1 V% B
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
# ]& F, O1 L1 n1 \% Q' u" C# J DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
}; H+ h" [* m+ B9 ?+ a unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
6 E' `5 o m2 c2 J0 c" _1 l char tmp[128] ={0};
& H9 f9 d4 v" i
8 }/ Y/ |2 N& j0 F" d2 I5 D server_msg_send(server, APP_CMD_LOG, "upp send: start");& u4 Z6 ?% u* H9 L; v
print_log(server, data, 64);
0 U1 J: m$ I4 e( ?# \& W7 o) v+ ~4 `' s
6 O/ h- @" D+ L0 p //
$ |( J( `( q9 v/ A memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);$ M7 |2 `9 M; D+ P1 a, ]
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE); [5 p) o+ K1 c6 v
print_log(server, upp_buffer_b, 64);2 U/ q& P7 s3 X& }
1 u7 u: H$ W& g) p server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);" E1 X6 m x' E5 S) h* M% m& M
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 3 H" a! x2 R) a \) G) U
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;7 V3 ? n: T* ]9 S' R8 b
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;' J0 ]3 O% |9 Q: e/ A2 E
" o* h9 H) W$ C, d- W
memset(tmp, 0, sizeof(tmp));6 x/ t4 E j& {4 ]; b9 T
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", / ?7 a0 E/ [+ o
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
3 _" {# y5 ^% i1 M ? server_msg_send(server, APP_CMD_LOG, tmp);
* k* b- a- y! E! X; ^& t" p" P6 l& }" {1 c
upp_error_count = 0;; ?& I( e3 D) A9 M7 @9 K
upp_dmaq_int_cut = 0;! n2 e5 y5 k! ?0 h% I
// fill in data
, M; `4 q8 o4 B: ^' k% s9 m, X uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
/ ^4 L' l, h N+ F4 n server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");: I6 E$ X {: B" O
" S! O# e; h( ?6 K8 W& P* Y
// wait send success
. v1 {1 J, d- m8 P! C5 F v5 d while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
' E$ m# p0 s [: c& ~" ~6 F \3 } X
// make data node in free list ' p3 j/ w7 _7 }% b2 s
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);& Z4 a( \* {, M; l4 a$ e6 Q
server_msg_send(server, APP_CMD_LOG, "upp send: success");- S. I9 B# ?; z6 X6 S8 X1 h
}- C4 T1 ^; P4 Q$ G
return true;* R. e! T8 c/ ~& _6 x
}
- h- G( w" `5 v$ @6 ]9 D, ?) M# F1 W' n- Q& g
3 O Y! C" \% N% l' g
% d% h3 c1 H0 V- T v& p
5 r3 s# S- B3 i5 n/ ?1 n, {9 ]
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|