嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
; v$ k% @* b# N: T
6 {7 K- l; s' Q; _3 x/ W7 c3 J7 s
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ j2 F) C3 x! _+ c& ]* ~
#include <unistd.h>
* r8 Q* G5 e1 N: T- X+ K; S
#include <sys/mman.h>
' m9 }% A0 x2 L
#include <sys/types.h>
5 k' s' |7 B& _: F' J
#include <fcntl.h>
9 v2 Z8 A5 o5 s- U
! s# G: D/ h7 j& o; M6 f
#define SHAER_RAM_BASE_ADDR (0x80000000)
" a) {$ t3 D! i! O, ^& J: p* n
+ H+ M5 P; V/ G- Y; f) O- q9 G
typedef struct
8 ~. H: o# I' {; A) V5 d7 M" ^) T
{
9 d6 z) U! E0 j7 U9 U2 ^
unsigned int a;
7 K& V6 S; j6 p
unsigned int b;
" B6 m. j: m; f# {- W
unsigned int packet_cout;
# x8 @# w. d" W% p! v2 @/ j7 }
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; C7 F5 N* C) r8 P! X- ~( g0 u3 m. V
: m) P& B5 n6 {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: Y6 {$ E9 w7 u" q/ k
unsigned int count_copy = 0;
* u9 E( f( x' @3 F9 B
! n3 v, T; \& k' z
2 S. a3 H8 m* e; }, r
int main()
7 h2 K8 R+ X+ }# e7 L% \( o
{
8 F# q' P, b& |# K/ s' F
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ E: [; V9 h, G# Z
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
6 {+ @/ T8 p1 N/ I! O# n
1 u: ?6 S, ~; ~/ k
while(1)
% y$ u/ X; }/ d) v
{
% d+ S: h6 u% @2 C5 N8 R
read_MSG_buffer(pshreRAM);
: N1 z3 T- { X- U
}
6 V1 C* t6 H: j: m' ^( {, ^
}
0 Z/ o# f. G" a! l) I
' i. G/ K. ^4 b) _# r
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 r$ I9 @1 }8 M0 i+ \9 z8 s
{
* H6 [4 v+ }6 a( F* w" ~1 ]
RX_MSG_PROTOCOL buf;
4 K2 m, q6 T- ^5 P2 Q7 S. X) h, T- J
. i" J8 P% H# m/ D+ Q% [. B3 j
buf.a = pshreRAM->a;
" W9 `# u1 x% X+ F# t
buf.b = pshreRAM->b;
- S ^8 r7 l7 y, \& ]: J! K
buf.packet_cout = pshreRAM->packet_cout;
+ V; v: z! A! v; H
* ? i5 }' j' M1 t: c
if(buf.packet_cout != count_copy)
8 q8 l4 H' c/ @; c- @& I; B$ j% l
{
- q3 I0 j6 F- i% u, W1 l
printf("a is %d\n", buf.a);
, G7 E- U/ D' n6 J8 }; @
printf("b is %d\n", buf.b);
3 z; t: a" P% U1 R* K$ T
printf("count is %d\n", buf.packet_cout);
; e4 a9 F3 `0 a
count_copy = buf.packet_cout;
( g0 Y1 P5 I' b$ O4 j: C
}
2 M# K4 B5 s: b# `
else
4 l4 d, N2 F" ~; O4 E6 T$ |
{
/ j$ B3 G* `$ |( X
printf("No effective message!");
; z0 X( [( ^( V- c" T% z9 f
}
: ?( F4 a. Z+ h( W8 i, {* m+ S& K4 M/ I
}
& o3 I# s6 P/ p4 R
* W8 \9 _" ~+ h8 j: J! d
7 P4 X" i2 }: C
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, h5 b7 _0 ]" P/ v- I1 a% ?* m- J
使用下面代码,对内存使用了mmap函数后:
e0 Z# [& @3 }$ u2 Y
#include <stdio.h>
- E# y% b) C# W5 @
#include <unistd.h>
- T9 p, Q, v0 C) l, |- X
#include <sys/mman.h>
- P2 ]* T# S0 j+ `8 l
#include <sys/types.h>
) s$ C: D2 H, f3 q$ l3 Q+ o, [
#include <fcntl.h>
! V2 T! z* _! o1 N6 x& A9 O
$ N, \. ~7 |; e6 e! V' m6 r
#define SHAER_RAM_BASE_ADDR (0x80000000)
! A3 T$ {1 v! l, N% a. E, `
#define SHAER_RAM_SIZE (0x20000)
9 _4 P" N8 O1 B2 x6 r2 S
& g6 i8 C' k5 t2 G5 Z
typedef struct
' I$ R9 n, ?: V$ L# q; Z* K. l+ B
{
) r" [' D" }& I) E* W4 ~
unsigned int a;
! j$ X* h8 p9 a8 `
unsigned int b;
# |4 A* I/ d$ F/ g9 Q" @/ Z
unsigned int packet_cout;
, z" z' }2 x( t, V) v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) ]# y" H/ ^$ l+ X5 X2 r6 L
) W4 L- T! r4 e X! ?
void read_MSG_buffer(int *baseaddr);
8 u- r, A2 a& \. x( u7 S! r
unsigned int count_copy = 0;
' X" x9 d* P3 h/ A
5 L, k" ]4 b+ C6 x% |+ G
int main()
6 z0 {0 x' v; c) T8 @' W# s: i% k
{
% o9 `9 s* V2 c7 W% m7 ^: R9 \
int fd;
+ c$ z. E' I: r6 l
int *mem = NULL;
; X; M: b, w! V- p) A; x
) u; l- `8 ~/ t9 a4 M
if((fd = open("/dev/mem", O_RDWR)) <0)
, B. T- C9 y0 B9 ^9 p. ?& C
{
2 }9 x; O- O* L# J h' P' x. t, \
perror("open error");
; f: }: \$ l: g# B7 |+ ~& O6 a
return -1;
' n/ J3 e6 R! q1 |
}
* i f8 ?0 n9 w1 T
1 P" X+ Y5 m! F
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 A' y+ u1 Z# \; A
5 @4 x, r% i) ^- k# l) A1 a. C( f
while(1)
5 n7 Q5 d" ]2 L; f5 X4 D9 Q. u
{
4 Q- f/ A0 l1 i# f! S1 s w
read_MSG_buffer(mem);
- D# a) F4 J- y
}
+ ~; F2 W! _ ?/ v
}
( E; \3 i* s2 b- A1 C0 c
: Y/ J! K [; N+ y( w, y# g
void read_MSG_buffer(int *baseaddr)
l- D9 V" ^2 \" U
{
. T4 C ~5 G: ~" v
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 V1 j# R' i, Z' M7 T
: d7 ^4 \1 I$ \. q- u
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
/ s) h+ M+ A0 e- c1 U2 Q# |
7 }8 @1 M" N# {
if(pshreRAM->packet_cout != count_copy)
- G- L% H4 ^2 _1 c6 L& j% u
{
5 f* A& A4 F% ?# I. b4 G3 n
printf("a is %d\n", pshreRAM->a);
6 g0 l) b# r, p2 |8 ]
printf("b is %d\n", pshreRAM->b);
9 M, j! J- e3 \- k/ L
printf("count is %d\n", pshreRAM->packet_cout);
# h+ x1 i! m2 z6 p/ m+ K1 M0 U
count_copy = pshreRAM->packet_cout;
. S" ]" O* U$ @( b
}
3 g+ G' o0 M) b h* A
else
q3 G- R- n) J6 @8 e i4 e
{
+ p$ w1 U7 A& Q1 ^- j$ E8 y
printf("No effective message!\n");
4 d1 J& W# ^3 M$ a9 P+ \
}
9 k8 v5 X% N+ ?. O; U! X
}
. |# K9 J( _; G1 {
9 \- y7 {2 Q8 D4 Z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" s* o: x: X3 r9 R
; G1 i; Z# i3 v8 ^9 p) C6 o
& D9 ]* e7 t; w) V8 P
- M$ Q9 k9 _+ A, ]+ V7 W3 N7 A
, u! ~/ ~; @ r8 e% O V
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4