嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& o I; K) @* G# o7 z
9 z/ A% k w @, {2 a+ d
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) r3 t6 l4 M" _& P ]7 o7 W
#include <unistd.h>
" q4 R% y0 W0 ^
#include <sys/mman.h>
" t; `0 j' B% c, `) @- R
#include <sys/types.h>
& n$ o8 ~ \$ N, c
#include <fcntl.h>
' Y3 y" O6 W7 U; y4 T4 W+ t
7 b) W. q) W; b" S' [3 P
#define SHAER_RAM_BASE_ADDR (0x80000000)
: q4 v% g. T" ?2 X: P
( A1 E# s& ~) n; C
typedef struct
1 ?' p J5 ]! d
{
' T' f/ s) x* R9 [
unsigned int a;
% ~$ t8 t# b6 `$ K# J- D
unsigned int b;
" {2 _/ t, J A3 o
unsigned int packet_cout;
( s5 Q2 B T0 v9 i9 j4 Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# F* H1 y. d+ X2 a* u5 U
+ h4 s# E1 h; h# v: ?5 N9 A8 |$ G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! P; ?+ j$ L- N% Q
unsigned int count_copy = 0;
. a& g1 z9 L. r
% r' I6 x) k7 k; o& ]/ k# B
: p7 r+ H% n! [3 t! Q
int main()
. ?6 ?4 t% `* W# I ?* R7 T3 C$ @
{
1 O. p; R* V4 p# o& ~2 B8 R& @% V
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ [2 j9 |" H. E6 {( L
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: E, i+ a7 z T8 H
9 y7 q, t0 I3 [$ ~4 O. j" v
while(1)
& y2 a; Q" m( A; O A
{
* A+ X( f/ S3 Y
read_MSG_buffer(pshreRAM);
& D6 d, Y' x% h Q: r
}
' Y* s4 g) _: l) R) o
}
6 |. d! Z& q ]2 d* e7 ~
( g" Y( ]% o) q4 Q' m7 A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* u+ W5 L7 z+ g/ Q5 S
{
$ k" K" ~3 d9 _1 c
RX_MSG_PROTOCOL buf;
) b9 J2 M! X6 ^; `- V& {
! p0 t5 i' y) p9 w! c% p# \
buf.a = pshreRAM->a;
4 C0 U9 f- t8 l& \! C0 C
buf.b = pshreRAM->b;
: ]9 p0 \* O5 |- F
buf.packet_cout = pshreRAM->packet_cout;
! m" u$ z2 b3 }/ w' D6 Y- z* A3 F
+ j0 B0 m- }. Q3 x$ R
if(buf.packet_cout != count_copy)
) R' m1 y6 S2 L$ [" i' m
{
7 o* d( j I7 b. G" y8 _" Y, f
printf("a is %d\n", buf.a);
7 x! R [; t: h# m9 K9 h( @( m
printf("b is %d\n", buf.b);
* S5 M2 I e X; R/ e& j
printf("count is %d\n", buf.packet_cout);
/ E$ o& L" z8 r" d
count_copy = buf.packet_cout;
1 A, U7 x: m u5 u7 w! ?
}
: q+ [& {; {3 v% ^! i6 [ l9 G: i
else
1 ^, S/ r3 \' _
{
, B0 r9 S% W- B4 t: p
printf("No effective message!");
9 z& Z# J! E7 V; j
}
9 r' [% \ a4 D: T
}
2 L) V8 W2 J8 ?) H! I4 O' N" o
0 k5 n/ B3 R2 S( h7 D5 B" g% {8 v
) R# }/ b' M+ i, X' K
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 A) ]4 m; E c$ X: G7 {# V
使用下面代码,对内存使用了mmap函数后:
- s4 z8 K" M& M4 s' b( ?
#include <stdio.h>
2 ? n5 C+ s: C* ]& \
#include <unistd.h>
$ N2 a- M) [: Z
#include <sys/mman.h>
1 g; S$ z K) O5 _9 _
#include <sys/types.h>
" O, ?1 N4 ?+ _5 e; r( p3 D
#include <fcntl.h>
0 g; |! Q1 O' O6 d1 d c
y" y: E3 X# k1 c6 J' o" L
#define SHAER_RAM_BASE_ADDR (0x80000000)
$ @. G" X; x3 U* z" R7 ^
#define SHAER_RAM_SIZE (0x20000)
9 g( e. n; k- K( G
% d2 J% i+ P7 Y0 B; u
typedef struct
* r8 Q* b4 F/ [3 T
{
5 N4 @" ~/ ]1 N: D! p2 S
unsigned int a;
0 v' v! V3 x+ S8 c' t# f9 m8 Z
unsigned int b;
! M3 ]9 Q% r& k4 H+ B
unsigned int packet_cout;
% X8 z. j8 Q6 l9 `
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. z4 K8 |/ x V# b/ @
& H0 m$ }- d7 f8 n
void read_MSG_buffer(int *baseaddr);
5 ~6 X/ j& k( r: r2 ]
unsigned int count_copy = 0;
0 Q O& E7 R- b1 }" t/ |( j9 n
, J% D/ U. J( [6 H2 V2 ^9 r
int main()
! z- o. @; r4 a, X @- N
{
8 S B) d8 W! _& O7 l2 ?/ K' |% m
int fd;
, j% s& n# D5 D* A# e# n
int *mem = NULL;
6 b& X! a0 v- x) t
$ w9 }6 M' h3 [8 z
if((fd = open("/dev/mem", O_RDWR)) <0)
6 y8 f4 {6 }7 w& m q% |7 D
{
/ {; A& U$ n" W7 O% l
perror("open error");
( j2 G. g6 {) I: Q% z2 _& g
return -1;
! N* c: c) i7 Y
}
& Y3 A5 A% H" Q1 `' W
3 | t- F% p2 s9 p
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- g# H% c* y0 B$ R; W, ^: K
$ q* Z- |& `, U9 M) q
while(1)
1 x) Z3 {& }) `/ f( K. S, e9 Z
{
d$ |! p, {% B6 m7 H
read_MSG_buffer(mem);
' f+ Z/ H, K- h3 ?
}
& o, M: z) M. b4 A( x
}
( \. j- i$ p# F
9 i' d) F" A0 h5 c
void read_MSG_buffer(int *baseaddr)
9 D. H9 W# t/ e$ E) F
{
& X, I) l5 b: R, u$ E) V8 M
pRX_MSG_PROTOCOL pshreRAM = NULL;
1 W& B3 {1 z. W
3 \: t, x# [8 t4 G* u+ `5 ~& ^
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ h' w4 A8 ?+ i9 q
" M# t+ F! b1 w( g+ I9 d) c
if(pshreRAM->packet_cout != count_copy)
6 J" \# J: t# F# K4 D3 h2 {
{
* a- H V! n! h2 A; ?* m% c
printf("a is %d\n", pshreRAM->a);
# Y C2 F9 |1 m) b4 ^/ ^2 O
printf("b is %d\n", pshreRAM->b);
1 B/ f2 e# Z/ p) u! C$ i3 O
printf("count is %d\n", pshreRAM->packet_cout);
' c" q: z1 j' I* R% s8 K9 s
count_copy = pshreRAM->packet_cout;
( V" t" c0 K8 b, d% \* c
}
5 B* b4 B! _+ L+ K
else
4 F: d1 d4 P& s) ^- p8 k& V
{
" {0 e# F9 O a! A E/ L
printf("No effective message!\n");
% {- ?" I$ q6 R' _4 W
}
$ H/ C5 E5 S7 m4 G b% g( y" M
}
7 V% ]- d; Y7 V8 [
0 m, z/ P) N9 v9 L7 ?5 L
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' k: a- c# Y2 A
- c( F! M( V W0 H/ j
; S+ k5 g- ]/ g4 i# K
3 U6 u) g, i" e! X% W ~+ j
6 k$ h1 i: O$ `1 i2 `
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4