嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" A }# V% O: Q' r. n7 V; b( t/ K
8 Y, S$ q' \8 V$ A* }( G. Y% Z
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! Q7 _2 y5 T4 z5 z; s) g6 b e
#include <unistd.h>
, w3 c6 l- N. L7 \; v
#include <sys/mman.h>
' a6 ?5 F9 C: h- ~3 ?% C
#include <sys/types.h>
. m2 G) c/ K; @
#include <fcntl.h>
! y' O! m* T7 }+ W" u
& N$ P9 Q- u% ?% E) M& N% |
#define SHAER_RAM_BASE_ADDR (0x80000000)
% ~. V+ i" x& w! g* d. n
/ d" a" s+ M" O" J; U, l7 F
typedef struct
' L) ^1 j0 L( k4 `
{
. X2 G7 s! W8 z% s
unsigned int a;
# d# o+ ~8 v" o. ]. R1 a: A1 Y/ D0 z9 F
unsigned int b;
( p# B+ Y8 _2 u# I4 S) S
unsigned int packet_cout;
" h5 M8 T2 ^. R- O: \( m* r. o
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& L/ Y, R9 G& g* U G
' Q7 `" B: _) x8 d. o
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, s/ e8 f9 L4 b# u1 ]; y: T" b
unsigned int count_copy = 0;
+ V$ r4 D9 M) M( o
7 B; ~! V6 F& D, t' S
# V* b* F# e! x% w6 Q/ m
int main()
) _5 W1 \+ o* I
{
7 N3 o7 V" }, n! A7 [+ d) h8 ?: r
pRX_MSG_PROTOCOL pshreRAM = NULL;
. ~- X8 |/ t- o5 P5 D3 h% Z$ E+ K
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ G/ \6 }, t1 d
$ W+ {# E5 l: W- B6 F" f4 q
while(1)
$ ^* t9 ]+ H" ~4 f, W: y' q
{
6 k& N0 H7 ]- _. v( i! [% U3 j
read_MSG_buffer(pshreRAM);
& |8 u1 q+ S0 T4 f! |/ V
}
; x" D8 A& S: a: R5 v5 R/ O4 K6 ~
}
1 H5 p' `+ o/ U& E. t
- X6 z0 r: N- ~& B8 d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 d* `* l3 O4 E) H- Z1 O
{
4 W8 g( `% }4 J! C7 O/ l# r6 M
RX_MSG_PROTOCOL buf;
2 F+ Z% h! D! }) }* s) `
. _2 H3 \! O* k1 F4 C) t% J% c
buf.a = pshreRAM->a;
+ [8 y$ |6 S8 y }5 _- |+ S) V
buf.b = pshreRAM->b;
9 z$ R2 I" J; c1 v, x$ m0 [4 J
buf.packet_cout = pshreRAM->packet_cout;
; R7 R( i) {, U( f0 B4 M
) D. L$ W' R8 l% M' e1 Y
if(buf.packet_cout != count_copy)
7 T$ F# {+ l0 v( M, A P
{
1 T9 \8 |( x, Z* N& b8 o% Q4 M
printf("a is %d\n", buf.a);
! j" j/ y( l- M2 H9 E8 U: h% w. h2 `
printf("b is %d\n", buf.b);
* k, d# I+ N' ~6 D
printf("count is %d\n", buf.packet_cout);
0 D8 I7 @# l8 l. f) c% A* t4 _
count_copy = buf.packet_cout;
* v) a& H1 {2 L5 z( ?" f( o- @
}
5 ~5 b* Y" O1 K n ~- ^
else
1 e+ K+ ~5 k% V1 u$ P: ]% R. ~
{
: l9 t( D' M, Y! H/ @5 B+ R
printf("No effective message!");
) H# @9 ~7 I; P1 u8 a
}
8 Z3 }# n! i L0 y5 j! t! O( k* N" p( ]
}
% T+ a6 h6 s# M$ E
9 d v6 i `) {% E
9 s9 \7 j ^) H2 \
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 p D" T. Z# m+ _& k
使用下面代码,对内存使用了mmap函数后:
; ?4 ~8 U4 i8 L! o) J& X
#include <stdio.h>
/ V, p+ }3 F3 s9 _% h7 Q" i
#include <unistd.h>
" ^7 e" _4 e! \7 I2 o2 i& d7 [! p
#include <sys/mman.h>
$ `6 |( T" f4 g: T8 M" ?
#include <sys/types.h>
# \, t0 @6 h) |- e5 H
#include <fcntl.h>
. }2 `( o' Q* ?+ }2 j# G$ @3 J
) Q. b: g# m. w$ g# o( ?# i
#define SHAER_RAM_BASE_ADDR (0x80000000)
5 p4 O8 ]5 m0 D( K0 {
#define SHAER_RAM_SIZE (0x20000)
1 R: Z4 x, T$ Q* D F" |
}/ W+ ?. W. w: k) d% P; |
typedef struct
$ [2 n4 y6 O% n, j+ \; J. E/ o9 X: {
{
7 D, w( G4 P6 t% d9 f% K1 L0 H8 D
unsigned int a;
$ Q% w' n/ {7 [
unsigned int b;
% ~2 t1 Z$ X- u5 a
unsigned int packet_cout;
, {0 v/ j: n9 p7 c/ ?
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 ^: p$ y5 m# c d; R. L9 p3 {9 W9 G
; Z9 N) F9 P5 n$ |- e
void read_MSG_buffer(int *baseaddr);
5 m4 i$ m; d7 Y3 C0 u
unsigned int count_copy = 0;
1 ~" p" c+ y$ w# ?1 L: i2 z
+ _& B E% r, h @
int main()
8 x) v' o: P! u5 S! X9 y6 x
{
+ t, u W7 s ^' e6 d
int fd;
1 B4 F4 ]+ P+ \
int *mem = NULL;
$ G: j7 f+ k! v3 f* i9 |. c
! p0 s8 Q/ @+ v
if((fd = open("/dev/mem", O_RDWR)) <0)
. U$ ^3 ?' X; {- r9 Q
{
, k8 C) D1 ^% m3 L$ H( `* l2 @, [5 S8 n
perror("open error");
1 z% R) C/ }. \, y, f7 o }2 m
return -1;
$ a/ C* U* r5 {# F/ ^
}
' h* I; ?9 X9 M% _. ]* |* J1 s" F7 }
# L; j) B2 H/ m I: a
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 C8 D1 D. P+ d A A1 H
2 l" x5 ~& k. ~! y* q
while(1)
; h! c4 n9 V: m0 l/ \/ P
{
7 h d x+ }* ?2 k- X) C& s) e) A
read_MSG_buffer(mem);
) m$ b8 E: g1 ?$ c9 p
}
% | N' i- ^2 o5 I3 P4 `
}
% O7 Y) |4 Z \; R; f2 V" F/ m
- T! S) [: B- ~& V, d, [
void read_MSG_buffer(int *baseaddr)
/ V* _# G8 p% T) i4 g: F4 R% E8 q
{
' M4 ?+ i# p( M. L* y7 f! C
pRX_MSG_PROTOCOL pshreRAM = NULL;
* [5 i J; h, B9 S1 A( X
6 r* S' \7 G- S0 @" v
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& I3 R( W2 ?, r9 b! c$ A# o
. r1 E. O: {, N6 k
if(pshreRAM->packet_cout != count_copy)
0 z: y% p: U0 I! v: Q5 E
{
, Y) o5 d, [& e1 N5 h e
printf("a is %d\n", pshreRAM->a);
9 E( u; p1 ~! ?- t8 k
printf("b is %d\n", pshreRAM->b);
5 u0 O3 o5 }: [' l( g! a
printf("count is %d\n", pshreRAM->packet_cout);
* p4 ?" y& b6 s' T
count_copy = pshreRAM->packet_cout;
8 {% ] C6 S% k- y
}
1 G, p2 T+ `; c2 n( B
else
8 h% b# w' Q+ @/ p# f
{
7 y0 j7 E1 v* j# {0 [( d$ w
printf("No effective message!\n");
; a" B; j3 G$ g
}
. g$ t' }" f5 R% K
}
, s4 {8 `" H. n! I
6 m9 o, b: b( l0 L1 ]
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" f1 n2 M# V, D% C* o
/ m* F% _$ G- E3 Z* e6 B; N8 z
x5 M9 r, s9 f
; ~- T5 r! m8 x ~( X6 n0 r0 K
, i' s1 |5 ?# j' N
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4