嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 s. i! }3 }1 c; r9 Q' {
' X3 W- I: L4 C/ j, G
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( o/ G( m" Q3 r. S9 B! c! T
#include <unistd.h>
( S6 L3 T2 A- \0 A
#include <sys/mman.h>
: J8 D: W" ]. |& L% ?2 b
#include <sys/types.h>
! M+ S N; Y F" z- ~( b7 y
#include <fcntl.h>
, h D' U' M4 S4 t2 t
* X5 W( [: f5 f/ a( f1 l' X3 T
#define SHAER_RAM_BASE_ADDR (0x80000000)
$ x) ] w. c2 r* H' O+ e
# T8 o& R) d! a H
typedef struct
& I" @1 N+ {' }: f8 _
{
( K6 }5 D9 W1 |5 D w: x; _
unsigned int a;
0 |4 ?. G A; I1 I' u) v) r
unsigned int b;
, M& k: t9 I7 u% M
unsigned int packet_cout;
9 a+ m" E2 f) f- d1 E
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 f* M! T! n0 i: R' A
1 Y& @! [7 P$ W3 ?9 @. t( M: h1 g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
+ r/ {8 ]% b2 T) t" M
unsigned int count_copy = 0;
, D! }1 B: [- [$ O* X, [" p. l
; N4 o: y2 U& l9 o
' ?# }" ?1 V$ x7 S6 o o
int main()
+ s2 n- W; K+ `7 S
{
4 O) h2 `/ B# N# r& K+ x
pRX_MSG_PROTOCOL pshreRAM = NULL;
. R* n A2 q2 c+ r$ A
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, K! z! E. Z$ b; } S# J
7 m$ L, L p5 A5 [$ x8 A% s+ `
while(1)
+ K: x6 L7 X4 u, z. j1 ^$ G
{
7 @) e* @7 u" Z& f
read_MSG_buffer(pshreRAM);
- l! V/ y1 T2 m2 o- W% X- V" Y
}
|) I1 ]. J( f$ S
}
2 U1 L# a3 q% A9 F. {
: e% Y2 P& ^# j' Z8 S/ N" S! H1 U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 r& o ]1 q6 Z, k
{
: a$ k4 M/ ] B- }4 {1 }! v
RX_MSG_PROTOCOL buf;
+ ^, n$ \: ]5 S7 R" a3 C
: z8 U/ y2 H4 r) ?* e$ S0 \
buf.a = pshreRAM->a;
2 [" Q7 X o3 x
buf.b = pshreRAM->b;
. T& m! D$ k3 F1 Y8 g% W# K: ]
buf.packet_cout = pshreRAM->packet_cout;
6 U) C8 W6 e, {9 q' A2 k
% Y6 k4 ^) ~. e! |1 Y% T
if(buf.packet_cout != count_copy)
: y3 m& j7 U, ^
{
0 }2 P H/ w: e! {3 U
printf("a is %d\n", buf.a);
y4 N9 m/ u! H( F9 u
printf("b is %d\n", buf.b);
O& r& E# h) Q4 b- o ]) A
printf("count is %d\n", buf.packet_cout);
( C7 T* W T8 ~( D! w
count_copy = buf.packet_cout;
1 t8 D) l% [' c
}
( u! I" z# s; F4 K3 M
else
7 j; f4 Y0 t f! [- N
{
) u4 }' M4 ^6 a1 p8 n* \
printf("No effective message!");
. g6 A% p2 m J7 i
}
6 U8 q/ @+ ]! z/ T. a8 _
}
8 j: ~# J6 z- \7 G" U4 H4 g2 z
/ T3 P+ F2 J2 I4 {3 a+ H+ q* B2 Q* B
7 m4 [& K& Y' v6 p' J% U
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ Z5 @" l b# ? `
使用下面代码,对内存使用了mmap函数后:
! _, ?& O3 D4 W1 m
#include <stdio.h>
& r4 ~# P# C# z; z
#include <unistd.h>
' S0 y$ G0 Y; Z( `" e
#include <sys/mman.h>
% t9 E6 S! M+ k7 r8 Q- C
#include <sys/types.h>
q9 c2 Q- U5 P7 ]& `2 T" }
#include <fcntl.h>
; p" \. C8 s& {% L
/ x$ D/ A3 q/ v0 z
#define SHAER_RAM_BASE_ADDR (0x80000000)
7 Y0 r* @! i( G1 F+ B( U
#define SHAER_RAM_SIZE (0x20000)
5 f9 x, R6 q7 n3 c- x& M
6 o0 S2 T5 d1 x- n$ Q1 r1 O
typedef struct
q& Y6 [" `6 v4 o
{
, a' y+ J: o) |/ L& l
unsigned int a;
" T( T$ [7 ~- Z- f6 ~
unsigned int b;
9 i; D; E% k8 r3 X
unsigned int packet_cout;
" J5 z' M! k1 D3 c
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. \* C4 h) D& s, g4 W$ k, c2 W
' M+ j3 z& @( Y- H4 Y |8 p0 b
void read_MSG_buffer(int *baseaddr);
7 k/ ?4 c; @) p$ z$ O
unsigned int count_copy = 0;
) n k% S4 x* d3 ^2 n
4 n/ ^8 C3 z5 |6 g: H0 t
int main()
$ X) q6 v. e- B* o! s7 d0 N: V
{
% o3 H+ V/ |4 Q! a0 W J$ @
int fd;
. k6 ]" L. M, \( b h( L
int *mem = NULL;
- F8 f+ P# V. _ x- d
. A; Q( ^$ {2 j
if((fd = open("/dev/mem", O_RDWR)) <0)
) c. z7 X! G# i$ A0 T( \
{
z; z3 ~) C; Z* \" i7 I
perror("open error");
- ^5 ~ |6 ?4 |7 h+ e
return -1;
' k0 W, Y6 C5 W- p" D5 D) u; k
}
8 S# h6 ]$ t: F J$ B
. y- |% v" W$ L5 t7 j- F
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. `9 j; i6 E7 t$ ~
7 H# K: n, h& g2 r* H# @
while(1)
& h8 t* f0 n; h* _4 t! ^
{
! e% J5 k* ^4 z" _$ J' j
read_MSG_buffer(mem);
# ~+ M9 g4 D6 L
}
! x0 B; G3 v" k
}
' i8 v/ g$ ~7 G0 F2 j* V6 x% v
0 j+ @- f) b4 H* c5 V6 t* ^# N
void read_MSG_buffer(int *baseaddr)
5 Q0 X6 X- p( i- N5 P( D6 X
{
; f2 ?5 a6 k! h$ l5 f2 f
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 \4 a( {4 [+ V8 B4 N5 o
" u7 l* f! C/ J, U/ B: \
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 l; x5 k8 Q. o* e+ E- z: E( R+ N1 z
8 [* P Y4 F; H
if(pshreRAM->packet_cout != count_copy)
4 h1 H) o* I3 K/ N# G# n
{
( J( }: d5 y( t! n+ S6 I
printf("a is %d\n", pshreRAM->a);
: L7 Y* h v8 r p
printf("b is %d\n", pshreRAM->b);
! A+ k- j, m; v: X
printf("count is %d\n", pshreRAM->packet_cout);
6 c( u: d/ c; R. g5 W
count_copy = pshreRAM->packet_cout;
8 T9 y- Y0 O, ~( F/ \/ W
}
' {0 B# \0 e. t3 R. I
else
8 O' s9 ^' z6 K; ~- V# o
{
& x+ E e2 ~( l7 \; j2 [, z2 l' s9 j
printf("No effective message!\n");
7 N4 p" l( V- {' C! e& h
}
. R$ z: y) T4 }+ x& F
}
0 L4 L) d6 @7 l
$ @7 P+ W9 A9 k9 b/ B; Y p1 l8 H( d
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
O' |& O' B' W5 ]1 e4 ]: O+ b* E
# I8 c0 N1 y9 ^' J
# u" l* I* M0 t9 {- B. M7 ?
" p. ^5 f; W! x# l2 h- o3 X" _. J' t; v
! E; l8 X/ z( ^2 J7 Q; B
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4