嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 P* U# O* I, V* @4 P5 V
$ W: m1 Z q% m" A+ @
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% ?+ ^. x- r$ x$ }/ H! ^ q6 e
#include <unistd.h>
. O+ n7 b% n/ X+ F9 \0 A
#include <sys/mman.h>
$ a v6 X7 L- h! j8 ~
#include <sys/types.h>
) J9 s8 _" _. y; d
#include <fcntl.h>
6 W! K0 S9 b4 n3 m! i" f1 ^
" C& G, A8 v7 T- a! Y
#define SHAER_RAM_BASE_ADDR (0x80000000)
# t$ a5 ^5 Z& _ [: u
& }- T _# Q5 d% U4 c8 R' X
typedef struct
& E# S4 U& ^, n7 \( K
{
2 u. } c( |: D
unsigned int a;
, I0 ^, v8 E/ H& Q
unsigned int b;
- o6 J5 a) X% d) `" q$ g- E% i
unsigned int packet_cout;
5 e7 }' F' g K3 a$ _# {
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 H' N: N9 }( F* K$ I% S9 n
' [( ~; {# c( P# u Y+ G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
+ a% A' x1 |* {. l) ~6 J
unsigned int count_copy = 0;
0 X# K. U/ x9 b
7 K$ {; ` \: k4 H8 ^5 N
: V8 ?+ h( k$ m+ k, i
int main()
7 _* J* ?& K1 L3 a0 U
{
' B3 [* c& @$ P1 M4 R0 u
pRX_MSG_PROTOCOL pshreRAM = NULL;
) G" y5 X) ^- u- o1 l: U4 L
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
' v/ y! S. q' \
, }8 v7 B' [! [( L. ~1 N
while(1)
( [% |( r5 i" k x I B: ^
{
4 U. u7 y2 F' M4 w3 o0 t
read_MSG_buffer(pshreRAM);
8 w. i/ p- W- J# O' h: R- l
}
. p& y# ]% Q/ I0 T
}
- P2 [% l+ ~+ C- w
4 K+ { v$ v% x7 `! u! J& {# c
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
$ L+ ^. h- O) Q) w% i
{
8 O1 H, g8 z9 D# Q( O' U- e1 W) t$ k2 W
RX_MSG_PROTOCOL buf;
' z% k# |( J; _$ H( ?' s4 `
; p D$ h7 D8 N/ q; F* C# i
buf.a = pshreRAM->a;
, m4 X2 T5 T; F
buf.b = pshreRAM->b;
" m( ^1 o( {! c" n# k; S* R n' `
buf.packet_cout = pshreRAM->packet_cout;
$ @3 M7 }+ |# N/ X2 g
" J5 |9 X6 {. X7 {( Y
if(buf.packet_cout != count_copy)
$ B! X3 S; `# ]6 N5 r! z$ N; c
{
5 b1 U, c2 {2 R/ \8 g
printf("a is %d\n", buf.a);
* `! L9 E9 _7 y% u5 ?. j
printf("b is %d\n", buf.b);
" ]& Q# R$ F5 ]& n% B% E1 _) f
printf("count is %d\n", buf.packet_cout);
- T# h6 B7 s& M( f5 t2 e4 W/ y
count_copy = buf.packet_cout;
" B3 M% ]7 h3 V9 D
}
) o6 X+ k0 m0 V$ K+ m
else
& c. O/ z( L% P* m* R- A m/ p
{
9 G' ?5 x4 p; O! S
printf("No effective message!");
' K$ E6 O( |5 g1 [9 [
}
7 b' W( Z/ ?, I+ ^) M. C
}
' \5 \& H6 j. C* O( R4 p' [
, e8 f8 |, S3 }# t+ s' x
# t$ H" e: L2 R8 `0 @4 c/ a* H
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 W! k! L7 ? Q$ P! M) M
使用下面代码,对内存使用了mmap函数后:
% }' S5 b& `! T/ T# l V \
#include <stdio.h>
* T9 a6 A, x" V' r( j
#include <unistd.h>
! W& d& i3 s- c6 y1 k, I
#include <sys/mman.h>
" B2 g, P2 v7 X
#include <sys/types.h>
6 M7 ]' s" J& k- w- _; Y! N
#include <fcntl.h>
! Z$ q q' E$ Y: e
# K- [. t' Z' ^ s. l- k5 e
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 D- Y. @" h2 z k- E
#define SHAER_RAM_SIZE (0x20000)
' z5 J) b4 E+ t' `0 e8 {; b4 d
& c+ K. i% h0 p& F
typedef struct
# h# d% U2 _7 g
{
- s6 X6 Y6 Q3 X6 y, l% k1 ]
unsigned int a;
P+ \) |7 A$ Z1 |
unsigned int b;
6 h. b1 z& L/ U4 i
unsigned int packet_cout;
! b9 G" h8 |3 ?. ]$ W8 m
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- f9 N e# i( f, P2 H6 { r
$ D6 K5 J g% u& t4 E0 D4 C; M" W2 T
void read_MSG_buffer(int *baseaddr);
; z) i, m8 j5 Z
unsigned int count_copy = 0;
2 x) N# D% u* C' w: q% u
& ^/ F- d* L+ S) W% Y5 C; E
int main()
0 c: a" V* h: N5 d7 N
{
. W! P4 [1 X* b4 M
int fd;
# ]4 k; u9 O0 S( } j- v+ \9 v
int *mem = NULL;
4 G3 O( U @; N
2 e! B. l- p( ]5 A/ N2 M T
if((fd = open("/dev/mem", O_RDWR)) <0)
6 Z' [! l8 C" U+ s
{
& F% L3 v' a9 z
perror("open error");
+ B/ S6 T, G$ Z9 \; j* F
return -1;
4 T. h4 w* g' R/ O
}
& l' B% B2 A4 M) F0 x
1 q% ?( T; B, ]! I5 B5 |3 o" V4 j
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 d) e8 V' e5 u" M! x I
/ z- a9 V, x2 w; A. N0 X
while(1)
9 D: W3 j* C8 Y+ J
{
) A3 ?3 M1 O1 L2 K
read_MSG_buffer(mem);
0 T: q+ Q! v' ~3 H
}
; n$ q: k6 N; R
}
/ F! ~/ U+ q% Q7 W- Q* d
- O# w; w5 j J6 r
void read_MSG_buffer(int *baseaddr)
3 Z; x( c; a6 U/ U1 V0 _
{
: O# i7 @0 p2 J" Z
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 b9 s' d2 j5 V! j5 B
% X2 [8 G4 J d y: W- e) f# k5 h
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& I$ j0 m. T0 Q. y$ m s3 s5 D+ ^
& P+ Z( e: C% C/ u% f
if(pshreRAM->packet_cout != count_copy)
( o" j* T$ `) ?1 f
{
3 X6 {: _9 G" P. T
printf("a is %d\n", pshreRAM->a);
+ K+ i9 u+ Q- K4 T8 h' H
printf("b is %d\n", pshreRAM->b);
6 p7 U* ~& K; }% }
printf("count is %d\n", pshreRAM->packet_cout);
. k0 ?; \0 c8 o S5 D p% `3 K
count_copy = pshreRAM->packet_cout;
5 O1 _9 b7 x! \
}
; U. z+ E/ X+ `8 ~: m4 y! p
else
, I8 O2 {/ J: `* \; N
{
- W8 ^1 _' C4 ~( h* i# a
printf("No effective message!\n");
: j1 ^9 J% Z1 K$ i4 I1 G7 D( i
}
9 x; v# P* P" y- N |6 e
}
' [' j) A( I$ \( q! b; ]6 S+ u
5 R% Y% D6 o L% i$ }, x% G+ n2 f" }
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! i' C5 K% o8 e
5 ~* E- l6 w0 s/ P# J" ?
) h0 D1 z( J5 G% K4 G
8 C; s0 Q! H6 S6 [# }
! O/ }2 B/ E `! u
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4