嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% U* c/ b" J# _+ H! k
& s3 e+ i! A6 {( D) E7 N) O, }
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ W, F5 u6 H3 h( t) E S- m
#include <unistd.h>
% L2 q2 Z2 T8 m2 P+ K1 ]3 ]: I
#include <sys/mman.h>
( m& F; c) y8 p# j' p
#include <sys/types.h>
. v3 t2 B% z. a5 ]$ B* X
#include <fcntl.h>
( h+ |4 R0 S% v J
9 M2 F& L* C; ^4 l3 l% u' a
#define SHAER_RAM_BASE_ADDR (0x80000000)
+ R0 N8 v: I+ j
6 G7 Q2 ^% C6 q) c! x
typedef struct
3 B/ v { i4 p9 H0 z/ K
{
9 m; ?7 Y8 |, \" ~5 k
unsigned int a;
* `1 S( N& Z; q. i8 W
unsigned int b;
2 z% A( K& ?* T, ]3 e4 Y( [- ~1 G0 V
unsigned int packet_cout;
- P* }+ \; Y- S3 m- ]
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; c) U* I/ w, c j4 h/ {
- w- d1 i6 g6 L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ g' f1 U6 ?7 K: e4 E
unsigned int count_copy = 0;
; P1 Q) c1 o: |
1 K! h+ q( I; u2 Z3 N: p* `( I( f
/ `8 d+ h, C0 V
int main()
. J3 B) v M% e
{
, @" S0 c/ O; q0 U7 A1 V# j6 ?; T
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ _/ H1 O8 ]+ K& M1 T3 q+ a
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ O! P' w( ~! u% \, s* w
" `# u; w* z1 Z$ {; b: ^+ s& t
while(1)
* ^( V8 f- i5 A$ n( l, L
{
4 }' L E3 W. o1 i- A& T7 V \
read_MSG_buffer(pshreRAM);
3 @ }; c5 n, ]
}
# Q. o5 F2 C1 \
}
' B& f3 ^1 Z$ y ~
4 x* N3 z. z" p; w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: n$ q5 w- d" p$ Z* n& I
{
0 l9 R1 i: D& x9 A! q' U* {
RX_MSG_PROTOCOL buf;
2 X, s( `5 Y# {9 _" H
7 N1 w9 B! v$ m6 q
buf.a = pshreRAM->a;
2 P3 D1 t9 r' v( c a/ q/ c! A& `
buf.b = pshreRAM->b;
8 m2 @1 l7 {. ~
buf.packet_cout = pshreRAM->packet_cout;
' h2 i$ |, o1 C/ k* {
. g0 b8 ] g+ x2 R' L
if(buf.packet_cout != count_copy)
7 k' {1 p7 n# N$ P0 a) h, O+ K
{
9 @4 h" j* @( r4 H1 j1 n
printf("a is %d\n", buf.a);
2 i* }& m3 k# H
printf("b is %d\n", buf.b);
. d c% P: H2 Z8 x" n6 l
printf("count is %d\n", buf.packet_cout);
" R- q l% ]4 k
count_copy = buf.packet_cout;
" P6 i' G) p( l4 [# X0 E7 \0 M
}
1 a$ _. ^" F5 B# t& G9 H3 {2 S
else
( \0 W. z) |7 X k
{
9 x, G4 _! w9 p! F" d
printf("No effective message!");
8 Q4 U! r; Y/ [/ e, v( d; P7 M5 h
}
/ U: R& ]! G% f* Q
}
0 m3 _9 R% j# w5 s. o. r
& [. R) q( @8 @5 B( Y
: u6 X; Y8 d$ p$ x7 }
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
_& H' H' O8 d3 _" r' i
使用下面代码,对内存使用了mmap函数后:
3 L: y* [, E) N5 C0 q" P
#include <stdio.h>
0 h0 L2 P& o$ K2 u( W7 {% E
#include <unistd.h>
$ P8 s' S4 f, I$ G% N, D
#include <sys/mman.h>
/ ^. y) E4 P2 W& v) v( h
#include <sys/types.h>
3 p0 K4 S* |3 K$ t g* O3 H. a
#include <fcntl.h>
- a% h$ z y2 k
; o3 {1 m/ ?! L
#define SHAER_RAM_BASE_ADDR (0x80000000)
- \5 w" j& Q- T% X# b
#define SHAER_RAM_SIZE (0x20000)
& O+ @( y5 t' D
0 e# J9 H. h! a2 T1 O8 Q2 e
typedef struct
0 F- T7 U4 L' S0 ~* G
{
; r) t! m5 @: N- Q7 H( B
unsigned int a;
( D3 ~+ P5 i$ w
unsigned int b;
' W# Z( Y* x8 X# `
unsigned int packet_cout;
- C* G( b$ @3 [) y5 L% T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; A3 q) W+ s1 Y: Y+ K5 }) r0 {0 v' m
# [3 T& k: ~; s$ d
void read_MSG_buffer(int *baseaddr);
& j0 T+ X: R; F2 R' t
unsigned int count_copy = 0;
) J& E- K9 D" b* o p) P
' b" }1 ~6 J1 T* _2 k# \4 c& D
int main()
% W3 U; [- a: E" P2 D3 N) L
{
$ ^. E8 S6 W) q# y' ?( \* [
int fd;
{/ f" z. A! n' X
int *mem = NULL;
g6 o+ V$ {0 X5 C ~
7 z5 l8 P# @% T0 |1 l# P
if((fd = open("/dev/mem", O_RDWR)) <0)
! @4 N, _6 N6 A$ d) k4 X/ {4 R
{
0 J: k! I6 q7 m1 s; u( x4 g! \
perror("open error");
/ r5 m7 C$ [+ i, J9 X: P6 L
return -1;
2 z; G/ T. Q+ e8 Q# M- `. }% d
}
f$ B" u, A: R
+ J/ G8 W! }6 k1 g
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 i' Z( O% M4 e3 w
+ g8 z' g8 F/ g1 h) n; T7 x
while(1)
# [& j$ P$ S2 E8 V
{
6 a( }1 K5 z: }3 g' H
read_MSG_buffer(mem);
9 G: g4 }0 J$ t5 O
}
) x3 R% Z( e1 X6 ~6 ]; B' A
}
7 j, |8 Y( Z8 s
- A/ f8 E' j+ @7 l( U8 b5 T2 S* j
void read_MSG_buffer(int *baseaddr)
( j6 C8 ^' m0 }$ S% ^' P
{
7 d4 ^9 G0 H. e& [, W
pRX_MSG_PROTOCOL pshreRAM = NULL;
% H$ q' R; D! U# y5 W
7 S% g8 b T6 j/ Q4 i
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- r+ ^7 |6 Z; t% E6 T3 ~. j
1 K$ Q u; ^- @ w
if(pshreRAM->packet_cout != count_copy)
( z* s* k0 u+ u6 X) q1 m
{
1 I8 s, W3 w0 U F) A/ N4 a
printf("a is %d\n", pshreRAM->a);
) C. R9 W+ B+ c7 z. P& U
printf("b is %d\n", pshreRAM->b);
6 j$ ~3 B3 @( T7 l
printf("count is %d\n", pshreRAM->packet_cout);
7 i2 d6 r5 K' t3 L' D" @
count_copy = pshreRAM->packet_cout;
7 t X# t2 S j
}
/ C# R- }$ O0 O* c' q: {
else
! E- d% O6 y z; Z5 J: T
{
' C$ M5 K: ]$ _! L5 b
printf("No effective message!\n");
6 h5 U y3 X" c' \4 l L
}
+ N; x, z7 d. i7 q6 f" a
}
. L8 d) e: i7 d! B1 W. O
% d/ J+ q! r3 `$ L, \2 I, ^
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! F4 @' c, L/ F5 t1 t% U3 e
) c3 O8 D7 I* M- a
' M' P# c# P# U) w, I( u
+ U- P$ [/ h8 n2 Z1 \$ M
; Z, t3 z. L B! U- |/ Y% w
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4