嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 }1 O' x) M; F/ n2 F
. {: S. @! H9 ]" m7 G# ?
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
\. {) \; H2 \) |0 G$ Z
#include <unistd.h>
& v# K4 E- q8 `, D/ e2 S
#include <sys/mman.h>
- T/ w" ^8 l# @# S; M0 E$ l
#include <sys/types.h>
1 Y$ ?" e0 C3 S! h2 X
#include <fcntl.h>
( d/ E V5 _6 f& d$ H+ b+ U3 g$ j
+ W+ X, C, f) ?! c6 I& y$ d
#define SHAER_RAM_BASE_ADDR (0x80000000)
" S2 E, \2 U+ q% }8 J i* E* c4 K
7 c/ Q% ?% k6 R
typedef struct
8 }+ y2 L- e4 W1 S1 V1 K
{
" `3 l0 t& Z7 c9 P' U3 P0 R
unsigned int a;
, Q& Q* L4 f1 X
unsigned int b;
6 q0 ~ R- t3 `2 X7 f$ z
unsigned int packet_cout;
& l- ]: i. I1 n' I
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# H2 Y# n* v) H* e
* t U+ W1 W5 x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" O2 T4 D- F z# ~
unsigned int count_copy = 0;
1 p* h/ r2 I! I& b& k4 s
( ]- E8 Y" |2 e: \
8 ]9 b3 k- L M: j
int main()
0 W; X- A# W$ P; d) O) \6 {9 _7 g
{
{( W% H. S0 I. W& L
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 Q. V% R5 N4 z- n5 P
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ e; [1 g3 c. O: L5 G& X
3 S7 ?4 L( w1 ~8 A6 D6 x3 O3 D* H
while(1)
3 X# _* Y j) z; [% W$ G4 T
{
% b& x1 N. ~+ p8 X$ k# F" H
read_MSG_buffer(pshreRAM);
! D( C: r# a ^8 l6 W) _% C+ Z; y
}
# e) y W, ]1 s* N' }# G
}
0 y3 o. e- W: \* V- ]$ G! i3 E
* o; u0 |+ ^' ]9 l6 Z. i
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: P: l& p; U6 ^4 C7 g2 P% ]! k
{
9 K; Q5 D8 J. ?. [
RX_MSG_PROTOCOL buf;
7 @3 l7 V! I) d" {
" ]/ {$ T# g9 R8 h( N2 G
buf.a = pshreRAM->a;
: x* o" n: F E- s1 c5 J
buf.b = pshreRAM->b;
; \3 o; Q/ P7 q2 w3 g
buf.packet_cout = pshreRAM->packet_cout;
; R( z/ }& e. I! b2 e+ S! o
5 o; m( i" K$ s7 p) ^
if(buf.packet_cout != count_copy)
/ i$ F. K0 Q: q6 y/ p0 [0 @1 u
{
) q) f3 W; }0 Z5 A8 Z7 d
printf("a is %d\n", buf.a);
* C/ s8 ^ V# O9 U. v* m* Y2 C |
printf("b is %d\n", buf.b);
* ]* a) ]- Y+ a
printf("count is %d\n", buf.packet_cout);
$ R& v& j# M) ] o' `( c% R
count_copy = buf.packet_cout;
( u, g& I# `0 b& _9 t5 v/ {" M
}
0 i% J7 q! z4 |
else
4 R: h/ d9 t& P8 Y2 J
{
* S/ X) I! ~8 ?/ {; ]
printf("No effective message!");
P+ J9 v. _& z; O9 S1 Z U5 N
}
; d3 Y5 }- _/ k: F* u
}
* ~& S9 @5 o \* `: E' U
: o* C- l+ m2 T4 ]+ @
* y5 E% v- p: E& z: C
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( f* o3 U) g z5 X) Y/ H7 b+ |! }
使用下面代码,对内存使用了mmap函数后:
: f, S0 \ R8 t# v7 `
#include <stdio.h>
+ g4 _ @2 N/ H' e
#include <unistd.h>
8 r( Y% e. Y3 E% o2 q" s
#include <sys/mman.h>
; I5 v6 E% k8 S* H) _7 d! o5 r
#include <sys/types.h>
. e# Z3 u( E# X6 |( T# |/ |1 ]- z
#include <fcntl.h>
" }1 ^" @7 D: }1 r
8 g) i. L& i5 E3 ~$ ?# v
#define SHAER_RAM_BASE_ADDR (0x80000000)
- o$ P& k( J: `5 C" M4 D0 g
#define SHAER_RAM_SIZE (0x20000)
( n8 ~5 ]/ s# K: j
0 o7 z$ q9 E7 @
typedef struct
_* a- Y! i; K+ n0 \/ x/ b$ I
{
: ]* ~9 E( E9 ]
unsigned int a;
* U/ P: X4 e/ R6 q0 E& _
unsigned int b;
1 Q8 l& L6 D3 a9 y& h
unsigned int packet_cout;
* I& q, \ L% E! }* k. k" S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; x5 E- m6 y3 Q/ L
# \, E7 H( q1 r! H q/ r3 W" n
void read_MSG_buffer(int *baseaddr);
" W( f u' C% s) _8 {
unsigned int count_copy = 0;
" U1 Y$ C1 j6 F- M9 s1 z
5 Q; A* h+ r* S9 N. N0 `; ?1 M
int main()
% P0 T. g8 q; A( S4 u
{
+ e9 |8 [7 y1 w9 V% ~3 R
int fd;
. f% d0 E! T3 Z) D5 _
int *mem = NULL;
" x# ^! v% H+ i/ K$ {- t8 T
) ^/ D& B9 p3 C5 d
if((fd = open("/dev/mem", O_RDWR)) <0)
* s5 V1 D, t) u0 K% k* F, N: E
{
% V' e, _ B" Z
perror("open error");
# h% @. s2 C& U5 n$ w- A
return -1;
0 ?* o+ m& F( X4 m: Z
}
/ J( a2 K2 W3 W1 @
& J# k' f+ c1 s& r
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 h4 E0 M, ^' Q+ w
$ ^- Y- T$ G F3 L
while(1)
k; a* g* j1 r6 G; A7 p& R
{
3 \7 _5 x8 H; e
read_MSG_buffer(mem);
h5 i2 c+ @9 K0 [# ^/ ~% }4 v
}
3 ~6 v c8 H4 _6 E/ ] ~
}
9 D7 O5 ^! {9 }: B: j
: _/ y2 ~3 `! u# P8 @
void read_MSG_buffer(int *baseaddr)
/ ` ~. n( e' ]3 x! U7 {
{
. i# f( ^ E& j; @" J
pRX_MSG_PROTOCOL pshreRAM = NULL;
! n+ r9 P C: F/ S1 E
$ ~* F5 ?$ r$ @# d$ ]6 ?6 M% i& Y
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. G1 `; n L& K; [3 x2 U1 {1 J' M
! y/ x1 s* q" _; W- r$ W
if(pshreRAM->packet_cout != count_copy)
4 S1 F% Y& x' F/ I9 B# H
{
9 \7 o1 A# R9 ]5 B" t) V6 T
printf("a is %d\n", pshreRAM->a);
& }3 F+ I0 D3 A) P. Z
printf("b is %d\n", pshreRAM->b);
9 j7 P+ Y- O4 s
printf("count is %d\n", pshreRAM->packet_cout);
$ a. D, O# n4 Z) Q
count_copy = pshreRAM->packet_cout;
7 m' p# @. B+ t- y
}
6 |2 Y' N6 k( k6 a% h0 {: f' |
else
# ~" c2 g, S- S4 ^
{
; X) Y; c' I4 h0 c5 t4 ~8 Q c( e( u
printf("No effective message!\n");
$ Y, T! H* ?. n
}
0 o" m8 t8 q) }4 ?" W2 {! `2 i
}
d8 w1 i& Z2 E7 _/ G/ J2 m
9 `) L: [* ~+ @' p* x0 E' ]) @; o" c
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ h+ T; c: A F7 }. l6 C; y+ O# a; S
8 U/ w- M2 ]; ^* k. Q+ T
8 H- W9 V! g3 w* M# x ?
+ T: `; @2 ?3 ] \- ^/ t4 N0 a
" p9 V" J/ P, n
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4