嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! q/ _1 N; }, G6 U
% X; `& z5 h" G- c
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
, o3 }) [2 l+ x- ?; G0 u
#include <unistd.h>
' n' `$ _! t( |7 a# @; f
#include <sys/mman.h>
5 e8 ]' V6 S$ d* N9 B7 S
#include <sys/types.h>
i' H( [! }9 d: D$ L
#include <fcntl.h>
3 v2 }4 k M% M! \! [$ w
6 A% c2 g& G0 S1 [5 A
#define SHAER_RAM_BASE_ADDR (0x80000000)
- l. F% a+ j; o
5 ]6 R1 }" Z% o# [: m2 z
typedef struct
2 n% g/ k+ A9 `$ G5 s8 i& q: S
{
+ D1 {! I2 z# i! Q9 Q" n
unsigned int a;
+ M- y/ A" J/ K7 N
unsigned int b;
8 |- M- c9 y. H D8 J
unsigned int packet_cout;
2 O/ e* }( z& E9 o
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" V1 c% K5 \! G) J; [* M$ V
! i) e1 ]* U6 Z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. X9 c2 M$ Y2 z: u
unsigned int count_copy = 0;
7 J4 E0 }; [) f3 O/ ]7 }
4 ?" e X& w& b! A" m, \
; Q8 E# ?9 s. y- T6 F4 B( X
int main()
. ?& M. X& C: p8 l# S
{
: x1 J) @' y/ A, ^) r3 L0 H# g. y* I3 I. T
pRX_MSG_PROTOCOL pshreRAM = NULL;
& T4 W2 V$ C* K3 Z. Z( S
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, B5 G+ x4 m3 v1 K0 M* }8 f
& d( b; T6 O1 Y8 F* K
while(1)
; q$ I* ^' Y/ T, }' i
{
& G" d( r- e+ Y' C
read_MSG_buffer(pshreRAM);
7 g. t5 b. `( h K/ o [9 k8 ]+ a: B
}
2 P' ?1 }' U; R6 M) o7 s
}
- l! j) R/ L1 U+ D; l+ D
* r( b9 P: `' t$ S' f# i
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! z- E5 N9 I# R0 d/ x. D3 j
{
4 v6 O4 v" u% s K* \
RX_MSG_PROTOCOL buf;
1 m/ s4 R* w& I2 X* `, I6 W2 x) M
$ J% p! e/ ~1 G$ V* o3 `4 _
buf.a = pshreRAM->a;
- _6 s1 G. z2 |' L! r8 v' p
buf.b = pshreRAM->b;
. ]/ d U0 C# w
buf.packet_cout = pshreRAM->packet_cout;
2 o5 l, v$ K) s. z7 s5 Q! v1 @% {9 Y
( o5 X& t- N$ A& i( y, ~. N2 J
if(buf.packet_cout != count_copy)
- l" n! k( q8 j; k- i
{
. W, F% q7 Y" a2 W& D) L1 p* n& w
printf("a is %d\n", buf.a);
$ p/ b9 ?! B4 L9 i% z. @( N
printf("b is %d\n", buf.b);
- q( T7 b7 u, d" c
printf("count is %d\n", buf.packet_cout);
: z% G" d0 [% {/ B' k$ K/ ~% ]
count_copy = buf.packet_cout;
; v: @" B P i/ c1 x& p
}
, l: E% ~9 l7 l" w9 ?- c% R0 `2 w
else
! ~6 [/ p+ t }1 a, ^- G
{
- T6 D* |5 `5 F( _1 n, y; x) w
printf("No effective message!");
: { V/ A* `: o3 f' x, t
}
F" N" J/ C* s; N1 ]% X5 o% ~
}
) w4 Y" l9 p: b7 f
! Z& F% E3 S, b5 ? s- ]! ~3 d
( S4 w; m9 L% d' g( j; e! v3 A p
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
; _! C7 n* d/ C; [
使用下面代码,对内存使用了mmap函数后:
. Z6 {' n" z( T5 o
#include <stdio.h>
9 M. z4 L9 T; |" A- ~
#include <unistd.h>
h: f c$ K% i' J7 C9 Q# {
#include <sys/mman.h>
8 F/ z* j+ K$ R& V
#include <sys/types.h>
' Y" }( Y! l$ x% t+ w. I
#include <fcntl.h>
! h. [; e9 c% N; Y
, A" l% e5 |; \, i# o
#define SHAER_RAM_BASE_ADDR (0x80000000)
" k4 K3 \$ R# ]$ p* c
#define SHAER_RAM_SIZE (0x20000)
5 u1 R* E% v# m
& g+ _# }, J, \9 n# R9 d
typedef struct
: R3 x" C9 i8 P0 f- b
{
' e' k7 g4 f7 f( M+ l
unsigned int a;
% Z9 i* a" T9 a) _
unsigned int b;
$ w6 d* r3 w/ Q8 y% w
unsigned int packet_cout;
3 s6 M: v# e1 |8 C' Q* P2 L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 G3 V' V) i. I
3 | t% g0 H3 q! y) ^; O: l( k
void read_MSG_buffer(int *baseaddr);
% s8 i: R- f# [4 W0 [' O
unsigned int count_copy = 0;
, C- `/ l) T7 I8 x) J: N9 J
; Y5 U3 ]9 I& s% M; P
int main()
7 V. V8 p6 D: B4 Z: r6 n" m
{
! x+ [ h7 u4 q# `- x
int fd;
X: G8 {9 X* [% V0 l
int *mem = NULL;
8 h4 u! h% e9 y! A* g3 ~5 [
# g) d! ~1 V5 O4 p6 H
if((fd = open("/dev/mem", O_RDWR)) <0)
5 {+ O( S3 l$ y% ]
{
/ v! n2 z/ M5 l9 i- E$ W
perror("open error");
' \- a5 |& ^* R2 ^$ a! {
return -1;
) k+ h/ }0 Z& C( J2 o/ B, N
}
3 Q# |) C6 u5 H; Z
5 F% C) D# q; ? j
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
4 o+ x1 i+ G3 T3 U ?
1 e" f7 u L2 p! W6 W
while(1)
& H9 O1 ~* h; r7 E' ?; h% ~
{
: h0 e0 x! ^" ]/ Y( g0 V
read_MSG_buffer(mem);
3 |6 @( e; i7 L% a
}
2 S" k5 \' \! X" t
}
2 G4 {/ C7 T5 j+ U2 |
. K/ G5 h: p6 c: e2 b! ]' S
void read_MSG_buffer(int *baseaddr)
1 l4 G; }+ @% S, P
{
7 Z+ d/ \% b1 U+ Q5 ^" g% S& a
pRX_MSG_PROTOCOL pshreRAM = NULL;
! p" E* Y; b' |
% H) O0 I$ j8 @) |4 s9 [
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
) \+ Y- d* t$ s0 I8 O" o! E
# M9 @0 q5 ^! w( V* j
if(pshreRAM->packet_cout != count_copy)
) \: P3 k4 y2 i, o
{
* }) J$ U9 W( M+ x' ]
printf("a is %d\n", pshreRAM->a);
; e' P# X. P4 @; ?3 o- S( U1 [1 I
printf("b is %d\n", pshreRAM->b);
9 Q2 `/ } B4 k' E' H# z& b, b/ w
printf("count is %d\n", pshreRAM->packet_cout);
& R, H( u- R/ ]3 Y
count_copy = pshreRAM->packet_cout;
# J, x" ^# O' F( h) V/ Y
}
( @4 J9 q& C4 j9 _; N1 e; [! N" g5 r
else
- u- i: t& T# h$ K& L8 u1 A$ Y; {
{
' `% [- m& a3 l/ K$ p2 {
printf("No effective message!\n");
4 e3 N* q7 }: y2 C
}
# i; L! m8 J& N4 o D0 ^
}
7 c' z7 ?# u& q% R; ~
. w* _! S, _( s% X3 F8 ^
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 ^: m) z5 k, w x. n
' d. Q$ A7 L7 r Q. n
3 R# z+ O. b+ a6 [( Y1 T/ \5 @" p
$ b: O" [4 \& l/ l" u
) S* V" d5 E' r* `& G
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4