嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 c5 s+ y* Y$ B) I* R0 u" u
: Y+ l: q' z/ |+ X4 F1 ?, l$ N
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ p& b7 w8 M, Q5 I5 C, z
#include <unistd.h>
% ~& N$ c4 B+ p1 ]1 C
#include <sys/mman.h>
( @* h* T d: f' L7 I2 f
#include <sys/types.h>
, \3 u" l X4 R6 e: j
#include <fcntl.h>
, _" {& I( ]+ S8 Z8 ]3 Z7 a+ D
1 q0 i6 C" c8 |
#define SHAER_RAM_BASE_ADDR (0x80000000)
: f: I) e( h7 {& X; x! {: D
* |7 T" |" |2 K/ J% I
typedef struct
# {: O- A7 l& R% j
{
, d# F: k( c6 |9 [
unsigned int a;
% s% Y, F4 x# B& j& @
unsigned int b;
+ c' }3 B6 M+ D
unsigned int packet_cout;
$ T+ K: S+ b n6 C3 D
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
}1 I" d6 i. Q* @1 f) m0 j/ T
/ X/ I) C7 N o m+ B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 K6 j0 r3 P/ ?% F5 i. A) h
unsigned int count_copy = 0;
& i' ]+ X0 [" Y/ H8 K* T
B; J+ F$ e3 t" L& V
; M: r; I4 c/ }, X! ]- Z9 @
int main()
* O$ c" t9 c+ P" K. R9 E& \7 \
{
' P" @+ `1 F* C1 t/ ~0 J T
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 u% m' |, Q" `6 _# U" z1 T
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# Z1 `1 _# y B5 c$ {& o3 k
0 e' U' }6 h) I, m9 ?+ s+ _
while(1)
" y- ]* C5 X7 Q- b9 u
{
) Z! `6 x) {" z+ ^# `6 `. z$ T
read_MSG_buffer(pshreRAM);
L# {; U9 x' a7 M
}
1 J& }# [) t% C9 {( w) u
}
. e7 `0 ?2 q/ c! n, Q
; s, F9 C) u9 `* v# Z! X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 G6 C) Q% K7 M0 h) h* B
{
! V$ `' u$ o$ \5 c
RX_MSG_PROTOCOL buf;
7 `" R7 n- e- ~" K+ K* h
' S8 I0 G" a2 F0 |: k# `
buf.a = pshreRAM->a;
9 Y- A- v4 v5 h7 a
buf.b = pshreRAM->b;
3 J& X8 {4 S4 A" G8 ~( {* @& J
buf.packet_cout = pshreRAM->packet_cout;
2 I# V! v X7 ^+ ]
! k% K T/ C3 O+ t
if(buf.packet_cout != count_copy)
0 y9 p: b" @! `5 Q, t' d
{
% F9 p- H) Q+ v
printf("a is %d\n", buf.a);
( P' j, F$ Q- j) U' f# H
printf("b is %d\n", buf.b);
! r! z4 `7 g! o6 _
printf("count is %d\n", buf.packet_cout);
( M/ W* M. s: I4 @
count_copy = buf.packet_cout;
' z: h4 I, Q7 L! e$ H1 o$ t
}
! V `' ?( [5 S3 T7 ^+ X, L- z' u
else
+ S1 ~6 }/ x$ w, G5 M* k
{
- V! }+ x. \0 F1 i
printf("No effective message!");
8 `; |. }: K9 ~6 \8 B1 \; i
}
# f$ o, p$ ^% {' B; r
}
# n+ U& W1 b! o
( D% r! o; V2 a; g {+ D+ F
- F/ z" S3 q* G% D% V: T
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
+ {" A$ h' b U7 G8 @& l" _
使用下面代码,对内存使用了mmap函数后:
- N3 g& B4 s( u3 `8 L
#include <stdio.h>
9 G8 F8 {' b: x/ _7 {$ O
#include <unistd.h>
" M# @7 U# N9 f6 V' [3 h, j$ F q
#include <sys/mman.h>
( w2 J# D' n" x& ]3 S5 Q
#include <sys/types.h>
/ c* J# ~" m: s4 S+ f S
#include <fcntl.h>
/ g4 ?* w: w9 T. A2 E' q; Y% [$ O+ f
* H9 L$ S7 i% C, @, \5 _4 i
#define SHAER_RAM_BASE_ADDR (0x80000000)
4 M% T- A8 o2 [- e- w, m
#define SHAER_RAM_SIZE (0x20000)
0 n/ {: {% [* T( O
& d0 Z+ m$ k4 F3 `
typedef struct
3 A; a9 ]0 c, @5 k4 E
{
4 \1 j- i X( S0 h' \! ?
unsigned int a;
4 \# y% z' z* D& Q6 Z$ u5 z
unsigned int b;
; n1 Z! A6 s- x/ D
unsigned int packet_cout;
) b$ j7 ?* B+ _% z9 [( x
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ v2 j" v& N5 [: X; a
1 H/ Z) Y+ S* k# ^* q9 H1 d/ Z
void read_MSG_buffer(int *baseaddr);
^: g. @4 Q5 d v( v
unsigned int count_copy = 0;
$ s: ^' |/ H) Q0 |& w
, o3 x w# z. q! |! u* y
int main()
- ?2 t( ~+ q* x$ p9 P6 D
{
: U4 |7 Y$ |5 i
int fd;
, `4 O0 C2 l8 `
int *mem = NULL;
+ w2 L3 t1 L- c" f/ D
3 z: I* y. i7 D2 u+ V
if((fd = open("/dev/mem", O_RDWR)) <0)
' U0 O$ E8 L1 k* e. y1 |/ A
{
; f2 p/ P J; d& U2 s& v
perror("open error");
1 T& x2 | h7 V- N( h8 M- J
return -1;
/ @ {1 t; Z- x U* x" V
}
+ S: ~3 o# ?" h: N
3 p/ M1 p! U8 u3 D
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 c0 T7 R2 n& B- ~2 W+ n6 x# J* I
9 N/ V# n7 K! G h: b0 K/ o
while(1)
( H9 P/ T( t+ v! I/ O% m6 S, P7 U
{
8 R3 _4 K5 \. ?1 ~2 }
read_MSG_buffer(mem);
! t. g8 O+ C2 @. k! r
}
, {) p* \/ D& |) T. T! f E
}
2 L& ^7 m W$ |0 L( M" x/ Z. s
5 |; C& u/ f0 h5 B- @
void read_MSG_buffer(int *baseaddr)
" C* C/ w- w/ m8 d
{
; |7 Q: j! O$ S. q, h
pRX_MSG_PROTOCOL pshreRAM = NULL;
% j3 m% j- A% i4 T9 J8 j5 r9 F( P
) E/ {5 X( f& [# g; x. L$ h, v: b
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 a* A0 T; V) Z' d
" ?8 h x, V4 R* a
if(pshreRAM->packet_cout != count_copy)
6 ^8 k/ g! f4 M
{
5 r) T! v3 N6 d7 u5 c+ r9 w
printf("a is %d\n", pshreRAM->a);
- B: b4 X& y J2 D: D8 ]* c
printf("b is %d\n", pshreRAM->b);
) E- P i* U# u: A& a
printf("count is %d\n", pshreRAM->packet_cout);
7 g. f4 R$ \$ R8 v/ ?' _4 ^
count_copy = pshreRAM->packet_cout;
* A2 l! n9 c U
}
3 o" k, m b- Q& j& v: T
else
! ^% ~" h, d* p) p& B0 E
{
& {( M& E- L( Q, C
printf("No effective message!\n");
# Y. B# m1 Z; q% ~/ u4 `; Y
}
* L: j5 X7 s' \: w
}
2 R$ `, x$ B5 N! m
5 A* C. b/ g/ F3 E8 ]; W: C
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 ^( g* p4 c6 Q* ^/ ]) @9 a, \: h
3 p. W' t S% b" l x
5 x7 Z+ S$ g4 m+ B2 E
7 z- H& e, r- f
. r! F$ M# d% G1 Q6 r
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4