|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 # ^2 ]) }2 [6 S8 t0 L$ R
/ {0 I0 s U1 K
问题描述:
! V$ B# Q( E* J% Q, U$ |* l在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
' J" L- s" t3 h0 V
& t! f9 W( ^, I) b0 Z }图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
! ]3 n7 |" s- ^3 K& g# K$ a8 {5 a* K K6 @. p' r
测试结果如下:# p; u5 ?' K' ?& |/ Q4 h
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
2 g# D5 u3 h. B$ v
$ f3 s' R/ e, X, i& {. y7 s7 E+ R. F2 S# {. K/ ^
备注:* U6 g; V' R9 S Y, t4 |( E
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?1 |, j7 N7 G( r5 ^% A: M5 t4 h( @
2、相关代码如下:
9 f) c$ l3 v4 T# `' Q7 D8 |//UPP DMA缓冲大小512字节$ m+ E/ m5 r% K: n' c% w
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍1 ]. q& ?0 ]3 ~7 O, q, |
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
9 h* I" m2 Z/ F#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
" }8 ?! M8 ~' c
1 R/ V" r1 X/ k! J
0 y& U5 V, w+ c E, E& P//upp接收、发送buffer
+ V( n3 U- z& b( [7 |* S$ T/ M#pragma DATA_ALIGN(upp_buffer_a, 8)
6 e% p: f" C9 a& L3 d/ r$ P#pragma DATA_ALIGN(upp_buffer_b, 8)
$ l9 V1 |7 _7 r/ m7 F, ~ Q5 s# ~8 N8 M- p y
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];1 [+ D. C+ V F* N
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];+ }2 \+ M+ `& _8 ^# Q4 F% t) _
& V+ l$ Q0 Z% q& @9 o
7 S" h5 j1 |0 M# F$ E5 jstatic bool server_upp_data_recv(Server *server)
! ?, h% C g' q. A& ^0 `{
" ^6 Q6 M: O4 | H5 K! }- {3 W if(server->upp_channel_a_recv == false) {
9 }1 B0 ^1 q" Q server_msg_send(server, APP_CMD_LOG, "upp recv: start");3 j. D2 ~, a% x% @) i0 C% O
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
5 T8 @4 \/ ^& g% D7 ^ server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
0 t5 v0 z& t% k# [) O; Q1 m; {) s( S9 a! q- f0 C
; R' d- ` J- K4 `& k: w memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);4 T" W5 ^% u" I( z- K8 p5 Y
6 j; s' R, x6 C/ o' s; X" F
server->upp_channel_a_recv = true;//1 f ?" z4 c$ D
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
- E3 k; t# D6 z: l- f# g8 i server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
5 c* b! n9 _# A( i( |, |+ ` server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;) O0 @6 P7 u, a+ Z
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//* M) _' q& G) Q, L6 l
+ u. E2 S+ F1 f9 w* N- b: c/ z8 _ upp_error_count = 0;
& M+ ?) Q! U& I+ c4 j, T upp_dmai_int_cut = 0;" x4 p% p9 z" H: T% S+ E3 H1 h1 L
9 s9 a! U8 @6 x9 K
// fill in data
' o1 z% K4 s, U1 z7 I3 L, @/ C4 }# @ uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);' A W3 b [/ X, ?+ G
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
& A/ q- @% y( D- z }. z) K1 B0 V% f% f& M3 ^
}. T& x, q/ B. H3 T( s0 A
else{0 w' U3 q. |6 L/ v: T
if (upp_dmai_int_cut > 0){
! E; ?9 b( Y7 ^) M. W) B& ~ DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);. _# v3 v# u5 p0 x/ G1 k/ v
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
% t4 H l4 K: t9 }8 ]$ C0 _
( ]+ P, T! y. m; A# `; D, n/ l( ~+ g& h {
//copy data to upp_recv_list_busy8 L2 C! F5 b1 w
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
* u& L7 g9 ?8 e: S+ T' W' r8 Q. ]7 D3 Y6 |# I
//
' W; B1 h/ V) u ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);5 t4 d) `- V7 D
4 B$ y/ v; ?4 a) n) B# a
//
% E# W6 n. L% ?0 x) l/ H server->upp_channel_a_recv = false;//
8 x% v3 M f6 V# ?* c* H' w) {, f4 s# k3 z
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
: n. u1 e, w- p/ C, k$ R }" L' V' I! {% r2 x# i) N! g& ~/ [
}
* u9 f. E* W! [# a% j: Y" _/ O0 l8 r5 R+ `6 O1 R
_6 K/ Y# ~& D% e
return true;
+ R; J# \) E2 ^2 I}
! n6 Y' C6 {3 r# @7 y8 a) J8 D# F* \1 ~0 j1 j
static bool server_upp_data_send(Server *server)
4 n E1 u; _, {: n5 m1 ?{
, y1 `& N: }; @9 g' M+ e if(ListMP_empty(server->upp_send_list_busy) == FALSE){
/ N: Q0 R: r. c* _" e DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);( C: ~1 y3 X, C
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
+ K6 x5 |, I8 K7 i3 y char tmp[128] ={0};
9 j Z! C$ ^5 F: K7 B X L/ l3 b- u- D2 Y; z
server_msg_send(server, APP_CMD_LOG, "upp send: start");
5 }+ q. k; ]8 E& R% ]/ n print_log(server, data, 64);
- m: ]2 r0 _( y/ e0 s: L3 E' s% W' d4 [- q1 ^
//
# b: L m j( E9 J memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
3 _! w4 ?7 O6 i( y5 A4 N+ p, K memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);( o% R+ N( B; V6 y- X6 `
print_log(server, upp_buffer_b, 64);
. H8 P, M9 S% ~% Y! }- \: m
! P& \1 b& ?9 p server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
& W" a! j8 L" J server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 3 o( M: K- V" P" @/ s6 s
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;* b. c+ p, ~( R! h2 d
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;4 X' c/ N: y3 s9 i: h
3 e3 ^0 r/ G3 o1 n$ G memset(tmp, 0, sizeof(tmp));
2 c( Q3 g1 u* p' j. I' D sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 9 n% g& J p' r( C% S4 {) D+ r7 E
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
( u* p8 U# c8 i' X# O8 T7 w server_msg_send(server, APP_CMD_LOG, tmp);
- f3 X8 s( _ Y- L) z5 w4 f: T
" G W/ j) l: Y; `2 j0 [& O upp_error_count = 0;
& I$ P, j" c; K upp_dmaq_int_cut = 0;
7 p' z1 N7 c5 s' d; r // fill in data
: b+ o2 `- T- k4 t7 Q! H+ I uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); # p Q% |8 T1 Q a2 h
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");# e% R0 N8 e) Z1 t
f5 H2 |0 [3 y$ b, e // wait send success
4 N& p+ A1 I% u; D; K while (upp_dmaq_int_cut < 1 && upp_error_count == 0); $ X( d4 V; [; b5 J) m- W6 i& s
! A* T* x" S: a `9 }
// make data node in free list ( u. L) Y/ C D& |
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);5 t( i+ }, S- E* \7 _
server_msg_send(server, APP_CMD_LOG, "upp send: success");
# @! w7 y$ T/ j5 n" s }; f4 i3 _! D& F/ [8 \
return true;
' G* B* X7 c. I0 q}+ N# R! V+ X1 f% ^. S: D# W
8 F! g: Q6 e4 M- k6 d, a7 G. w' }( U% E6 o
' ~+ r2 E% L* F) K2 d
$ o) L0 Q* X# g! k- A( G$ F
( ~) D7 b+ {2 H5 y& O
' U6 m5 H. V4 z$ I* Q: ? |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|