|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 . k: \+ m' u2 C# e1 W% k- @+ q) E
) S+ @: |. w9 ?; ?- Q
问题描述:3 r( F! c3 d$ X; w5 Y O
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
/ R# c9 q* _8 F( |2 J
0 b& ~( Y3 }6 O! I图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。, }& l" W( M7 |* o9 F- J
. T0 k% l$ P! N% _' A: Z% K0 Y% c
测试结果如下: X5 O1 ]# H, [" M& z
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?3 ?7 ^" u- K8 o3 A: |
; U9 Q% \; W/ I, j; a3 W) j5 j1 E* Q
8 ~6 E" x* L# d6 ?备注:4 x% x! k, _# s3 p2 f$ Y* r
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
x, v8 @6 _, B2、相关代码如下:
+ Z' s- n6 e: j' a3 W$ A//UPP DMA缓冲大小512字节
0 V) K, `' i" N0 @# W#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍: s& y0 P8 S# P5 P
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT/ f- e5 h) s% J. x5 X
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
7 P) y" O3 o; [+ U0 {' _2 N5 [8 z( V& {% p$ t' \1 l s
& G c0 S+ W, q//upp接收、发送buffer
9 p2 n# h; L, c( H8 C#pragma DATA_ALIGN(upp_buffer_a, 8)1 F. C$ i2 p( W; p$ A1 z
#pragma DATA_ALIGN(upp_buffer_b, 8)) z9 C1 c1 [/ S4 ?2 Q+ n* }
8 v9 t, ^7 R ~, {7 v+ {
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
/ @. K( ?! {2 d- C/ f/ N4 @unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
) E7 Y+ S: E. I' j( Q7 ^% ]
& l7 O/ R, Y5 _. O+ ^$ A+ G& |5 g6 X
static bool server_upp_data_recv(Server *server)
3 F5 K% n5 N. ~( _* {) n. H" b{$ W' [2 e% ?; Y H+ [3 H! m$ B
if(server->upp_channel_a_recv == false) {' j5 Y. b( k* g$ D C2 B- Z
server_msg_send(server, APP_CMD_LOG, "upp recv: start");& |) M D ]( Q3 e
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {' ?" Y5 k* E2 l7 M, a# _
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");2 N1 S# t7 p9 i+ v# X
- Y; B+ R# r2 G# ]2 o
* W# C0 n1 l" U2 M$ Y& U memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
" p7 g' r8 m" Y- B: q1 W
* l! ^0 S0 W* D% s server->upp_channel_a_recv = true;//
0 M4 t1 o$ l1 z/ c+ |0 [ server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);. ^8 A9 H; J4 W& j& {9 D. a$ R
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
0 A6 q. k5 p- i( ~+ v6 h server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
/ y8 S( p! Y0 X) t server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
7 J$ J, F2 J' @6 k5 l9 c( W( J
' V1 Q6 v) x: {' V/ s upp_error_count = 0;7 S" N$ R4 G: o
upp_dmai_int_cut = 0;
5 W& C' q7 ]# ^6 T4 n2 s3 ~
( ?8 c6 b; Q; a' B7 O // fill in data
% }, E" F4 d( X! Y: y! g uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);+ x" D. ^& L9 o' @7 |
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
! {- t2 U8 N8 N8 E: l* e; n- U }
1 e7 ?8 T8 s1 w. j, E/ K }( c1 ]0 q/ ~4 t T* e3 `
else{9 a% B4 q! W: u, \, \
if (upp_dmai_int_cut > 0){- | d( j2 O1 \1 c+ _" Y& @
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
' Z7 a! \6 ~3 P4 K Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
5 L! p3 p- a, r; r" r
& ~$ j. j1 m. S) {! f/ F C$ Z- k/ \$ l( _; u
//copy data to upp_recv_list_busy: D: ?0 i& P8 y7 M" a
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);$ W% [7 ]/ N) f! x& g" e3 A
+ F( T% [+ v" R& P# y- F7 r
//
. U, N( W) B$ e+ }, \ ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
3 i; j3 P6 z7 V: X
& ^8 _- ]2 ~! M& q6 ` //# e1 r" h5 s! k" J: P2 D$ `8 N6 |
server->upp_channel_a_recv = false;//
) l6 i1 Y6 w& X
/ G, @) O; _/ Z" r ^0 Z5 ?) z" z. n# H server_msg_send(server, APP_CMD_LOG, "upp recv: success");) S6 T" A% ?# Q3 K2 E5 ^
}+ }3 v" a5 x3 F1 f/ c: t
}
- h; y6 o' Y5 ~: Y' y& h# ~6 ]8 |/ `9 W
8 s4 b7 l4 G% j* T+ {2 t x$ C return true;; b9 S: N+ _3 z& s! p# l {
}
8 u/ U+ J8 n( \
1 c: [3 o4 L! q9 g. {static bool server_upp_data_send(Server *server)
; C3 c9 l' z8 [1 G% Z( B2 ]7 r. I{
) d2 w$ ^$ R! D7 {( y3 c- d8 e- K if(ListMP_empty(server->upp_send_list_busy) == FALSE){% E1 o y8 r- A5 _
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);% m& U' M2 Z5 u& I. P }
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
. l) U: V7 F$ p" Y char tmp[128] ={0};
6 y: Y `) V9 k T8 }) e" T
1 g4 c* p8 T/ w8 I server_msg_send(server, APP_CMD_LOG, "upp send: start");/ u0 W1 ?3 J6 {* ^( Z- G
print_log(server, data, 64);
( R! b+ n* s7 W3 s* [: F/ b/ a9 {" N# b% b. @! G6 k
//
( n, v- e# C$ q. n! T2 ]4 {8 Q memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
+ }5 H1 q; W# P! A( C memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);9 j2 C+ }7 C! {
print_log(server, upp_buffer_b, 64);
- k5 p5 t, P0 v/ ^5 e( w# V* c$ c; ^/ h5 F* N
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
+ D- A( m& V4 \. ]- ^0 V server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
; W1 }- z" V1 P `: n. C server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
# ~' B+ x1 {' t( [+ s. M server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;, ~8 a/ v5 {& A
! N; W: R9 O5 E4 y; y9 S) v memset(tmp, 0, sizeof(tmp));
- K2 J4 s( V6 T8 ^: d sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
) _. }6 b. r8 V# T sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);! H) i+ k4 [7 P* A/ k9 ~
server_msg_send(server, APP_CMD_LOG, tmp);1 j8 @+ |8 j1 m4 U) K" N' N+ u
0 N+ ~1 |9 v! f5 X6 [5 j! X upp_error_count = 0;* x9 j1 ~0 Q$ H
upp_dmaq_int_cut = 0;: F: n2 n8 a, a/ H8 H" o
// fill in data ; N+ q% x: y T* R8 T2 |1 S( ~' l- s
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
# a; Y( t$ b2 C2 B# _ server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
+ ^. O4 q/ k. Y) {) q" \/ f+ y; y, }0 I' f- ^2 _
// wait send success4 y4 U/ S# y. A/ ~2 H
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ( D1 N4 M" K% M+ h6 W+ _ m- E
0 ]7 L: r; C5 C3 A$ e& g( _
// make data node in free list $ i% f2 P' r- T! `' A
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);9 [! _8 f6 U( p9 L
server_msg_send(server, APP_CMD_LOG, "upp send: success");' r8 _8 T1 q8 Q/ k) W; ^
}
3 ^' d4 x3 d" S return true;
5 P* K. v. X* m5 j}
% v9 l8 c7 C5 x! Y7 y" U) N" P9 a y5 M% ?: t4 W
* C" A1 E% x# Q3 w2 B, J
; v e- C' [/ W4 `6 q
: m" n7 A& l- w3 Z% E- ]" ?2 {- {1 m; N0 v2 {* L5 E
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|