嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 a. n' n9 H7 I! B$ B. e
. {3 v% M- X% k, Z E5 D) }, x) E
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 S" x5 Z9 }* y& N( V+ M
#include <unistd.h>
; b6 Q! {# w3 [6 s5 K
#include <sys/mman.h>
$ W( P7 ]% E2 z' e# i
#include <sys/types.h>
1 q! [4 y; O ?
#include <fcntl.h>
; C- g/ F0 a3 N5 ?" B% w
7 x+ I- U. t( C" X+ g, Q4 \+ F0 r. H: z
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 u# Z K2 W( z) E
7 P3 b' f2 C8 D
typedef struct
& g* \9 _; R5 `* G5 ^( s- m& h$ Y
{
( j) r3 @# R5 ~+ Z( u
unsigned int a;
6 G: Z3 ~0 J% V* i/ Q7 N
unsigned int b;
- ?, t+ a: O% h. X/ F7 B& |
unsigned int packet_cout;
+ `, T! }! S" O0 x
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
l( K& u" [, t6 k; f
2 \; Q6 }1 E9 m! m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 x! b' |$ E1 W2 D$ e; x
unsigned int count_copy = 0;
- C2 f8 J3 a4 Q. u
3 E; f5 Y3 k: W. A5 z- c
( D8 Z( Z# a, m! Q
int main()
; ?! G! T0 T( w1 ^1 c
{
: Q3 L m F. j: B7 Z' a
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 {- x6 Z/ I6 V0 k2 n' J+ c
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ y, r! e% e f1 m: t8 {
( |, v6 u9 w( w+ r
while(1)
+ ]" P! V- \! g, m2 x, R2 z3 i8 e m
{
& g) C! J N2 B& M3 F* I+ }: I3 P
read_MSG_buffer(pshreRAM);
- O# ]' K0 M( q- P. x6 V, ]
}
7 s) O$ c7 a6 I0 e8 ^# L9 g
}
0 \7 b& a/ U( y! T
" N2 G, _" N1 k6 t C, |3 y' |
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- }8 N' _- ^$ a+ i" ^; B
{
$ J# K6 q6 q( X( z% o! O( I
RX_MSG_PROTOCOL buf;
' h* ^; u" {- z
1 H- A# K. E+ \7 d/ g( e. `
buf.a = pshreRAM->a;
, `+ j: }' S3 Z
buf.b = pshreRAM->b;
" o" G! p" J2 V* y9 [
buf.packet_cout = pshreRAM->packet_cout;
* [5 h: x/ X* _7 m
8 z0 j, w+ ?4 S$ s
if(buf.packet_cout != count_copy)
& ~# a6 z+ t2 Y( _" O7 z5 Y/ S
{
5 b7 O. w V1 u3 y
printf("a is %d\n", buf.a);
t# m6 a- q% c1 |
printf("b is %d\n", buf.b);
/ F9 E' Z9 L- }( Y4 P( q' K8 Q
printf("count is %d\n", buf.packet_cout);
, ]7 H6 j$ `% U
count_copy = buf.packet_cout;
9 S0 S4 E# t. }- U6 T5 O7 ^" s
}
9 \0 S; q! A4 y; H: h% _6 u
else
# l% u; ^' _; V& h- G+ [( N1 h; r* Z
{
- {1 j6 ]5 L5 u7 P8 a4 {1 A
printf("No effective message!");
# q# m& ]# w* |( r w9 S3 `; c6 g
}
& J G) l7 V8 ]8 ]# x3 h8 ~& b& y
}
' B8 K2 v- v; p
$ O; D$ L: r$ a
1 @$ L9 R4 T' ~1 Q3 B6 C6 k
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ e; K3 e# \! `* E; [
使用下面代码,对内存使用了mmap函数后:
) L* R: ^& Z6 C1 @% {, |7 e
#include <stdio.h>
5 H5 t, s) _% ~) W
#include <unistd.h>
0 [( H( z, p3 {3 _% s8 t8 _
#include <sys/mman.h>
" ~9 V: b/ t( z# j$ Y9 o* b4 y
#include <sys/types.h>
" T$ G8 u5 u/ Y1 |
#include <fcntl.h>
& F z. m2 y* |7 y& y6 ~
* U p4 P! @& ~- F2 b4 \4 n
#define SHAER_RAM_BASE_ADDR (0x80000000)
P3 {" _ L ~# `# ] D
#define SHAER_RAM_SIZE (0x20000)
: r! c% K0 M3 w3 u7 Z; B$ M
% p* m# {; ]1 \ Y
typedef struct
# B3 e3 W) r/ a. f7 e
{
# A2 g5 }9 n+ N+ C6 }5 P
unsigned int a;
$ D3 S* D5 Y% t, R0 l! D# ~& r
unsigned int b;
/ P4 Z3 I+ N: }. q
unsigned int packet_cout;
: V) J5 k. V' X3 ~0 I+ T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
l, N; H+ s: I$ L/ G* N; z
3 ~: l9 N+ Q; k' I
void read_MSG_buffer(int *baseaddr);
~& b. T' {& z6 \6 k; t
unsigned int count_copy = 0;
0 }& v9 n, J/ d
6 r% {2 e" [6 Z# J* m$ D, X' Q0 d
int main()
! S! j9 j/ x( p$ c0 r: ?$ o! Z
{
* n5 p4 d6 t2 x$ C
int fd;
- q0 j2 r$ ~/ C( U$ `/ [
int *mem = NULL;
& |( W$ \8 M1 s( x
9 `) x+ K$ H4 _9 t; C4 q" U' m
if((fd = open("/dev/mem", O_RDWR)) <0)
; E1 V* g$ P: K# \! C f4 d& h
{
5 N+ C$ B$ W7 g' g$ J: w) X( L/ J8 Y
perror("open error");
$ e5 D* E+ N) v) ?
return -1;
( j) D$ q, Q$ q
}
$ O3 A1 V% p% h* y0 K3 B- d
) O! Z: V, i) G& b0 H* `
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) ^$ b+ [; K$ C$ H3 E6 D
; H U; y" U3 V4 y
while(1)
, r) f. g( T( B* R& v! C* v( v
{
4 H9 R! d& w0 ]- B: q W) j
read_MSG_buffer(mem);
$ K5 \1 | x, Y* N7 l: J
}
3 R: J- A% @; g) C! I, q- U
}
( d7 i( M+ G2 P7 L% D
( @8 a3 _9 s& L' U; W
void read_MSG_buffer(int *baseaddr)
8 {5 U A( }. |6 ~( ~6 ^) P+ o
{
: ~5 b$ X5 A+ f9 A) m; [# K
pRX_MSG_PROTOCOL pshreRAM = NULL;
' F) N9 i" O& R, v/ F6 D
0 n; V; M2 l+ t' A
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 R, }. V8 h _7 C& p( ]+ K
4 B# E2 d6 x1 Q$ j
if(pshreRAM->packet_cout != count_copy)
1 q8 O2 ~) n1 X% {5 Q7 f9 h; e6 w" `
{
% T" n4 ?" c& ?& k
printf("a is %d\n", pshreRAM->a);
4 y9 c3 Y; f! l1 [2 x3 h& J7 Y* Z
printf("b is %d\n", pshreRAM->b);
4 U0 Y& f& ~! x4 m& g
printf("count is %d\n", pshreRAM->packet_cout);
! W; p: R0 K3 v% |* A; U$ N* L
count_copy = pshreRAM->packet_cout;
9 s! k- Z: J) I% z5 D
}
; M$ s" B: O6 Y) b/ j! ?# |
else
2 m8 B8 T$ h5 l9 C7 S! Q! N
{
, }7 ~- P6 x; J7 h B1 Q1 H# Q1 m9 o
printf("No effective message!\n");
2 y7 F. p Z M1 n* P/ ^+ G
}
2 l3 A- O9 G# P5 S: T' f
}
9 P3 o ^2 X6 m( n' {
( T1 h3 A. _2 k7 C/ |+ D- ~; k, l
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 t% \7 Y6 e9 _4 ?3 [2 x
1 t6 L% ^9 H2 i k
* @# P+ F; l* A
. U* e7 h. H7 v) Z1 I; O, h. g$ q
! G8 _- S, O1 W+ T1 X" A& g% ?
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4