|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 # l2 m% N( k6 Q/ P
# V( C! y1 X3 N/ f. O4 o问题描述:, h& M) }$ Y; s; j9 \7 z
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
) j9 y. ~; i# P7 m; A. `' r0 F$ y0 C, |' W1 P2 d* h
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
" M* L6 D9 e% c) n& d1 ~( e* c& m6 M. x# b3 u6 k4 ~
测试结果如下: E/ m; l. J# i4 P( X
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
3 `4 p8 u( } T' q% u0 K# p' n: f9 |1 l. K5 y+ ?' M
, C9 C$ I# o& M备注:3 ?0 d" T3 L7 Y$ i
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?# Y* A, J0 x4 p% ]" z; q( l( O* l
2、相关代码如下:4 O' Q1 Q8 w0 o% |: c& T9 n
//UPP DMA缓冲大小512字节
- F d3 U) w1 p r4 T! I. k#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
+ F5 d- g# v( C) u#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
$ x: `; l. l' a. v#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
& p2 ?7 T" n# A
. `& F( U: Y) j7 I6 _1 ^: l7 H% c. L
//upp接收、发送buffer1 h, r/ j: q% m1 _* ^: J
#pragma DATA_ALIGN(upp_buffer_a, 8)7 p' H7 ~% p2 M$ v0 {& ~
#pragma DATA_ALIGN(upp_buffer_b, 8)* d9 w2 V, i4 K) u" V, S
5 h/ p+ t6 s$ t$ o0 b: j& Nunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
y# @! ^8 I2 yunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];/ h3 J/ z+ `$ b3 ]5 j* ]
; ]% P9 N P; I% q8 a
/ i4 z' p7 g+ S, J. n7 L; z& ~static bool server_upp_data_recv(Server *server) , z% _ `( S0 B& P; w: f
{% F4 h% q* |: O; z. y
if(server->upp_channel_a_recv == false) {
- F" q: h( j, W, v, A server_msg_send(server, APP_CMD_LOG, "upp recv: start");
1 k# v0 C( O* h) o- p0 t5 F, U if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
$ D5 z+ B' B7 E! u( I& y server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");/ M& r: ?1 A) q; ]/ N5 g
/ d, i: F! S* Q) Y- {4 [/ K( M4 r7 Z+ `" N
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);: n) e0 E$ \- ~8 c
' F8 [' X& j, n# c1 n+ O server->upp_channel_a_recv = true;//* x5 b& Y3 r! A3 T3 _ l0 e6 x9 Y
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);2 H% w1 R8 ~' P+ u3 P; c+ f
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
* s4 H$ i0 v0 R9 J# R# i \ server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
+ ^0 T. z3 k6 g2 u4 o+ h2 ~* c server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
5 ]2 F$ q- Z5 d- |
$ Z2 ^5 a y1 v upp_error_count = 0;, E5 ?2 O+ W" i; o
upp_dmai_int_cut = 0;
" |, P3 [" ]# h/ Q9 t
4 ~& f1 q! Q6 Y+ j // fill in data
* f: c5 ?" G7 x( a1 l) J7 w& l% K uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
9 x' U3 b) {! M8 ^ server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
! `& V$ s* W3 D# z9 L& @ }( ~$ U e' J& p$ s
}
, R) |/ u, P$ t# o else{% w$ ^3 @$ }) U" k1 ^
if (upp_dmai_int_cut > 0){
: V/ @ m. v9 M" m2 a DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);7 c, k' h) C) X3 x( H) D9 }
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
" ?& I" g7 H8 K/ A/ V# ^
. |* [: t# j. [
0 S3 l! R; i. [ //copy data to upp_recv_list_busy8 r3 W' |7 d3 v8 d) [
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
: ], Y1 I% B" Q8 K& L1 `7 q, h* |9 U7 G! Q1 }
//
+ U7 F3 K* ]# a1 N* e( U* F ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
/ y: `, G: L) k1 f) t7 N' z/ f+ z8 z1 \
//: c9 `* }, Y& z9 [( p
server->upp_channel_a_recv = false;//! X( F' x& T( R
% R' d3 V. R ]- N server_msg_send(server, APP_CMD_LOG, "upp recv: success");
) l; I; m3 d5 I7 @6 g8 R9 c }
0 z6 P0 M* X# P3 A- P& o }
% w. R; I# v7 n1 r
6 s9 P% ]' q1 @% B1 J# k4 y$ X
6 Q/ L" F6 h- A+ {) E& X8 f3 Y c return true;& T3 J- m: @4 M5 z( n$ A: J- P, ?/ A
}3 T8 ? m# C6 q: D, c) h8 W8 H
! d% U' g z8 V6 t
static bool server_upp_data_send(Server *server)
0 S3 i5 k; E% ?/ Y3 ]{0 n1 X' p3 o" p" v
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
1 f! s$ z% b- J; x# _ DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
4 [2 B" S; D/ { unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);+ g; Z$ G2 s2 i4 f/ D; P
char tmp[128] ={0};
# ]9 E# G5 ?# x8 [* \8 v7 }. a( H# ]( F! g
server_msg_send(server, APP_CMD_LOG, "upp send: start");
8 t# D% l& {! Y5 I3 D# X. e! U8 f print_log(server, data, 64);! {; `0 I& d6 k% ^
8 C' P# K: v. y; X. C- t! H3 b0 j //4 l7 a" H* Z+ C. _! k
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
# g; i; ?" k$ ~/ ?9 D+ F: E memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
7 a; J9 V4 s; o0 K' r, V1 m# b8 a print_log(server, upp_buffer_b, 64);9 ]/ a& [) `( D1 ^9 ~/ ^( I3 R2 a! k: E
* g* S+ `! y* | o& g# d: v server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);; ?# T. p+ [, u, r
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
. G8 h3 w: p, H server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;# v+ r2 {$ c7 i
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;' ^- i: |8 _3 a9 O
8 L% A* K$ c( W6 [! j I
memset(tmp, 0, sizeof(tmp));
4 ^# u) N& e) v7 m, b' n sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 1 T3 C1 i+ v5 p' S; @9 y' B
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);4 l2 |$ {# E! m
server_msg_send(server, APP_CMD_LOG, tmp);$ T2 H v, G2 w$ R" y+ i: p( Z. L
, N: E' q2 _8 ^9 T8 [( }6 _' L upp_error_count = 0;6 D5 {) z1 F4 l2 M' R9 e7 }- C) A
upp_dmaq_int_cut = 0;: M+ w# b' s! b
// fill in data " w- U* d0 T+ i* C
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); : [$ A4 j% T7 a
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");" I4 Y4 l3 E: e/ C+ b8 s5 I6 Q
% |: ]) S* d! \5 [6 M0 f' P/ l
// wait send success
8 ]" u* m Y( I6 a7 f i while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
1 V7 P9 }4 C* ]7 N% q0 f; s
$ @7 C; q: f3 @$ Y" ]& ^2 l* D // make data node in free list
n# U: T' E( R0 X; Z ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);1 ]- r* j4 m8 A3 ]
server_msg_send(server, APP_CMD_LOG, "upp send: success");5 P6 \+ P+ @3 {0 {+ q! Y
}! Z/ b" |4 g$ s
return true;3 W$ O6 G6 Q! @' o, }! e
}
4 ~9 j# U$ |% x1 }& h; Z k* K( L4 i( @
! J+ K9 a( x6 I, M$ ^
7 A8 U' y, p! ]( h- I. g
. ^& ? {' T. v r# a8 Y
- @. w8 k0 t& z2 l2 E% |, z |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|