|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
2 U: j+ C( j; j- D! Y0 l4 N U$ u) C8 E5 x7 W. i
问题描述:
+ l: Q' v' q1 `" t2 T4 Y; _2 k4 B在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
' T) B. a0 Z& B% r
; Y- i4 z! a5 B) b7 n" J图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
* L- X& ]' L6 z1 _/ t
) K. D5 j* J* N测试结果如下:( f. {6 f% F# X8 w8 E* b/ Q4 D* m
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
1 v& a6 I9 p, t" U) w
; _9 H6 K+ ?& J
) a# H, o( a+ e5 J5 g备注:0 e+ E6 B+ Q. g/ j( |
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?: w3 C: g* `4 t: x3 e. C' b
2、相关代码如下:
3 v. Y l) Z/ k8 P//UPP DMA缓冲大小512字节- ?+ M9 ?2 g' C, s. M
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
. X/ T- m! O) r+ b# w#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT: E, v8 @4 b# g8 ?" [$ g
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
- k* B6 ]& l+ y8 W F, N7 H9 n& y9 I2 R5 \+ Q
+ _+ X! W0 ~# {//upp接收、发送buffer$ ^/ I& E8 A6 c9 u; q
#pragma DATA_ALIGN(upp_buffer_a, 8)
1 E3 z% o6 C6 {#pragma DATA_ALIGN(upp_buffer_b, 8)4 F, X$ d1 y) U) b) D7 u
% o% T: ?5 y) W9 |+ xunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
/ [8 N5 E7 x( U# h- I" funsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
8 d) x) P b5 B9 n" n: y$ a6 D3 X- X, q5 J2 i3 r& c$ u; m
- o7 f+ R% ?; A7 n! xstatic bool server_upp_data_recv(Server *server)
& L$ u8 C; G1 L{
& O) Y. A, M- X: N3 o! \ if(server->upp_channel_a_recv == false) {: I: r: [4 G V; a6 v
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
8 R! ~, W* o! N) u4 R7 u$ o if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
, X) Q0 \8 L7 m: q: }2 W server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
& I V% q6 `( F- U* a3 A3 S. c* e- L1 ]2 Z9 y" H/ i
9 f7 Q- v" ?! }* z memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
7 N7 `* g& C5 f h! [" `# d6 E. w- H( s
server->upp_channel_a_recv = true;// t: h, C3 S/ y: H2 ]& P
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);* l0 {* D( R$ V2 A/ @8 r) {$ c8 B
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
U/ ^- S6 c h; \0 A: a server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;* _! Q! Y" F6 o4 ]# E) a* _
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//8 p0 u: p& y% Z+ Y% G% X. N; z
8 s+ k# z' r3 m3 z4 K8 {
upp_error_count = 0;* j+ b- E# j/ F6 t D1 q# `
upp_dmai_int_cut = 0;
; W7 v% {" `7 @9 c# d0 m
! ^' O; T. t4 _' I* Y I/ E // fill in data
# z- R' p: b$ [( V uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);, v. Y* d2 I( l( u) B2 s) V+ b$ P
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
3 k* ] u8 v1 N9 a) q) G5 U }
~5 v$ n _% c. i( }% h _5 c }0 t* l) o0 x) q& V! v" M
else{
! }# C6 Z: N7 m8 n; d% `2 _: } if (upp_dmai_int_cut > 0){3 P' i9 I6 m: _- g" _) T% v
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
+ x* @$ s. H6 w. X Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
4 Y/ o# a# D4 p- O3 g! z
: {0 i; W$ y- \' ~' a+ U
' i5 D% Z) L8 S! {2 U: J //copy data to upp_recv_list_busy' T$ V8 m" y) H3 E' e
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
: T+ c9 O ~2 ~7 n+ _( j9 s# w4 G! P' _
//) o4 g2 W; p9 _: [5 T2 u( V
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
! C9 L& {: j9 q: a2 \6 Y
6 n) x6 N4 r8 ?6 G0 {3 c- ]& O+ \ //
V! F' \7 v& |& F1 q( H* B) {& d server->upp_channel_a_recv = false;//' w, n" N. d! b: n& p2 s( ^
3 \/ V& `4 a/ @, H3 V1 b
server_msg_send(server, APP_CMD_LOG, "upp recv: success");- F$ P- k% v3 A
}
$ Z5 B- D1 e2 q; A7 ?/ c+ H+ E }1 _1 E, Z1 D4 B: |, Y) H
1 A1 W- D0 F9 D+ d1 y
2 r8 e$ B! H' \1 |
return true;
0 c0 g- F: `6 k* t5 w}
$ m& B0 B. Z2 u5 a9 Z
9 V- B v, F. F2 H; o1 Gstatic bool server_upp_data_send(Server *server)3 x( T6 j$ Z$ F8 i6 T( ~- [
{3 `7 a5 b/ F6 C+ ^
if(ListMP_empty(server->upp_send_list_busy) == FALSE){: R; R! p6 f/ f1 i
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);3 G& G5 A0 T* z7 A
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);1 r5 i7 m5 L; E4 Y9 s1 ?
char tmp[128] ={0};% W6 a- D0 f9 F+ E V4 a
8 v# @0 W& o9 a server_msg_send(server, APP_CMD_LOG, "upp send: start");
' v z/ j/ G1 l8 ? F# ~ print_log(server, data, 64);' l8 j! [! g. {
- D9 _0 ^3 ^8 c' p: N& g# _/ H* v# @
//; b: y6 F5 d' ?/ Z* E# d
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);6 M5 W- w$ u# R2 c; Q1 t |
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);& l* d' f# Q! K+ N3 C
print_log(server, upp_buffer_b, 64);; L. Q; J8 y2 {+ x
' i/ I. q) v, \% V server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);# ^1 J+ L4 }8 |' d
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
3 v; b7 P/ k8 x) \ server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
4 s4 R* l9 B4 ~- Q server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
3 I% c& y* q q4 y+ B; c9 ^# a$ Y$ }4 g# w* g" D! Z8 i/ G
memset(tmp, 0, sizeof(tmp));
% l9 p* C B) j _8 s sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
4 |2 A0 @8 S9 n M/ ^ sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
b: y0 T* i8 u: {( I server_msg_send(server, APP_CMD_LOG, tmp);7 P# }' T# U1 l9 i7 I
& Z. ?2 [" d1 f+ a! L6 G5 c upp_error_count = 0;) e `7 j# Z# q. |- [
upp_dmaq_int_cut = 0;
+ J D2 k8 M$ Y$ _1 l# p // fill in data - e% R, [, j3 n y7 M$ w. d
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 7 W/ a/ j, t+ w
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
5 F$ a' G" s. v$ t1 X
: e* q3 H! H% w- `4 j- V // wait send success
1 E+ {' ^: y' X' K9 A while (upp_dmaq_int_cut < 1 && upp_error_count == 0); , f* c/ s6 ]" _! n3 z, A: z$ {
/ I D# Y9 h" Z9 ?! t9 B' l m) p // make data node in free list
& P& a% W8 S( V; d ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);6 `. B9 D$ @! R3 k
server_msg_send(server, APP_CMD_LOG, "upp send: success");; Q& S8 A- o2 ?1 N3 J" Z
}2 p" N6 n2 i: D
return true;
# l( Q* Q% O/ u" m}
5 L8 a, N% V& }9 s& \: Z% U5 X. ~* p) |1 o: _' T J2 [/ @& k
& f/ c3 C+ p, ?9 g
# L4 P3 j# ]- R0 g8 F, k
# Y: ~+ X$ s j" s$ t4 m
5 [! a8 j' `: O |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|