嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 u; V! [! w/ ^) y
3 O: A9 b s9 F. q/ I
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ }0 Q9 E! a- v% w" D
#include <unistd.h>
) z D' l5 f. {2 B+ P, U) X
#include <sys/mman.h>
; Z/ g7 C. K5 z; L% S: r0 C+ {$ L
#include <sys/types.h>
( v# I; O# R- ?" L1 f
#include <fcntl.h>
' W: g. G7 j, B8 B1 B$ I
; E& K% {/ T: s3 |9 @. [8 F! h$ g
#define SHAER_RAM_BASE_ADDR (0x80000000)
7 c8 e2 s/ b+ q" O
( p5 Z' q: x8 g# E7 o1 B
typedef struct
$ D' n( L! t/ I3 f! a& y: _
{
) S! p4 m0 b' l1 J9 C! }
unsigned int a;
3 h: X8 |7 I0 u: h. z5 v+ T: A3 _
unsigned int b;
- [; b% ?- z+ I$ i+ c
unsigned int packet_cout;
; x5 K9 _6 d! u8 t0 A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 W, ?2 G* v v0 z' g: ?! \9 k
0 i' D- u; @' y1 m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 l# ^2 q3 ~9 u+ \7 E( r
unsigned int count_copy = 0;
- d; q7 j8 }6 P( K6 t3 a
7 c; F0 p- X( J; I1 h4 }- l9 Y* ^& i
9 `, _8 y* N% B
int main()
) w8 c( f5 Y! A+ w
{
) s. ?+ n2 E2 C) `# }8 z* Q0 a
pRX_MSG_PROTOCOL pshreRAM = NULL;
; K: |+ D) u) ^& D& |. k
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 X, Q. O. M- u+ _
$ Y! M2 p5 [$ ]7 G- u0 M
while(1)
* v4 X4 ]( v. x! y
{
0 ^* u( _/ m8 O. n
read_MSG_buffer(pshreRAM);
6 _/ W6 Y* k6 l& M) H/ |: j
}
, y" l4 n. _/ G, s) t* x$ W3 o/ X1 E
}
- S6 Q* M* Z! C% }
7 D. n2 g: O$ I3 z9 w8 v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
; Y1 e5 [( ]' f, a1 ~( e+ L
{
, `8 C5 c N% R* C% l
RX_MSG_PROTOCOL buf;
! h. c, ~9 Q3 ^
" q: X* L( M3 g, t0 x2 l* N
buf.a = pshreRAM->a;
" o: J, y. L0 I) @
buf.b = pshreRAM->b;
X& W2 w" D* Z. D1 S1 F+ v
buf.packet_cout = pshreRAM->packet_cout;
4 N7 w6 ]: S4 L; V8 m7 F
6 k+ F# p: P: _$ n
if(buf.packet_cout != count_copy)
/ Z* x/ _0 \8 {) B6 m
{
5 R% M" ^% W% I8 n5 c& E& s
printf("a is %d\n", buf.a);
. ~; [" m) N, ]8 n- `
printf("b is %d\n", buf.b);
1 h4 e" h: V( D8 L3 x8 E0 q* _
printf("count is %d\n", buf.packet_cout);
[: ]/ V8 F' \, ~- }# L7 L) g
count_copy = buf.packet_cout;
0 E$ t+ @3 M: V# Z3 H. W% Y: O
}
7 l( R: s1 N) N" y
else
3 `9 R- \0 @" B5 J% X/ v* d7 n
{
$ m' ?" J+ O' [- J
printf("No effective message!");
. D* W' q% b$ u, l
}
2 O v( V6 n6 P
}
0 u: M- t8 \! ?# J6 X F: C
' q0 z2 O7 u* E: V% Q
+ H" e! o7 i- @; g5 N# g
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 u- ~2 t0 U8 A7 I5 P
使用下面代码,对内存使用了mmap函数后:
: E3 l9 ?$ p4 x# d( Z3 t* x
#include <stdio.h>
9 B2 c5 r& u i6 G
#include <unistd.h>
+ l7 H6 m* D" y
#include <sys/mman.h>
( V. f2 N U |. D5 i9 Z; |# s G
#include <sys/types.h>
9 O9 H0 [1 @4 p( W
#include <fcntl.h>
& ]! q4 C) ^* }, {5 x( o9 z
% a& f, Z& h& F( B7 J, u- v8 e) D. k
#define SHAER_RAM_BASE_ADDR (0x80000000)
: m4 X6 r8 U5 n4 s3 k
#define SHAER_RAM_SIZE (0x20000)
- V7 k$ z) _0 x8 n
7 U0 L& T* @- d9 _$ [
typedef struct
& e6 u9 \+ [2 U# P6 G
{
5 [) @$ S- o. |7 k$ m
unsigned int a;
( C$ G1 \# \% o; C- i; S
unsigned int b;
! g& y9 U0 L$ p5 l$ C! A& i4 k
unsigned int packet_cout;
+ `3 f5 h$ m ~7 _# k4 F$ ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: a) k2 x, W3 w l: W* r
) k$ n3 a/ ^& a# L/ q( S
void read_MSG_buffer(int *baseaddr);
* R( i# W# V- j. N7 a8 A
unsigned int count_copy = 0;
) ?6 `7 K0 f% L' z
+ [4 O; U! Y7 p) c+ R
int main()
( ?3 t/ |0 J8 F X m4 l
{
: T0 y6 U" K- u3 S
int fd;
1 D# U+ S* |- N1 J
int *mem = NULL;
: ~4 c5 _3 v) W3 \; K
1 E6 m" d; f8 [" E9 f
if((fd = open("/dev/mem", O_RDWR)) <0)
8 {2 `+ Y- R$ [2 h. _6 k3 j
{
! P8 L- B& g |# U
perror("open error");
9 `, g7 {3 c N7 d
return -1;
5 x7 B( z) `( \% s+ ]5 g
}
: {4 |" O# [6 d, a! L8 l
8 |7 Y/ L T G( x+ I
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) K) p; g# Y4 V& x
; E, [+ A( u, |5 M! o; K) [
while(1)
G3 V N5 R6 C/ a
{
% ]/ n7 L$ Z% x' O# y& G7 i
read_MSG_buffer(mem);
" M( M5 |( z4 O. _: \
}
9 y% T2 m5 e8 B% e9 x7 B/ C3 z
}
. m9 u8 s. G/ S
" J0 I7 @% M0 _2 P, o
void read_MSG_buffer(int *baseaddr)
% p0 d8 i# d0 u8 p6 {+ n- z
{
$ |4 i6 d H' e
pRX_MSG_PROTOCOL pshreRAM = NULL;
% N2 S- K( L |$ D1 r" ]
8 D* ?0 E: \& q. J1 N9 j
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 T4 `! v1 m$ P' e7 r; u Y
( V; t# O: j& k0 d
if(pshreRAM->packet_cout != count_copy)
1 I9 B( X% b Q( h# W/ u& ~9 ^
{
7 |1 ~0 f2 q) |/ t2 H6 ]4 U5 P
printf("a is %d\n", pshreRAM->a);
! x1 X* C4 H- u, ^4 u+ s3 s
printf("b is %d\n", pshreRAM->b);
$ \3 i5 r! V! R% b0 `
printf("count is %d\n", pshreRAM->packet_cout);
* b! x2 x3 Z. l! ?) p" O
count_copy = pshreRAM->packet_cout;
! ^" c6 e: b6 X: K7 K
}
6 V6 F+ x% B/ r$ l
else
6 B; \% V6 o9 F I/ w. a$ b5 c% V
{
( \' z( c( L* v2 Y/ ^4 w
printf("No effective message!\n");
" q5 x: n: N) l, n) `8 I
}
! l- f r, ^# }6 a7 \4 h/ P! }
}
% L. w; v3 z9 W5 x/ n. r
+ A: D4 G" X, k; t( D& u7 F: E
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( W! y- h$ ^- j( y5 h
" T! ^1 K9 ^: q# s K
1 _7 y N! c. ^ J0 k5 S
8 j3 x% N0 h$ \% Z3 m
6 n. z# M- H* C& l8 X
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4