嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 c2 R" B3 a) b/ h
9 K' k& a# ~9 Q4 N0 S, `* D- Q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* K9 Q x1 b7 W* `" u$ {# W0 x o
#include <unistd.h>
, n0 u( A$ Y: J* `* C; T
#include <sys/mman.h>
: `- Y F' A6 L" n% T F0 s0 P F
#include <sys/types.h>
, u0 z) I8 I) K
#include <fcntl.h>
& M- a8 {; v0 o/ [
, ^. i+ R8 Q7 h
#define SHAER_RAM_BASE_ADDR (0x80000000)
% j# S% S' u$ m y5 z' W
" h! b {% C' ? }/ U: e
typedef struct
! J0 y* U" ^- R/ \ A, T
{
" Z. ` V% Q! g( p+ c5 T+ V3 W1 X
unsigned int a;
6 f. P3 O" }4 e, H
unsigned int b;
7 n$ x7 @* Y4 U4 s
unsigned int packet_cout;
! Q; \& c2 X( |2 v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 J' F: O8 N" j, w8 p
0 v& F0 I9 m, u' M5 B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 }0 t3 F4 _9 p- l( h
unsigned int count_copy = 0;
: Z# B4 b; r7 d* z; [5 G% M
- c( T2 M! N! M) Q9 z
. w* o1 R6 a# B; }
int main()
! d3 H$ K6 H, A A
{
( l5 b% Y8 q5 {' g" d; I! Z
pRX_MSG_PROTOCOL pshreRAM = NULL;
! C6 Z5 H) w& i7 i- {4 o
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ u! B1 A" i: w) m
# x, p5 K: [: P1 [8 c Y
while(1)
7 F# t9 y: h& ^2 _* C" a
{
( {7 T5 R9 [& F- A2 V
read_MSG_buffer(pshreRAM);
8 ]) X) z; N3 V' B8 {
}
" M ~9 q. E+ ^ u8 j. S+ S
}
+ i" m7 y( |& L9 q7 W
* Q r" k0 e- y8 k% K u2 x* \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 n3 ?; N0 m* ^9 ~0 {0 s
{
% B* f; o: A7 D! w! A; a
RX_MSG_PROTOCOL buf;
8 K: e+ M0 \3 ], h0 l! u+ q
6 M$ Y, s4 w2 f4 q" S+ F* p' h- T
buf.a = pshreRAM->a;
' X# I% T5 S2 J$ i/ G
buf.b = pshreRAM->b;
/ Z# L7 j. ^. G6 J
buf.packet_cout = pshreRAM->packet_cout;
( s( w4 d& ~, w
+ B. a# g* B2 J) W' o
if(buf.packet_cout != count_copy)
) q% _( h, w# x+ ]0 t
{
0 I' V) X& m4 C) ]
printf("a is %d\n", buf.a);
|+ @" E/ b9 f2 |4 p) q
printf("b is %d\n", buf.b);
$ w/ l' Z, P' e J% y! O
printf("count is %d\n", buf.packet_cout);
9 B/ B& \" D! l) B, K6 Y2 L0 {
count_copy = buf.packet_cout;
9 l. ]. T% L; ^ T2 h) f) O b# E
}
8 R( B, E. w6 M$ j3 t+ N3 K
else
2 c4 o2 a1 C4 u# K5 l
{
% ~; }) ~" P. I0 P l
printf("No effective message!");
# f0 f7 B! o/ m8 @. w7 x0 y
}
& n( _7 ?- L( C8 C* B' H% b- h
}
U" O$ _8 M+ q% x/ e# r# R
, n: F0 E- R# Z0 T5 R: X& t
' ?. a( Y* j0 r4 u
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
+ j. `! w9 V+ M
使用下面代码,对内存使用了mmap函数后:
5 M3 G4 [ K/ E' |3 ~. H
#include <stdio.h>
( l0 {) p5 c0 ^- l+ \2 z
#include <unistd.h>
. @. R9 h% U5 u
#include <sys/mman.h>
: K c' f) J% v* D0 Y( t
#include <sys/types.h>
1 t$ d3 O, l2 L- D
#include <fcntl.h>
0 x4 @& B" T% G- Z: U
3 j3 b% \6 A1 o+ i, s, w8 m
#define SHAER_RAM_BASE_ADDR (0x80000000)
1 J3 A% S: c1 H( u1 X" j
#define SHAER_RAM_SIZE (0x20000)
- s9 F2 a! T# u- I* r4 Q% r9 @
! o5 I& F1 ~3 d( D d; K- L+ C3 w
typedef struct
, p5 W5 f+ l" M. C8 {
{
S: R. e, S5 P
unsigned int a;
6 a- V, d8 p% ]1 e9 f7 v
unsigned int b;
" J9 R, W: z# j+ o' H
unsigned int packet_cout;
$ ?2 d% ~. s8 \) {, W" z# x, I
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; }% h7 I d; Z! q# w7 E+ z7 X
4 h2 K# c( q9 L1 v% V1 o: f4 [4 Z, N
void read_MSG_buffer(int *baseaddr);
, w& _8 N6 P* ?9 ?
unsigned int count_copy = 0;
- U; |- s+ L3 }
' w8 W( J( a: P( j- p* v
int main()
( U) z4 }+ \$ D' p& A4 p
{
9 Y' v$ I I$ [8 K" o
int fd;
7 @ P( N, Y( m- o
int *mem = NULL;
6 Z4 i: b4 f/ }/ b+ S. j, ~
7 Q, ?6 T% [( y' L' S
if((fd = open("/dev/mem", O_RDWR)) <0)
7 W* m2 o, O. s9 o' C1 p
{
/ q! C U* g6 m. _# l
perror("open error");
, W% `7 N0 M' }7 F1 w4 ]
return -1;
7 U$ S1 R0 `4 M: n+ Y8 Y
}
- p3 [7 B- E/ E
# p7 U5 a8 l$ D% }$ O, B% E6 ~
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' G. q% p4 _2 a- @" d' v' k# r7 ?5 V
4 k6 b, p% G3 l8 @1 Y: ? @
while(1)
8 B5 y- H0 l. Y" C7 e5 N7 F* H3 y
{
1 U! A+ r0 U7 W+ n1 W7 U6 z& G
read_MSG_buffer(mem);
$ e! p) A! H6 D2 m: \$ x
}
/ U8 z0 d* G5 I8 Q ^# \
}
$ F' i( p- l& A. v
8 v( f+ s" v. ~. Z) t. s
void read_MSG_buffer(int *baseaddr)
& o7 E2 e; q/ ^' }
{
) m) g# C, I9 Z
pRX_MSG_PROTOCOL pshreRAM = NULL;
. v' h1 \* a7 o0 y e( {8 {2 z5 m
) }% T% q/ O s5 }. b( u
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ m* [+ G: l S+ C% |1 n
4 @/ R5 j0 l- I) z1 b
if(pshreRAM->packet_cout != count_copy)
1 y- c% u( }8 z6 T/ ], d
{
4 I1 w, ~+ \! e5 ~9 X5 K" S
printf("a is %d\n", pshreRAM->a);
. i, C9 w! I; z9 c7 ]
printf("b is %d\n", pshreRAM->b);
% @6 B7 k8 o H. a
printf("count is %d\n", pshreRAM->packet_cout);
6 m/ m5 S+ ^, `- L
count_copy = pshreRAM->packet_cout;
( }- C, ]6 F& }' f( [2 y
}
! P, G8 [, @) l$ m
else
2 W# S# j+ p5 Y5 Y6 K5 p
{
0 x; D7 w& k. g( A
printf("No effective message!\n");
6 J. Q+ d W4 b# H3 o: y7 ~
}
" H0 Q( j. y6 j& x/ r" x- f
}
, E1 r9 y# y0 ] l/ x+ a
9 x( P, \$ g8 @* k
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 k% S6 @# {. t1 }, }8 H0 I
2 G a* |! i" i9 O5 U: k* `. U: l* Z
; y6 N; L4 W: P! r+ i# v# ]
: |" u5 b# T$ W; v( G% |
% j, F# K/ `& N' ]$ F
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4