|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 * P$ B1 G9 p8 u# h" F
7 q s. O/ r$ F& o- x' G9 L- x/ F
问题描述:
2 c* f J3 e1 _在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:! R7 H; g" A& y, \& q
, |% |5 f* v0 |2 ` i; O* I图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。) w$ v4 |( p' i$ |
5 C' C5 A6 l) |9 [
测试结果如下:
9 h0 @( J. y6 a4 B4 z138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
( S! `, ^" q" M1 Y. [8 U6 y
! J1 j1 `5 T' f- e0 F( o5 x8 p8 g
" N; B! W! K. W6 s7 Y: k5 Z备注:
7 L8 Z) G% f3 ?* y! q, T2 r1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?8 W) z1 Q3 v( k
2、相关代码如下:
# J, @, r) N2 C9 P& A4 |' C$ @7 Q. ^//UPP DMA缓冲大小512字节1 A% T% |' h& k' P0 {& C. n x9 t
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍! B7 h+ q9 q- ]; F6 T* K( n) W
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
& d9 W* `8 M' p. |0 e6 h#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)7 E& @; Y2 l( u& ?2 w5 H
* O b6 q0 b& A) Q+ B
4 P* ]: x( M+ r//upp接收、发送buffer: C! v# @" W7 K! b. p( Y
#pragma DATA_ALIGN(upp_buffer_a, 8)
3 D3 e; v/ X F7 k#pragma DATA_ALIGN(upp_buffer_b, 8)
6 Y& r, m- g4 }& z) y/ n7 w5 h5 V& ?2 J& d( F
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
: L' X6 i9 G% y' W8 A$ Z# k. hunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
" b/ v) A; z1 m# a$ C4 H3 ~$ a( j5 O/ w: X/ b& W3 B, G" N
3 ^, s G. R" F! i1 g! {/ y Ustatic bool server_upp_data_recv(Server *server) ! b" P! l, E7 E2 P P
{
- ]% Z, Z7 e! P if(server->upp_channel_a_recv == false) {# q+ U6 S; J* U) W, \7 p% |9 a6 @
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
: F8 w, v7 f" Z/ d$ X8 v if(ListMP_empty(server->upp_recv_list_free) == FALSE) {9 S/ J9 o8 x- K; b7 A1 V: i
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");- V ]1 y) e3 r3 `5 S; J' I
5 B6 S- r# {; s# b4 E& G% {
2 D" p6 W, X7 M" d+ u memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
* m/ l- B; ~4 l' j
: N' T" O" i7 B4 E. z, }5 H0 j server->upp_channel_a_recv = true;//1 C h+ l0 X, H" N
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);; c' u6 w6 {* M0 d! v% i6 a
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;. L+ t' w5 M; s) n$ T4 m
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
) s7 v+ ?% B/ ?3 w& p c/ X5 h server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
7 F2 i$ c" b" e& t3 n1 T7 j$ c- ?$ C8 z& |& L% E
upp_error_count = 0;. g0 Q6 ^. A7 W4 E
upp_dmai_int_cut = 0;4 \/ ~1 H! w7 F( p
# d; U0 m& N4 N& W& k
// fill in data . u$ u2 a( o2 @7 Z) `0 a
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);' c8 c4 f3 |7 j; g. ~0 p% B' V
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");) X2 G, ?) e( M" c& Q- v
}3 K, i" {) l3 T# k* {+ T- F5 W6 V* a
}
; a7 S& H8 O. w; u1 E- g% s else{& s' `9 ?5 T0 _5 F! h! u+ {
if (upp_dmai_int_cut > 0){' R# P/ F* x( X) D3 @
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);5 y: w/ P- k q: E7 _- X/ D- z
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);- D: [% q% e& Z8 G% d
. _5 E6 A6 o! K7 i
/ u u! U1 V* T( y; L3 w3 i //copy data to upp_recv_list_busy
* Q' ^0 |; U( Q memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);- Y7 J& c: L0 ?1 A0 Q+ F
8 I1 ^' X1 f; ~: ?& D, V
//
# {. L. e. q$ _3 U, y ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);0 s9 J; H. r& G0 M' L
1 A8 f1 x4 g+ Z+ x
//
! {4 x& F ?! |( D* J2 B server->upp_channel_a_recv = false;//
8 ]5 {6 N# ]6 s, c* B5 X
; V' o- p) u/ N( T9 m" f J" z2 s: v server_msg_send(server, APP_CMD_LOG, "upp recv: success");
3 J* K& K7 u L- b, \- } }
! p) H9 Q- J7 J( I" a }
, v* A! L4 P, w3 F5 Z1 l. i& M" e
0 P' y9 E" q8 m
* D( s5 M1 t/ D0 c return true;0 w6 g2 I6 ~+ R' l& ?4 B+ V/ W
}
, s& `5 L5 N7 e/ p ^& `+ j3 @$ J+ F& K- v7 y
static bool server_upp_data_send(Server *server)' b' j7 H/ G% O
{
7 Y: a) n- h7 X m if(ListMP_empty(server->upp_send_list_busy) == FALSE){$ G- H! k# Z5 y" o6 P7 u/ S. |9 l
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
6 e3 L& N% Y, I1 F unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
2 E5 a6 f4 V: C E' q" w- I char tmp[128] ={0};
# O( I9 M9 |5 a4 T+ @$ m" }$ E
& [. V. A p6 Y& A) K4 x server_msg_send(server, APP_CMD_LOG, "upp send: start"); r9 {& ]& O( k4 U+ ^5 o( A
print_log(server, data, 64);
9 {9 e Y, k! U7 j0 b
- W* c8 h8 D; X2 P. v+ r //
, A$ O& P! L/ n memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);! g1 V$ L9 V; H- r
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);* S* D8 a# x8 E% I% z
print_log(server, upp_buffer_b, 64);
* i- j) R! s/ Q/ X
% [. S( V4 Y9 D# I server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
* T0 _, x) U* I+ x7 G7 v server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
9 J( H' W7 r& { g: s' Z) `* R server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;5 J0 k5 [0 v: ~
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;: h# K1 u9 D( x# X0 E% j2 }; u& [
* |2 j5 b" A6 e
memset(tmp, 0, sizeof(tmp));
8 _; k" \, {" C% M; N6 q) }8 K sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
: g1 ~+ T, o7 x& _) b. ?2 j; d9 } sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
4 Z, w3 O1 y' l3 [% Y% A server_msg_send(server, APP_CMD_LOG, tmp);
+ P; j* i% b2 ~3 [* O
! s# o. D6 C) e- c Y: [9 G" p: E0 | upp_error_count = 0;
$ L5 ]0 N- z( I+ O [ upp_dmaq_int_cut = 0;
. n" G. l% {! g& e2 F8 V6 ?! X4 b: h // fill in data
7 D# L' y/ [- x4 |0 \$ { uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
2 x9 }- G _9 z `5 K5 { server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");8 \* a3 Q3 Z- a6 z7 X0 n8 Q
2 X' P+ _- c8 k7 q: L1 f1 ^ // wait send success
2 `( r! P/ E' A8 ~ z while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ( V, A3 T4 ]2 a2 E2 O3 |
# g9 a4 J K9 T9 L
// make data node in free list
b8 E4 r- @- G! E9 a6 ^* q$ l ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);: T9 a$ B) ^3 M7 z4 K& ^: M& R
server_msg_send(server, APP_CMD_LOG, "upp send: success");
& X: e, t6 D) z- C* d }
" {* \5 t$ H7 N return true;* V8 ]3 [( I5 y6 a' w" {
} C7 Q! y7 T% A! `- C! i9 f' R% z
- }. O) n' F% K `$ l
! _9 j6 Z3 M' d: ^. K) y
; m& f7 {0 d3 T; `- P7 b( ?7 ^' G0 q8 X2 R
% H& H; M& n+ K. }8 t+ \ |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|