|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
8 r) B" `6 @. d! m
9 m+ |! ~( K3 a1 E8 c) D问题描述:
4 v" C6 K4 A- S" p P* J在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
0 ^' j- Q+ _, C6 @2 w# x" C) p/ [4 s, t$ N
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。2 P$ P9 O4 o( C
4 R o9 O# F0 c$ e6 o
测试结果如下:% P. a! ?) J; E" I( ~! g
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?7 E8 v, U" N) e
! \8 w0 Q4 o6 r7 |
5 @" i0 {7 c3 [备注:. S3 e2 k! X& r- L& d* K
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?" k. K& `# L1 S7 Z" h" J
2、相关代码如下:# l- |; S) V& }7 W1 f, c* U/ z
//UPP DMA缓冲大小512字节" R" r: G7 i0 b+ r+ T. O9 N
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍) p: k) ~9 u( H5 i% x6 T1 |
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT7 k3 j, f9 t2 t0 Z+ U. B
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)7 M0 P6 K6 g9 E1 n
2 l% L1 m- C# P0 I9 W
3 G, k. P* }+ B! o: \: {
//upp接收、发送buffer
4 @8 B) ]* v( }6 f#pragma DATA_ALIGN(upp_buffer_a, 8)0 A' N1 d8 y9 B; L5 T2 ?8 s( G
#pragma DATA_ALIGN(upp_buffer_b, 8)& o! i* N3 a' L. D8 ^2 D/ o$ C
; Z9 N2 i# e! X2 J6 o/ J
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
+ Y; m! j+ T8 p$ w! {) [- Cunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
& S( \% A b Q) u% W- A- I0 M* r$ X6 j- w: f' v
- ?8 `; x* m# z4 f1 d+ H
static bool server_upp_data_recv(Server *server)
3 t2 Y q1 x8 ~1 \1 _: f{: _+ t+ Q7 W' A8 i+ f# D: J
if(server->upp_channel_a_recv == false) {. g6 D- u u- ?
server_msg_send(server, APP_CMD_LOG, "upp recv: start");2 G6 r$ H( O9 M2 U
if(ListMP_empty(server->upp_recv_list_free) == FALSE) { b9 |/ H% A& M3 q* y( t& x
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");& G7 U2 k& A( C5 }+ O
' m8 u& \! C6 `2 y5 X2 D3 `
3 ?! B o/ |) K& [ memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
. r y/ r( G0 t6 B; c, l) a4 a' n' |( G6 e
server->upp_channel_a_recv = true;//
/ t& u) C. Q1 J) C9 | E6 p server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);& m/ f' H6 i z* H5 Z4 N& g% m
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
6 t& i3 v, a+ V" ]2 l% x( x server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;6 k0 o' x% F" U
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//# y; h. S! \8 v" K! [; t5 C
+ ~) |: e( Q2 c" s9 E, ?. P
upp_error_count = 0;
4 V; @. ~; m4 m, H! @* f6 C upp_dmai_int_cut = 0;2 D2 Z: v0 G' k. V$ F
7 ^* i- Q5 w. L5 l2 \1 V( e$ L6 j2 [
// fill in data
# j' d8 Q1 W/ E3 c8 a uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
2 E7 n" \1 @3 H K: L# J+ u: ^ server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");) J0 A2 e0 f* e
}# E# b" a2 K3 Z& I
}& b1 Y+ w0 U% ]: N
else{
% n2 q$ Z! Q+ k4 C3 o; g if (upp_dmai_int_cut > 0){( b# v/ j* A: h. M
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);* H2 t0 `6 d6 |8 f
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
3 _3 f$ e$ c: m. ?4 u% _
1 V6 t% O' ?3 A2 J- M9 q3 @
$ s4 k. n J( @: _2 ~. k //copy data to upp_recv_list_busy
' K8 ]& X* j/ h& |5 w memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);0 |3 |+ Y$ Z- f1 C2 Z6 d+ L. n/ e7 O
$ {; Q9 k, }0 W& \ //
- U& G, e5 ?- j0 Q+ T6 s: o ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
! ~/ s- T S P# V2 X
) q5 x. A6 l7 P$ I" R //; X0 I, C3 O- b% Q! O
server->upp_channel_a_recv = false;//
7 z& y, B2 N% @% `" }$ |9 Z* G7 I3 t) Z, p6 X. j: ]: _5 ~
server_msg_send(server, APP_CMD_LOG, "upp recv: success");! p c8 w6 f7 Z) M
}
& j4 l0 U# l7 h" X, y; {4 ` }
1 z( B& m6 G% I2 S/ |& D U. ]4 ~9 I( ]: }& g$ H, y
! V1 m" J |# f- q5 u
return true;
& O: P, q8 C- F" q9 S}
/ ?% k2 I, G+ D
5 {% R& ]: R9 cstatic bool server_upp_data_send(Server *server)) c2 o4 |/ ]+ h: p1 ^! ?7 W2 q
{
/ F! |) @* x: w- W+ g if(ListMP_empty(server->upp_send_list_busy) == FALSE){
9 w* e/ @: T$ @+ c DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);, f: r- y' P- G/ a7 a
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer); k: x' F; X( {6 S
char tmp[128] ={0};& p6 P, X, g6 K
9 u1 M, c7 l" f# r server_msg_send(server, APP_CMD_LOG, "upp send: start");
`- N$ c- k: ]; g5 ^2 ^5 S print_log(server, data, 64);
' J& ?3 o; q d6 F. T; a8 U/ K9 X3 a+ R8 X* z( {
// Q7 ?. F! Q1 Z
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);7 k8 t1 K: u8 Y, f+ r8 r4 Z. L
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
& c0 P6 G/ {# G print_log(server, upp_buffer_b, 64);
8 j+ J) ~- n# v9 ^$ C/ A$ M. v* E4 i/ {) _- s
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);( L. O# x' u6 ~" \
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
- s5 N* ^/ \( [. A4 o server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
1 c9 ], l- z/ K1 `( H; `" r/ ~ E7 e server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
( M! M7 I; y; p6 B$ ^) K: ^- R9 U. {" P& u5 f
memset(tmp, 0, sizeof(tmp));
! c, m2 v$ s9 w sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
0 o- x) R% S8 R; A) `2 L8 { sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
1 X4 {5 v" \) ? server_msg_send(server, APP_CMD_LOG, tmp);0 Z0 ^3 Y3 G3 g' Z
8 F4 ^" O9 y {
upp_error_count = 0;
% P" f; T6 X8 \6 g8 D0 W upp_dmaq_int_cut = 0;* K( G5 X. ]9 ?; ]; m
// fill in data
! I! g7 K3 I, |5 Z uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
# F a" |; F& ?' O0 r/ t7 w1 A server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");" C. Y8 m. B3 U6 K! v4 }& Y8 u, \
# v7 B" j: H' B+ m6 y // wait send success
! u& E1 f I* J5 @9 o, |4 \, l while (upp_dmaq_int_cut < 1 && upp_error_count == 0); % t& r! P% H# j+ S
0 t; A" j( _4 Y9 @6 p' ?, w // make data node in free list
( @6 R2 ~4 p. T5 Q: }) _+ x% o2 ] ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
5 n% H8 r% R g; S, m8 X server_msg_send(server, APP_CMD_LOG, "upp send: success");. i5 z! D$ N, F* i
}
* ]" T! D0 P4 W3 p6 F return true;' h' {2 @: r4 M* L: M
}2 D. ]' B! H* X W; \# p
% p( j) M v* z9 v" c+ U$ _9 t6 [5 |0 D0 S
, l3 ~1 e1 n2 \# ?# b/ n8 \* y4 U
7 r! H5 J0 F( k7 A9 @( j9 S6 }* @) ]
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|