|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 * M5 }) z C2 P ^* p) d6 Y t
) ~4 w0 X3 S7 y5 m( k' g9 K问题描述:
9 a& [: G" X+ O在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:5 f" _- ~, Y5 N- h
: l* n8 ^$ o5 g% I图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。' m7 ~6 A2 Y g0 \% v8 [9 ^% {" e
& ]5 z6 t* {0 W" ^4 K测试结果如下:
* X+ i; Z% P4 [138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?6 o6 q; f8 W3 c
6 B+ P/ D* }* z8 w g# {3 u( z) E
- A/ R3 T- a4 c, v
备注:
/ L; e; J8 W% D% N' M2 y5 e1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?' n, M/ G( c8 |+ b s
2、相关代码如下:
3 M% o# ~7 O+ C8 v) y//UPP DMA缓冲大小512字节
6 P: ~; ^8 w' K0 W6 N1 i#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
+ A: E5 Z# H3 Q#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
) O8 K) ~6 o/ }& L#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT); t: i9 W+ y3 m; i5 {0 d
( n& B. o3 o6 n% ~
: g; q$ b* M( G: M0 Z
//upp接收、发送buffer* Q( b. `0 y' n& [' X
#pragma DATA_ALIGN(upp_buffer_a, 8)
& x& `0 z* d& a8 p% D- I( _% w#pragma DATA_ALIGN(upp_buffer_b, 8)6 a9 m3 a0 Y* B& h( j
5 Z8 e# d$ _: L9 z7 _; A
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
$ U9 Y1 h* P; ^( {+ z. U R, Runsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];( c, G% N% f* s! [
0 V. R$ H$ x9 e* T$ Z; m4 s9 I
/ v& _& `" H$ g0 x# m a: W1 Hstatic bool server_upp_data_recv(Server *server)
: y/ {3 E) Z9 K{* h) n3 M6 V- F+ a; y
if(server->upp_channel_a_recv == false) {
6 p$ s; H7 H+ l8 _6 m! F server_msg_send(server, APP_CMD_LOG, "upp recv: start");9 E, [* L- P) I
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {5 p) O: [. j3 ~0 Q' m6 x4 X
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");* O5 @; a! K n3 f+ D$ U% |
9 C7 V8 E( q; m- ?' L/ C: W, W1 p/ E- \1 v6 V. {
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
+ }; o- ~8 X+ d: Q) Z; q2 Z
- {4 f% g7 s! N2 a! { server->upp_channel_a_recv = true;//: I4 z! k3 m. g- a. F, M* v* Z8 X Y
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);' U7 r8 e4 }3 j) W
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;- ?$ j) X% H w, M4 m5 y7 ?, S! A
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
: [+ [7 Q" k( }7 s/ t8 I- q4 Y server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//9 T5 A$ A: _$ ?$ a7 P
! O! _. f# ?- z upp_error_count = 0;0 C7 v; p9 O, M4 B- N3 J2 Z
upp_dmai_int_cut = 0;& P' W, G" t. \9 K; B# Y
, u9 [+ d3 u0 ^: J // fill in data
* B/ M. o1 {7 r/ W& v( v% K uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);0 H7 W* }, \; I8 V1 t9 m. s) e
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
- Z* b, S8 S7 X- q: j5 E }
- M* v+ q0 b& S }
" @) ]; h7 C- h+ b" d else{1 n9 Z# y0 N/ @5 O0 a$ R& o
if (upp_dmai_int_cut > 0){
& A. {* P( J1 ?& f* O DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);; G) ?' _! w7 `" t9 V
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
& O" B9 \+ x" ~$ h7 r
2 M, i& Z8 \+ x2 H9 t q; Q/ T6 f4 b& C+ d
! v- K5 u0 n3 p9 Q //copy data to upp_recv_list_busy1 y# |" c: m/ H& F( c
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);, t! O, L+ d7 w3 y4 V M
; `# O1 U# I$ L0 T' t5 D2 ] //. s C G& U' K1 P8 W e
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node); J6 u) v0 D5 v2 A! ^" M- ^/ f
9 a x5 E- L9 c
//& K* E7 j) N% V; W4 U8 e" C+ J
server->upp_channel_a_recv = false;//
3 x) Z1 n7 s/ V
/ a1 l: P* G+ v server_msg_send(server, APP_CMD_LOG, "upp recv: success");
9 p/ i# O+ g4 W; b }+ @3 q5 a) s2 `& H9 j5 f
}
3 g! B/ Z+ Q3 |- g, G# K1 r3 f: l" _' h& G# v
3 M3 e1 G) ~: R l return true;
+ ^' {* E) B6 L# O}. l0 E; Y" G2 \( U: k% \5 q. A
- e6 E& V! Z6 p1 I3 w: ~
static bool server_upp_data_send(Server *server)* x R& {: ?+ @ h
{* W6 M2 _9 J/ I3 U: s/ @5 v
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
' }; g' w, ^9 A6 [7 y: P/ Q DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
3 X+ l+ l& I. R$ T! p6 T unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);6 ], ?6 L5 @9 D1 ]
char tmp[128] ={0};
. E I* [2 |& c/ X
k- x! _9 J: A. C2 y server_msg_send(server, APP_CMD_LOG, "upp send: start");
' `9 E) i! J( O print_log(server, data, 64);; a; T: g$ p8 J7 O2 z0 b+ g
" o- C0 \# g" \" p+ U0 K //2 _4 H) f% d8 C% ~/ W2 U7 t
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
5 {: D# y/ `0 D9 d" z) ~0 Q5 { memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
7 |) l5 ]9 g1 l& g% H, J print_log(server, upp_buffer_b, 64);$ a0 r* T6 x; O; Z
$ O0 l3 x% E4 ]; P) Y6 V server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
' s; F& C6 `& o" L" z3 C4 K3 j; u server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
" J6 D* F7 v5 E' |5 p/ F6 A& [ server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
/ u! G' v1 {5 r$ v% \2 K1 ~ server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;7 {& w) y) l8 [9 T( p7 o$ Z
2 Y6 H5 [6 K- |# i, W9 Z8 Q8 o
memset(tmp, 0, sizeof(tmp));
- n/ N: X& ^. U& ~3 T% ~ sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
: ]8 ]; i1 O5 V. k1 M7 Y7 p sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
4 N w e. x6 t- r& }/ q" e: G server_msg_send(server, APP_CMD_LOG, tmp);
/ ?! B8 p$ p2 F. X% X4 B8 x, w" \8 H$ G
upp_error_count = 0;
9 T t/ r1 }5 J1 H6 _. Z3 j upp_dmaq_int_cut = 0;: u7 H1 R! M" A5 [) T
// fill in data
- U7 ^6 h0 K) `1 [& y1 }- K uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
+ e6 {; M; A& u& ], ^' X( z server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");/ a" H& g3 F1 D8 q) o+ x
: R8 L/ h8 P0 {/ {& P3 i- q) l6 x // wait send success+ _/ k& ~. ~: \1 M0 l2 p9 O) W
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ! E1 _ k1 @% N4 g
+ E: \1 h3 |6 g- E0 F/ G4 x // make data node in free list
) l6 `/ L7 V+ i6 s. ? ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
+ l. h' v4 v& z. d server_msg_send(server, APP_CMD_LOG, "upp send: success");
: S1 ]4 A9 y, @( S; C }
1 j& [0 N- @1 w' P" J' d# L return true;
: i+ E. N/ n# W9 @% V: @- i3 H}8 q& {( P2 c; d' d' a9 ^
3 D) C$ s/ G. O7 Z- s
2 y. t* f; g! f% o
! I1 a8 B6 V8 [9 Q' f- b/ @
; K& H: [( p U5 P
6 ~+ x" R; Y8 e, C0 f$ j
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|