嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& ?: w+ C1 L2 K. v! c0 | q+ k
( l+ ^5 F6 B: G; ]; y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: g% n. a i, k: t" d0 O& T$ D& V
#include <unistd.h>
- M2 W9 {# O" |' A4 {' e
#include <sys/mman.h>
6 i3 {4 u/ \, j1 o
#include <sys/types.h>
& k4 G( @. Y3 `3 `
#include <fcntl.h>
% ?- o% o! b h7 h" H" o6 R( N
4 c; c6 M+ s$ s0 q6 O" T
#define SHAER_RAM_BASE_ADDR (0x80000000)
0 l* a" q8 L" y$ Z8 g
- u x" M) k0 O3 [
typedef struct
; u, y( o, ]0 \
{
* B7 ]( V% `% Q& m/ D% d
unsigned int a;
7 W6 e" J% Z |* k2 Z c$ j9 e
unsigned int b;
. y! K* i4 V, t- _) x- E. e0 n1 n
unsigned int packet_cout;
- a5 z* X, ]/ W3 c. U6 R n0 K# J3 q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& w/ R- H; E* W8 o
1 m# y& G- I+ P2 z3 H3 n3 r1 T, H' F
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 ^* e3 s+ [4 W9 ?- u
unsigned int count_copy = 0;
* z8 m. a3 |5 D5 d4 M9 r
( L( P$ t% R" q
) O1 P: G% v5 G6 I# f* h" \( e+ |
int main()
Z/ J0 D+ A6 W1 V4 h5 b; m- m
{
/ l8 t ~0 G+ l6 h+ \1 o+ [
pRX_MSG_PROTOCOL pshreRAM = NULL;
' ?5 G8 {/ O8 k( K
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
) o' l' K/ p# c, D
1 @6 ]: I0 x7 K2 u* n# C) O
while(1)
7 L4 l$ y }0 n* F, a9 I
{
' `( `2 C% Y) a5 `* |
read_MSG_buffer(pshreRAM);
8 D6 B( d& ?% [) n; A
}
3 x! }& X' U+ z/ w; c
}
* l6 q @, l8 ]4 L" ]. u2 @
1 b5 n* W( V) S! L s, E i
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! j* e4 c( z4 [, ?' C
{
. q0 _6 _3 `; K9 \/ O( L
RX_MSG_PROTOCOL buf;
! T4 P( Y- x4 o1 P
# u a/ Z& L6 v( g5 N
buf.a = pshreRAM->a;
; z3 A; u. z O% \4 w
buf.b = pshreRAM->b;
3 C9 i. J5 {. T+ I& n d) c
buf.packet_cout = pshreRAM->packet_cout;
9 l4 P4 m- N. s0 P5 B3 [$ w
! q0 [6 c% s$ Y2 d, k; V, n5 V4 [8 f9 Z
if(buf.packet_cout != count_copy)
, s6 {8 E! h0 P
{
# y1 x: `- p. N1 _, W: f7 N k
printf("a is %d\n", buf.a);
0 B* [) C$ Z$ o. M
printf("b is %d\n", buf.b);
' w6 a$ N6 j! f. n3 h
printf("count is %d\n", buf.packet_cout);
+ b; `- w' s: p$ Y: _5 A3 K
count_copy = buf.packet_cout;
; `# a/ ?5 T- |
}
8 d1 s' O2 ?( n/ N" G+ |' h- p# r _
else
1 O/ t/ ~- i9 E4 x' I
{
" s; t" x; j- D' h, p) K# ^ h
printf("No effective message!");
3 M6 b; k [8 D! F _' z6 C4 v6 C
}
6 {! Q6 g" B: O. k
}
7 Z8 o& x' {7 T, d
) R0 q% ^, O( {) E& ?3 O
: V: l9 b9 I; ?8 p" a K
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
+ C# I( K& w. p
使用下面代码,对内存使用了mmap函数后:
% }" O2 a% k8 z6 v2 _* K
#include <stdio.h>
5 X) T/ b+ [) Z1 z8 b
#include <unistd.h>
4 B5 x. k- O) U" A$ \* h" V
#include <sys/mman.h>
$ p% F. k, e0 e: C
#include <sys/types.h>
6 Z" a; r( K7 @' w
#include <fcntl.h>
, h4 \* a0 q- K b ~
9 W* ]" I0 a: ~4 ]- n( i
#define SHAER_RAM_BASE_ADDR (0x80000000)
& r4 i! h; b) K- U9 C0 I: p
#define SHAER_RAM_SIZE (0x20000)
' X1 U. ^+ ?! B g3 M' l7 J5 _' o
1 l1 N5 p" ^" ~6 R/ e8 @
typedef struct
' U* J; D# c& Z5 D$ J' }% @: G4 U* i1 E
{
0 |# Y' y) C2 T
unsigned int a;
! L v5 ^+ O$ h- J" c! A$ c
unsigned int b;
$ ?! E) n/ s r1 n
unsigned int packet_cout;
) x+ V4 t$ Q5 O3 v, Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. j: A" \0 ~/ S9 a% H8 b" }7 f
( C/ O8 D( R/ S) E
void read_MSG_buffer(int *baseaddr);
* }. F) r- A9 ?. ` B
unsigned int count_copy = 0;
" c8 x6 D2 D u1 b) D' h/ R4 R( }
: f0 K. u2 ]* h7 e
int main()
3 h* U- ]/ H* D# E$ b
{
1 A* H' h: c$ j2 c$ I. B) P
int fd;
: u6 \1 d- ] d7 H% o) F
int *mem = NULL;
1 N( ?/ F1 v# h$ M0 x; P
+ w6 n# l" r" P' v5 ?" |: `
if((fd = open("/dev/mem", O_RDWR)) <0)
! a4 u. R' V4 D1 @- {: k7 H
{
7 _4 k/ n' B6 }& n" O% @
perror("open error");
% {% E5 r/ P! {6 t! m+ P& O
return -1;
0 A. ~$ D$ K+ ^+ M$ y8 _) B/ I
}
. f" X8 p! H4 K3 E6 R0 x. m
8 i3 s9 a$ |4 ~7 y) S6 \' `
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! h* B! X+ g+ Q2 l
, |# _7 E* C# i) k. `6 p9 W
while(1)
2 {3 B9 R1 D. v! f1 z
{
1 o2 ?! |6 J5 E$ n& E2 y
read_MSG_buffer(mem);
3 N6 o# F: [# h0 g2 N: `
}
6 O: O, j5 T" m! m0 ?
}
) N. m2 V$ e9 U F; e8 S8 I5 f
4 R9 p' q( q. q8 w
void read_MSG_buffer(int *baseaddr)
0 Z# f3 o/ R9 q, m* _( e
{
- h. t9 t) I, e& [
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 L2 U) j+ D; g4 y5 Q
/ r$ s9 i k1 H- U6 y7 s/ G( z: o* }
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- b [( ^5 M& j5 f4 |2 A
: v$ V9 D ~% C: u0 G4 P3 p
if(pshreRAM->packet_cout != count_copy)
# }3 a2 z- d5 x, ~% O
{
3 ?4 I* L; B7 C8 M' G/ Q
printf("a is %d\n", pshreRAM->a);
' Y; C* _2 e6 n" s' b3 z$ R* j
printf("b is %d\n", pshreRAM->b);
7 z g9 i2 [* i% _) o
printf("count is %d\n", pshreRAM->packet_cout);
+ ?( ^: C5 s; \" y! I S3 L
count_copy = pshreRAM->packet_cout;
2 W6 m+ x) c' I7 `$ i" X9 F7 r9 n
}
& z) N6 X+ M; n
else
! I# Y: |0 d6 a
{
) O1 e# j; G4 |5 b
printf("No effective message!\n");
: r; @0 o; p i. b, d
}
1 {; O! p0 z* x, [2 o
}
: a$ }7 L; z: \2 o- C$ m
. T3 Y g" s# j% ]+ h
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" i$ Z; i2 W) o* u2 w% U/ @+ v: C
' s+ h: E% m! C- ]3 g5 b
+ x' e) |' T* [6 w4 W
" `" S& o; B- z" a, P9 w: `8 G
: u/ S9 r! K8 ~6 u0 Y0 c
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4