|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
, m7 M3 F7 i; _) j' u/ B. L. Y' z) [' S& I3 `: B" @# s
问题描述:
+ ^3 k `% I) U! E% I在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:; x9 X& O* b/ e$ l1 S& c F
1 h( U+ Y2 {* Q! [ x5 d
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。3 z8 F/ V: p* a
; Q) |' Q. \ a
测试结果如下:
' B( }- F) O7 h" w( ^/ ]/ }, ]& _138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?( Y% \+ b$ S" }
( j. X5 N1 r# t5 A# d
8 N! V9 k, G6 r. ^" f+ N备注:
' ], V+ W7 Q8 j1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
' z p( R" L5 n ~5 A6 G- K3 ~! V9 W2、相关代码如下:
8 ]7 V! F" m7 v3 Q5 ^//UPP DMA缓冲大小512字节
$ _& f9 g, i/ J0 k- U% P% |+ X& S#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍0 s' r7 `8 j2 c: r
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
0 u/ W* i) f @#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)8 H1 s- p+ r4 J) _6 @
* u4 O( N- n( [0 j, X. K6 S( |5 z9 J' ?& l
//upp接收、发送buffer
$ N* S# G* v: D$ U H#pragma DATA_ALIGN(upp_buffer_a, 8)* @/ {2 T7 M2 O) F+ N1 B! Q
#pragma DATA_ALIGN(upp_buffer_b, 8)
- z, Q k |4 o/ n8 M9 g8 i. H* \2 d
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
' k8 q& j; Z7 J2 s! zunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
+ L6 ~# c0 Z! I) m& k6 B' E$ ~5 |0 v, [) |, k+ b1 d: N, e# S
$ K! W6 d6 W( W- ~. v) F
static bool server_upp_data_recv(Server *server) ) S7 B1 F j) C# j2 d& q' S& K
{
1 n3 e: k" a8 } if(server->upp_channel_a_recv == false) {! ?3 W* b; {0 L# h
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
; ?: [/ r) \( L8 e* c! ` if(ListMP_empty(server->upp_recv_list_free) == FALSE) {% u! I$ Z6 q* \9 z
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
4 s8 N8 b4 b5 x# m/ V. g1 K% S. {; y+ Y& `
# ~$ `( m, r+ Q( [ memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
2 A$ M/ n8 d: j! g. h2 `+ Y7 C% X, n3 j9 `! G3 V9 w
server->upp_channel_a_recv = true;//
' r p# V1 c. Y3 o server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);2 _2 j* g( ?" {$ a' J
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
2 ^4 |4 M* R" W" P! \2 ~& P" F server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
7 W# o) ~: a2 y' R9 z4 t% k server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
6 y/ u. p$ x+ ]9 M' H( N0 E2 y9 u- ?8 X
upp_error_count = 0;4 V3 V- P) s+ ?
upp_dmai_int_cut = 0;
' L3 i# B) l4 c+ i5 U, P5 R
% [9 `8 A7 r& L& j1 L // fill in data # C: Z7 ]7 x* O c% C% h# ?( M* d
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);" |# b& ~) s1 g: [
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
& l- N+ z: W$ N- `8 O- E7 y2 K [ }5 Z/ \9 [( O+ K9 ]3 X" w/ d
}
0 D# S4 n1 D6 B( Q! T! ` else{* v6 W- [+ ^" Y- z: Z6 Y" n# ~" `' Z. n! s
if (upp_dmai_int_cut > 0){
( x6 u# {2 b. }6 L8 n DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
. [6 F, R1 v8 A Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);' s5 C5 o1 u% U: J6 O- c3 M
' q1 G$ r/ ?4 `8 M' J1 W E; k
% `& Q% Z( Y9 I% d% x6 S6 U //copy data to upp_recv_list_busy
- H+ |2 x% V# Q memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);: g# D& C* w1 |3 Y
( ~6 S$ }; u! D. L* @; `' l //2 R8 @) ^: {" h9 ?. B
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);& l; i, Q1 H! k6 }- S$ y% B
# F9 d7 R l. O* f) G* K5 s //
e" F! w* N- h" L* m server->upp_channel_a_recv = false;//& }7 P, d) d! u+ |% w* Z
0 T+ a* p" _ ^) N6 G! h" ]
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
% R* K5 x1 s1 I( H7 F$ l }
1 J2 Q* x6 ^$ q, F8 E2 @$ D* U }
- l5 w3 ^' k, ?$ X# \2 z
" A; O8 z, c" I/ Z5 K+ U. _' |
T( c( N: H& i/ n+ q return true;
9 x* @2 d3 ?. ^! Q0 B}6 I4 ^( z; ?( ]( W- d* ]
& x" R1 j' N4 d/ ~( Z6 ?" w
static bool server_upp_data_send(Server *server), ?3 t- ~2 W1 Q( X- F" z$ K1 X# M; z% |
{! b) t6 [9 {) h I5 G6 f; j
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
6 c; ^2 Y" j8 N" o$ K DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);6 C, F& S! u) O$ H5 r U" b
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
4 e: k2 r) R/ ]" W char tmp[128] ={0};
+ f$ F& O; O; q% o) K
: T2 H; R7 F4 B. P" x server_msg_send(server, APP_CMD_LOG, "upp send: start");. a) k- a1 \: |7 p7 W Q
print_log(server, data, 64);
, n4 C1 v% ~; U4 h: J% W4 a5 f; h* `" V& S4 Y
//, g+ N6 ?1 _! C, s# c
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
' [& M i- y$ T* J0 U memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
8 }$ m( V3 u0 e9 g5 [* q/ G7 m print_log(server, upp_buffer_b, 64);
3 R# v, e) J% c: q
# t- T4 O8 s2 y& i; p2 R server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);; N* |$ A" v5 P# O" N& H \0 g; N# l
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 2 k1 V+ J4 N- ]( @! r$ P E O
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT; _4 V- o8 Z4 A( J; r9 b7 m4 w7 A" O
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;/ `+ R3 f& y. J* W' E
! ?7 f8 L1 Q) _5 b+ d& h memset(tmp, 0, sizeof(tmp));
4 E n' e4 C8 M& y& m sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ' E5 x, K( L ?/ O& V& v5 e$ U
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);0 ^% b; }/ w) W3 _" X
server_msg_send(server, APP_CMD_LOG, tmp);
/ i K' G3 Q# n; B& U2 Q
/ W+ a, d6 O) Z: T3 A upp_error_count = 0;
~ K! d" L% ^. ?* g1 J upp_dmaq_int_cut = 0;
# L( a/ P0 Y4 b& p2 C# j! k // fill in data
6 P# U- R g! M3 M uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
0 P' O, {* s' Z" e; ] server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");1 x. V- H& U7 m/ F7 f2 h8 f: x
- L! }! v( I x/ d6 D: E! X // wait send success+ w# G9 {, ?: H( }+ i( a9 ^
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); : b# d8 @( m; A" P# Z" B+ b0 U
6 f% A9 j" K5 G0 x- Q
// make data node in free list 5 p+ g" [' J( {
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);1 `5 a d* ? P, _: ?/ R0 }* r
server_msg_send(server, APP_CMD_LOG, "upp send: success");0 ~) b; J4 W1 Q7 N5 l
}
1 A* L: L6 H+ c0 o4 f& X. t return true;! m+ o5 y' T6 }& ?! E8 f
}3 {( N. e6 a9 ^, N$ D7 E Y
! B7 k4 ~ |5 G
# |" n" v) m: Y z
' S: Y- c1 Q" M; Y" s# c, k; k3 \$ H7 x; c5 D
, D! P" T* ?) w5 ^ |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|