嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ D) u6 a9 @' m) i: {2 f7 q) N+ {
; d+ |6 o9 Q$ J0 U/ {) }; W k' y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
Y4 d$ g( Y! `& m2 @1 I$ W, Q2 }
#include <unistd.h>
. l4 f F8 l6 K( s8 Z
#include <sys/mman.h>
& j* Q |# b) H' C% i' n
#include <sys/types.h>
5 x3 e6 h0 m4 r
#include <fcntl.h>
4 a& B& ?" |$ Z# u9 R: Q/ v
n) f3 d- }( g: p2 B
#define SHAER_RAM_BASE_ADDR (0x80000000)
" U# k! b0 L, w- X, @) `) k4 j( R
) k$ M* Y: N; y. {5 r
typedef struct
; G" p' ? }4 E9 i9 j! X- T" P
{
7 Q x9 C6 n; ]( l9 j/ n& h% n
unsigned int a;
: K( j5 K k) y5 k/ V
unsigned int b;
: K) ]2 `: R, }! E. d
unsigned int packet_cout;
; m$ R u- p k1 Y3 P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 f4 y( u3 B3 Q; c# ^/ }& f
- X( Q2 e( z5 C
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. z8 d' x$ b, O/ P1 p, v; V
unsigned int count_copy = 0;
. z; o- |9 L/ w
5 ~) j& o/ Z t0 E2 C. W P
' y3 W+ S# i9 Z- O( d! l# q A7 ^9 q
int main()
' z) w5 U% Y; R
{
1 @, T" [, W, A; o* S( ]0 h
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ V& ]# V! ^6 P
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ L5 B! t0 x0 x: w: a j* E6 w0 M
8 r U* h/ b/ O/ e3 ~2 `! v, i
while(1)
7 F& A) j3 M* b
{
% ~" d+ g# {3 f2 `6 y
read_MSG_buffer(pshreRAM);
( L& e p( M5 b1 L
}
/ m0 b+ Z6 d' w9 r/ R; D2 R
}
$ @) m# d, p3 @
2 t4 x y; { _ t# l" Z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ L% r. X) G9 ], i, @1 R
{
7 W, P7 w, u2 z
RX_MSG_PROTOCOL buf;
1 B3 q7 j4 D' B
! |' B* P( D+ a" q# F) u' _* ? K
buf.a = pshreRAM->a;
& r1 D+ e" b' f
buf.b = pshreRAM->b;
9 H- r5 t5 p2 X3 u( X: d3 ~; \* b
buf.packet_cout = pshreRAM->packet_cout;
# {/ l$ D o' _0 _5 Z1 }2 K
, R5 b1 Q7 v. C
if(buf.packet_cout != count_copy)
1 o e2 B# z; M, k8 C
{
2 b" a7 v0 I- z! b8 G
printf("a is %d\n", buf.a);
6 z0 W1 d) E7 e, Z3 _
printf("b is %d\n", buf.b);
+ l: o6 K1 m: z+ v9 u) l
printf("count is %d\n", buf.packet_cout);
& I. l$ N* m& f* [: x- F/ B/ d, l
count_copy = buf.packet_cout;
. }% m& a2 D, H1 O; [. o8 _6 T
}
7 p: \- a* D- @6 e6 y& O, q$ y
else
% b% I+ k: b* O! K/ E
{
, [5 d$ v2 D& o/ v9 M
printf("No effective message!");
0 J6 ?: l2 t$ b: |5 X! B( N
}
: c* O) ^% z; ] y8 {! ~
}
+ x: c- ]/ ~6 a" i, T
# O' `: t O+ W' C ^; M- W. {! ~
n9 K2 n1 w: k l
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( e( {# w7 ~/ _
使用下面代码,对内存使用了mmap函数后:
, W$ o- b- z5 c! P5 Y# j
#include <stdio.h>
2 G) {+ {: Y8 P8 F% c
#include <unistd.h>
8 h" C* ?6 p- t! {7 B: |5 z* D
#include <sys/mman.h>
# b6 i, P" q4 y* X) C- s
#include <sys/types.h>
; i. U( y2 ^" E1 Z" b( p
#include <fcntl.h>
# I& _. h$ @% d( A) f$ A [
g& S& R" ?5 C5 d' F' V' i( F h
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 d( m W3 [5 d3 _$ B. C- q2 U5 @
#define SHAER_RAM_SIZE (0x20000)
- H% g2 `& s1 j$ p1 z
# v: q9 @* u; J
typedef struct
5 B4 G1 G% m- _& d* A |6 x9 D( a/ R8 U
{
5 a B3 R. D' d8 F' u9 B
unsigned int a;
/ {" z( z" }9 b- @
unsigned int b;
7 T& W5 ]3 m- G' c
unsigned int packet_cout;
' S! z7 m2 q) U
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* _+ P$ R X; x& V* e9 y. e2 h
H( H2 z. R: L- j1 Y- F" h/ s( i& U
void read_MSG_buffer(int *baseaddr);
1 s, `, D! c& `; i( d, f, F- P
unsigned int count_copy = 0;
+ \! g7 K* W, n8 T. x4 A+ A4 j1 T
( y; ?% A& n. d7 d
int main()
% e, u- u0 E9 Y% T
{
L" `) `) U! B( V( y
int fd;
+ t9 M ~9 J2 t, v* V% l4 `
int *mem = NULL;
" V2 g8 \# P4 }" z; W7 a! D! B4 U
6 f8 | B$ m `/ K6 Q
if((fd = open("/dev/mem", O_RDWR)) <0)
% A! g1 @. D% X% y! C! E8 v/ T
{
+ r! j) f* b: O
perror("open error");
' @. o' Z% F& ]) S1 E
return -1;
0 f% |. m- Y9 G7 r* v. `
}
* F. r, V* O! D T
$ V9 S& x1 j9 A$ E
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 {; ~ q4 L0 t
; n. L- Z9 p3 i. i: c( X0 C
while(1)
' {1 y; N1 d+ D% b0 \( h/ B
{
2 j" {" ]8 n7 k1 W' D( c& s
read_MSG_buffer(mem);
4 P- f: f) x- k8 X* b
}
2 {/ ^2 h8 i8 M& P5 t( \/ v
}
; K9 p- }2 e6 J b& C0 ~
5 W) P* M8 x; T+ D3 @( \' s
void read_MSG_buffer(int *baseaddr)
4 {2 j V. J/ X/ F
{
; [" c1 T! ~$ X( y* o9 a
pRX_MSG_PROTOCOL pshreRAM = NULL;
" e: @7 Q6 p! e: W: t. i+ d' ]
, q0 [% x& X, r7 o8 n3 F
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ l- i2 O. q; W# B+ `( I% B: R
% l) `: s8 ^& _1 l ^) S* F
if(pshreRAM->packet_cout != count_copy)
7 \' ?. N0 T8 g/ i2 q# Q: F
{
A8 d! ?: D) J3 n/ z
printf("a is %d\n", pshreRAM->a);
' R' t; d" F m, }/ E
printf("b is %d\n", pshreRAM->b);
9 K* m* C T& y9 e
printf("count is %d\n", pshreRAM->packet_cout);
5 y! E j7 a8 }2 X
count_copy = pshreRAM->packet_cout;
( s! A: O* R# w( h
}
1 u1 g1 R9 z2 R2 g
else
9 X6 U& V' {0 s
{
7 d5 p4 E; j9 X& n# j
printf("No effective message!\n");
7 T3 v9 J9 J: ]7 R2 }- K: i3 u
}
' M1 \% }, G7 z d' x' m
}
; X: X$ c- t1 k- s# K
5 t& S' M: t2 k; j1 ?% m1 {. Y$ h6 U
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" o, Z- L/ p' x! J! ?8 W
* E( d4 Z* K$ C. a$ ]# |
$ c; F I6 X$ g) E5 u6 K
3 V4 a9 p# f5 S; J: K. R/ Q
7 z, ~$ k& ?- d# [! I7 b5 p- q$ W
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4