|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
, A5 o) J1 w0 A r% I- D' ^3 _
, J+ l5 t/ X! P: h* W问题描述:
+ g7 T( f% [7 ~$ d) w0 Z: f在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:; ~5 F) K) r9 U P: C4 W/ |9 R. n
$ x: C0 M3 j }$ ~图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
0 J* Q; b. L& D9 U
2 _0 C4 [" S/ \- z$ H% M* j测试结果如下:' v- w* g( g6 [0 A: w7 Y
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?6 W& ~5 L. g: P0 Z& f% \
) x: A+ |: ^+ L) e# i: X
0 b) H% g s5 C: ]; P! D9 K
备注:
, J! c" S$ k7 X' {9 K1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?3 F& p, ]* Z; H9 a/ b
2、相关代码如下:
( ~) l( Y5 v1 m//UPP DMA缓冲大小512字节
: f5 ?4 J4 w/ c: Q0 Q4 l#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍$ ], l! x" S' L1 F
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT4 w4 }# D( W9 K# P1 v/ S
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
5 @9 Y3 f, [6 j: `% W$ u8 S# R& r. J
# C8 N- [3 f# c1 Z//upp接收、发送buffer
0 }$ S" C9 E- M: O, E' u+ N#pragma DATA_ALIGN(upp_buffer_a, 8)
/ C+ X: J0 m$ ~; ~* e4 o1 L#pragma DATA_ALIGN(upp_buffer_b, 8)
2 z4 e0 ^% b3 a0 q- @! U! Z
* X' S$ j R: p+ M7 aunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
! q! C0 J- _! H0 m6 n7 j4 o' {2 |% Hunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
+ m1 J! N/ L1 E& d4 P. w
2 j0 f8 f* \( j% s3 }& ?7 d6 u' B' B v; i r- s' N" h
static bool server_upp_data_recv(Server *server)
+ {% c6 S: u/ D( G8 }8 ?{
6 ?2 ~( n7 q! d' M* F2 e2 ^9 `! u if(server->upp_channel_a_recv == false) {% s: G6 |; B% g# h8 m, x6 K. H
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
1 A3 C3 l8 d' t: F! k) J: k, g- L8 s" { if(ListMP_empty(server->upp_recv_list_free) == FALSE) {+ i! n0 z0 W! T( {
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");5 l5 t, z; y# s* i0 d: z0 X. i J
" X q7 T1 `6 Y ^
- e, t$ ^+ c2 f5 ~8 e* B/ M. G* Z
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);% N8 f: w0 \) a: m: G, i
7 K9 `; h) ?/ ]9 E
server->upp_channel_a_recv = true;// ?" }) L: Z% e2 d1 A: u# e
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
& ], P( l- C- o m; @$ o% e2 ` server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;7 A- R8 _9 i9 E/ o% ]% T1 C
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
3 {3 j( x$ C9 j4 W" B/ c: G. s, { server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
: L8 p; d! F5 a
m _, e- H* U. L upp_error_count = 0;
/ ^+ v& F6 C/ H& A upp_dmai_int_cut = 0;
8 H8 S1 f u# d2 ]. P; D/ l
/ W5 t* ?1 ?; q8 P3 ? // fill in data 3 n4 T6 u6 W$ T1 C9 c5 }
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);+ p! g% C" V4 Y' c! Z/ k ^
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
- Q- G: }- }) l3 \. _ }; Z$ N1 H) y; x) Q* ^4 U. x
}$ N/ N; Z2 \% m3 v
else{" ^! H: N& n) R4 H( N G; C
if (upp_dmai_int_cut > 0){) o, W) \3 n' X/ X h( o1 h
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);" V3 k) N5 t8 Q% A p. `3 x( k
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
1 @; B& e2 F k- \# o& T
" y( A3 ]! l# @. v/ U5 t& k+ V
4 C" L+ Y6 j; t, N5 z7 m; W. u //copy data to upp_recv_list_busy
5 g6 ?5 C' H* d memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
- M- Q. Y5 N& u- q: v4 Q) H3 L
+ b2 E& y, ?! v //
/ q5 x0 F) U, y ?" k8 \ ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);- J& `0 a5 s4 I: e, s: J+ I9 E/ K2 W& d
" g( R; l! n) u* g; S( U# o
//1 m# `6 ?: N3 k1 w: L3 z6 Y
server->upp_channel_a_recv = false;//
5 E2 T; N& E0 J' f- ]! P" [9 D2 `& ~4 ]2 @* G, n
server_msg_send(server, APP_CMD_LOG, "upp recv: success");; ~/ n5 s) x. k. F0 E& m
}) K1 u- \/ J7 B' x( P+ n
}4 q6 g9 D. K' p
# o& [7 n# s" F* ^7 o: h0 J- ]9 @) [ `5 P8 ~
return true;
/ _+ A7 O! j% ^9 I: @" B}
$ k$ V) \! t! W: F# c0 C
6 V2 }( `# I4 M! vstatic bool server_upp_data_send(Server *server)! P# [3 H0 n; z S) j9 Q
{4 }+ g' ~( R8 J9 \% d
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
" a, y) ~' b5 k; R DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);+ O7 j$ ]; f4 s7 k& v- ^* v1 U
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);. y3 ?! y7 L& }4 l6 x" B+ j" A. H
char tmp[128] ={0};4 K4 @; b n% T9 X: D
; G/ i6 |) O- \/ W9 o, H0 D server_msg_send(server, APP_CMD_LOG, "upp send: start");5 ?3 h: A$ c6 b, Z" b2 |: G& S
print_log(server, data, 64);4 ?0 b4 U) |/ s, O( B; Y
4 C( y2 @: }8 d) Q //' B9 H! V5 q ^# V$ [
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);" S1 r2 O6 I _, Z9 _" o0 c
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
$ a! G$ f0 N: W. J8 P" H print_log(server, upp_buffer_b, 64);
- P$ G7 N) V4 t9 V4 i! g0 I& q
6 x1 ]0 ^3 ]0 Q- Q9 }4 l9 R( Z server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);% W: j" P9 I, c& T, t
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
7 @* C G: ] Z server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;) S7 z; o) W l: S% y" U
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;& T3 y0 e# `5 ~" h7 U
, O# d6 Q; Z; E) S% p* Q
memset(tmp, 0, sizeof(tmp));3 D" c* t8 U1 R! {; ~6 h; y- Y6 g
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", - ?9 p# S4 L6 M b& a
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
! e: m- C: ^/ O2 P, Z4 O: U server_msg_send(server, APP_CMD_LOG, tmp);+ D# @+ F% a+ y1 y) {! I& ~! {
5 M: [. M& _! W* Z t" U
upp_error_count = 0;
: G1 |% O% d5 _3 F4 ~ ?: u" H upp_dmaq_int_cut = 0;
& k9 t$ L" \( k* @% R, H% D! c // fill in data 8 ?* Z; S; l; T( [- d
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
* ?# f: ]% A* P [ server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
6 K( _. z: l$ m: ~# g t
* T" b c! w+ i // wait send success! d" ?0 [6 I/ `& G- @: J7 e
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 2 P0 h% y. a$ @# ^; ~
1 w2 a! p( M/ X N/ _ // make data node in free list
6 v6 ^2 s! ~4 N' q$ P4 T$ R5 ?: ~ ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node); L8 f7 c6 {* |/ c. r7 q5 m# ^- [
server_msg_send(server, APP_CMD_LOG, "upp send: success");. C4 i5 T( F) `
}& l, l8 J1 F4 T. g! k9 D
return true;
5 [0 i# l; S/ D( E9 M% ^# [}* T# n1 l$ v) q, \( u4 U
0 i$ H# J, u5 Q. z+ H" |: _
+ r0 b: k8 k; [
' J. V6 e. r9 ]0 z/ f
' z6 w5 ~7 |* X2 N9 v/ k- ?9 J) r8 a% R3 l0 o! t: v
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|