|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 " K( Q U* p+ m! Y; Y
L8 y! E+ Z" `0 P( Z8 A% ^
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>+ \& b: Z8 D* z0 a6 ?* B2 e1 x
#include <unistd.h>
$ d2 o4 E2 ~9 A" f* p4 N6 I#include <sys/mman.h>
2 \2 y% ]& m4 g8 t6 U- k#include <sys/types.h>) ` {4 @ R, Z6 ~/ x& u1 {5 c+ C0 v$ b
#include <fcntl.h>
4 b* n$ j0 }( D2 q" [
) N9 z4 F* V3 z+ O#define SHAER_RAM_BASE_ADDR (0x80000000)
, a9 p, I1 }9 X7 V. s9 `+ S# q6 n7 q* P8 @# L( c1 o2 P
typedef struct
; w" B2 C+ t9 n3 N+ o{
; A4 [% y, d8 H' T unsigned int a;! O( {* x9 U6 T+ T' g
unsigned int b;: Z' n# ^) `" C5 {: Z1 j
unsigned int packet_cout;; @! z6 G5 q0 R, B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ a- @7 J" w& k# V. a- z; ^' c7 B$ G3 R! @" `
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) w+ ?$ d# D4 a% u" e9 J9 lunsigned int count_copy = 0;
. u% c* q$ E* Y( Z% y
, H; }5 y0 x; \6 M9 t% k6 i9 {# Q! i( F7 c6 g* Y
int main()! k, P1 a- A8 I! v& g; L& c2 O
{
1 c2 d6 [8 n# P ^( a* j0 M V5 O pRX_MSG_PROTOCOL pshreRAM = NULL;
+ [, ^6 V, Z, }. G8 C5 b pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 [8 V; c' K& \
; n9 p5 ?* }/ Y while(1)
2 k; L) s# ?3 |0 _3 y" X {
0 T/ o" o( P: h' J" Z, Q7 {# X read_MSG_buffer(pshreRAM);. d8 @- W* q* o9 s1 |
} + z9 V5 W& w4 H W3 T& {
}1 a2 i) v1 W- C' t
' p9 t$ U; F8 z6 V% Wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)1 b8 S) Q+ `. k( D9 [; m. e
{
( k' q: a" X$ Y2 F) [ RX_MSG_PROTOCOL buf;
7 R0 ?2 C3 Q7 o7 Z% K' b) A7 _" {" U$ s + K+ T z; U" b# I6 l
buf.a = pshreRAM->a;; N% n) y! Z) G' B! \3 f
buf.b = pshreRAM->b;! x* W8 ^( q, D) a4 e0 R, J' @
buf.packet_cout = pshreRAM->packet_cout;
8 o, f0 I$ X5 l+ Q9 A) Y. g! X 3 i$ i9 T4 Y! V0 H, O
if(buf.packet_cout != count_copy)+ n& i; n/ f: Q: v/ c8 M g) @$ B* b
{0 }, ?1 U! k' \- R7 h8 O9 ?
printf("a is %d\n", buf.a);5 F* g5 g) ?4 c
printf("b is %d\n", buf.b);/ s! Y+ ]2 r- v) A
printf("count is %d\n", buf.packet_cout);! e( p- F' }4 K+ M" K% _/ ]9 {
count_copy = buf.packet_cout;
6 S5 E3 O7 w" [: q }
! w# {7 }1 L4 ^ else
& }7 f( C" x9 p& ]! L. x {
! |4 M m" L) d( z R$ ^6 r. P1 a printf("No effective message!");
7 t5 H9 ?/ `! n }
& {" u1 ^/ \/ \% M& {}+ M5 K9 v- _% \( @9 A. T
1 G% Y* v4 u, a* O( N- Z, L
: t$ q" K2 u9 t& ^1 ?但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
5 X9 {" L3 _ w% g使用下面代码,对内存使用了mmap函数后:
. G) M8 D4 k* P% j#include <stdio.h>
1 K! D% [; o8 S# { B% ~7 B#include <unistd.h>5 W# D9 R8 q& N2 Z$ S A
#include <sys/mman.h>0 ^& [ N3 P1 q8 G% N
#include <sys/types.h>" X' V" C2 [) l N" ]1 H
#include <fcntl.h>. v: z, w- g) C, ?
( `& Q) Q( f' S* u3 g3 R+ f
#define SHAER_RAM_BASE_ADDR (0x80000000)
( u6 W9 i0 Z6 B#define SHAER_RAM_SIZE (0x20000)
3 e% ~2 k1 q% Q0 P$ v' q) T+ E5 t- t u/ T( _& U. r
typedef struct9 V3 j; |; S' S, l s' n
{
+ T( Z* }5 K- h unsigned int a;
; W `2 j& M/ @! z# o unsigned int b;& @1 q4 B g: ^: B1 B0 Y l% s6 r# h' {
unsigned int packet_cout;! Q5 ~3 m H! g& ?' A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. N' W/ `! ^' w& s: J& ~
+ k% B7 r' y* f" ?void read_MSG_buffer(int *baseaddr);
3 E: ^2 Z% [" `6 h6 [unsigned int count_copy = 0;1 H/ {+ G+ a4 n# x; ?4 W3 p
% R4 K" K/ B, [& N, d
int main()
8 y% N [3 h# k: `; H+ F{
5 O* y* ~6 M+ G7 _9 t int fd;0 ^- ^. |' f( \3 V0 H! W$ B; D, n% e
int *mem = NULL;- m0 z) O3 ?) h7 Y
! R8 I2 Q# B1 R4 a if((fd = open("/dev/mem", O_RDWR)) <0)
) H8 G3 j k& w, I; W: ^ {3 p3 g+ H, N! S4 q
perror("open error");
4 _2 A# u) Y; b7 x7 P- p4 a" `. m return -1;
6 X$ Q+ S2 w# Z, X; k }; T4 w# c: R D
: s6 N w, Q5 F- ^0 i5 a mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# x! R: G0 Q0 t1 t4 r3 i" E' H
* E0 P5 u( M1 e: Z o$ |9 B$ u while(1)( S% U9 a# B# f- u2 J% R
{
6 a4 C h! A. B read_MSG_buffer(mem);: P; A6 [$ y G4 l. x, }- l6 b; Q: ^8 d
} 9 M6 L" o+ h8 Y& p L8 o3 o: Q
}
2 q. |# Y* a7 e6 }* b: Z" u
1 l1 V+ W3 @% s- Uvoid read_MSG_buffer(int *baseaddr)
7 S$ q* \9 H; ^& L{
- ~1 |. p; n: p; p" A pRX_MSG_PROTOCOL pshreRAM = NULL;
0 ?. u5 A# ]) f' j I* ~# g3 A0 }8 w x$ t% W
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;8 V" [ k. M& f8 H: u) |; X' O
& x! v. e- s+ v
if(pshreRAM->packet_cout != count_copy)
. A, T6 M9 x* m { e; M* f) r/ m2 N8 h; C5 Y
printf("a is %d\n", pshreRAM->a);4 g' y7 W5 a d" V
printf("b is %d\n", pshreRAM->b);& T1 D5 i* Q d6 O/ P% N1 ~" y
printf("count is %d\n", pshreRAM->packet_cout);( q; o/ }1 @; h8 k& L( n: U
count_copy = pshreRAM->packet_cout; ^: P$ r+ H8 P: V3 N
}
- c% J/ R" p T2 Z, t5 N else
0 Y- T4 s2 [" V7 x' } {$ _# Y9 O1 `# t$ H6 C- L* M
printf("No effective message!\n");3 g9 t2 b' X5 d$ d$ F! k
}8 g* W! C0 T% C M k
}% d2 v, T" b& ?7 X; ]
# l; U* N) c9 ^/ ?3 X9 I
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???/ J7 Z8 i/ z5 E1 C
, }1 i) P1 P# p! _5 u0 w
& M# K1 ~0 v1 l. E0 [# _% K
# w6 [' l$ r. w# @" B+ u2 v3 k4 ]
|
|