嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
; z4 ]' T- Q8 @ x2 ^
- [" K$ c" R' s6 B8 L% a7 x
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
Q6 G. K7 o; N0 a+ ]2 V9 F
#include <unistd.h>
w& V- {- f+ _
#include <sys/mman.h>
" A$ X: T8 f! j! w; a9 Y0 p
#include <sys/types.h>
7 Y5 J+ W C2 M0 R' B1 |) E
#include <fcntl.h>
9 j5 Q W0 h! I8 g& @$ E/ p3 Y
3 J+ w" R2 l0 a. o0 Y9 Z% H; l$ {
#define SHAER_RAM_BASE_ADDR (0x80000000)
: [9 u; ~% W* S- n( N1 N* x
$ l" K2 O9 |% Y* ~; X. _
typedef struct
4 U' O) h) m% Q
{
& d: }& U+ T; T g4 T
unsigned int a;
$ P3 C! i% z8 _: i
unsigned int b;
1 P6 o5 b/ R/ ?% L2 Y$ A/ N
unsigned int packet_cout;
! L5 [# G) B; b x/ n3 b1 J8 Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" a9 l% \+ T9 v8 ?2 D3 }* `$ R% v, Q
; s2 O; _( G4 u
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, b- Y( g# U/ G; x7 ]
unsigned int count_copy = 0;
7 P0 {' e) }/ F, v: v% V% C
6 c3 Q: w; }3 X% {
) h5 u( e1 r. m/ l3 z
int main()
4 z3 F9 K2 j& v: ^" R7 Q. T- d
{
) [/ o- T- h9 [. {$ @, ~0 ^2 ~# I
pRX_MSG_PROTOCOL pshreRAM = NULL;
6 s% X+ U, W# u! |9 G) B M# ~
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ S0 N, K" y# T+ _# S( G( s
- u S! ?) r- H- H' k
while(1)
* b* k9 h0 O/ P' E- |' l7 d
{
8 a+ L; ]9 m* w( p; }
read_MSG_buffer(pshreRAM);
4 G, v9 Y) g1 h
}
3 l0 }9 f" @& K2 t+ e$ i! X4 f
}
5 T; y# |; q) @. x
6 P7 Q) Q# a3 }) ^1 F
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
2 I3 `4 G) x$ X: u& d6 c* l
{
" H, @" t1 u; X
RX_MSG_PROTOCOL buf;
/ Y/ q6 j) }9 X* i* ?( |- q
5 B: U+ B" g' H
buf.a = pshreRAM->a;
/ y, L, p L1 @* e- j7 ?
buf.b = pshreRAM->b;
/ p2 T; x' k$ q. W
buf.packet_cout = pshreRAM->packet_cout;
* m' [+ R# A! F0 y2 {
' i# `! p" K( L; C2 {
if(buf.packet_cout != count_copy)
/ Q6 V+ i- z8 O+ t' j" X
{
: n6 ^' `; s; O4 e0 |, B
printf("a is %d\n", buf.a);
% V8 s8 W) t+ P1 s/ k. D
printf("b is %d\n", buf.b);
+ Y6 y/ V% H% O5 F* h G+ o
printf("count is %d\n", buf.packet_cout);
4 x7 ?: j5 D: E
count_copy = buf.packet_cout;
% W" r6 b8 R0 V' p8 @- }
}
8 N' h) W# ]+ Q
else
, c2 O- {- }4 b6 ^- }
{
; l7 X8 U7 R* ]5 [2 X1 M2 i
printf("No effective message!");
Q. S9 O+ q! W4 h% c
}
! O4 R+ R9 C! k; |) ]/ d. @
}
h) o+ _" x6 l z+ Z
7 e3 h; W/ ^% A7 G( R3 T
" ~8 s3 i8 [! v$ \
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* P3 m B3 p1 P/ |9 Q
使用下面代码,对内存使用了mmap函数后:
- S, w+ m* ^0 n; g! u
#include <stdio.h>
$ h% t$ o8 k4 V
#include <unistd.h>
* y9 S) Q8 E M6 r4 s4 R- _
#include <sys/mman.h>
- y3 l, A, R# P
#include <sys/types.h>
; [7 L8 R- d; G$ h. G( ~: `' \
#include <fcntl.h>
, y, g0 Q4 u# k- J9 ]) A0 A& h
7 N0 u4 i, j2 E. P7 l4 A
#define SHAER_RAM_BASE_ADDR (0x80000000)
4 p# n; [6 ~2 G( M7 ~
#define SHAER_RAM_SIZE (0x20000)
- U8 g6 x$ j) Q* X# l- T
% J* _) w7 h6 {. V( _$ C9 o9 f
typedef struct
- ^1 B( R1 V) r8 a; |# E0 {# O
{
$ o1 F) |# g e' N
unsigned int a;
2 X T) h- k0 j5 L" h/ b. W' D
unsigned int b;
! A+ a0 p6 [2 T6 B( a7 L, ~1 N
unsigned int packet_cout;
; w4 l' v( X" ?6 U3 j: h+ X% _% Y8 f5 K
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 a$ h- F( V! a/ }$ z
8 Z ~: f$ k' v N( G
void read_MSG_buffer(int *baseaddr);
! s7 M0 z. e. r/ J
unsigned int count_copy = 0;
5 M& Y* }! p0 D( f! ^
8 A$ @. d8 v1 N* l
int main()
2 H7 j$ J' e# P' k% v; p B$ b# P( Y
{
. j* H& c0 ` J4 z& a$ R
int fd;
. {8 M/ j& [1 ?6 h* _8 }
int *mem = NULL;
8 s, k& q4 G! \% @4 x& o5 W! \
$ T/ L$ q7 U$ j/ v/ x: R
if((fd = open("/dev/mem", O_RDWR)) <0)
+ s- X; H) l' O- R9 L) ~4 A" d
{
0 B: Y4 Z/ z8 D. Y1 }* E' |) {0 a
perror("open error");
! w# M( |5 Z6 m; q8 W7 j
return -1;
% w8 H5 E/ ^% G H
}
" K2 L# d! ]4 f9 ^
2 A" r4 n1 y$ P' e
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
$ z& H5 z. R; {/ ^3 g* i/ s
3 @/ d9 z4 W, |1 f6 u8 @; w5 f
while(1)
% ~. t3 G* s) W) M! _7 E" \/ d7 i
{
2 [# o9 ^ C- N$ F& }2 D: q
read_MSG_buffer(mem);
. G% {+ e" h- z$ N; @3 d0 d( Z* C
}
% P# R: C7 P2 p: j9 X
}
6 m& @ a# p+ u" D
& n! a7 T* k/ H6 Z
void read_MSG_buffer(int *baseaddr)
: B9 P2 T% B' C* ?& U
{
3 ^- ~) |& Q- F" Y
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ }! G. B$ n, i7 q g1 u3 F, W
5 @/ R/ C2 \9 R ?5 d1 K- m; V( ^
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ l( N4 d; B; V- l
" H5 w# o3 Q3 t6 _. Q! y* G" A( {
if(pshreRAM->packet_cout != count_copy)
" D0 |( e; Q$ g: c, M# J4 Q
{
# h9 w5 ?1 `0 w8 o T: f* l; o6 q
printf("a is %d\n", pshreRAM->a);
( R6 E4 \: b6 `/ F: c
printf("b is %d\n", pshreRAM->b);
& f3 x% Z3 L7 K) K2 i
printf("count is %d\n", pshreRAM->packet_cout);
|( `! t4 C6 T
count_copy = pshreRAM->packet_cout;
7 Q- x1 V3 C" i* \
}
! \- \% Q4 |% C. n" j2 T
else
: p; r; T. S8 u) d- a! ^
{
/ n+ ~2 B- b9 h: n9 f; |- H
printf("No effective message!\n");
/ u# W- t$ Z" p! ^2 X% b$ |
}
( _$ z) n: L0 A( X6 r
}
% K* ^! g8 b0 L% Z
8 Y# q1 Y3 |3 l# B+ _
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. I* A6 q$ p4 \6 k
- ^0 H( i2 Y' o* R5 A) s- x
1 c! k0 @/ c, s
: U2 [- Z* i" Y8 P% G) d
5 y5 a1 r# \5 j+ v0 [2 ?
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4