嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
3 z6 G0 N/ V5 y8 |
) K6 G" R# Q5 a. [) k
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 `# U" ~. ^ u6 X1 V
#include <unistd.h>
3 z) e3 D, U/ k1 n6 m
#include <sys/mman.h>
, Z5 E+ D- T" u* O6 F4 w
#include <sys/types.h>
( ~, [ S0 w& G- H9 F# m9 I: h4 E9 @
#include <fcntl.h>
6 D% o$ m' @1 j# h6 t; E
( j4 D! b( H9 @
#define SHAER_RAM_BASE_ADDR (0x80000000)
$ X9 r' r6 ]5 E
! H/ U( F( p' Z# A- q3 o$ i9 i1 X5 X
typedef struct
# }4 D+ \8 H9 c/ ]
{
+ K& ?/ }7 E* m1 D1 a4 m% P
unsigned int a;
% j7 Z( D# e: m# `( j
unsigned int b;
9 i1 D5 q# P% s$ y; b1 ^
unsigned int packet_cout;
3 s+ [: Y' Q& Y9 r; X4 Y! C! a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. c! l6 F' j' o1 \- G8 p, {
: F2 S/ ?" S3 b& j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 A0 C$ W' [! `" v( m! \
unsigned int count_copy = 0;
0 L% O6 y9 ?, D+ D/ }
% x) \9 O: L$ v+ r+ @
# ]2 m6 R- u2 g- b
int main()
; _" _. O! w- F6 c. C. J
{
f8 b1 K) Q b, @
pRX_MSG_PROTOCOL pshreRAM = NULL;
* T( w* E! L7 n+ N& O4 m
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 S4 D! U* u$ c
) V8 p/ ]% {/ E2 d& g8 r6 f+ P
while(1)
" h; a* f$ C% e% k' H/ ~
{
# {9 O) A4 a7 ^3 P! `
read_MSG_buffer(pshreRAM);
& K# \* @) u8 n
}
0 C/ x" o9 x1 L; n6 {
}
2 @# r- c# R6 D1 S
8 @1 P; z; v! f8 T% v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
g2 w$ ]: {/ r0 ^
{
# ^# Y% v% I. a; r: ~
RX_MSG_PROTOCOL buf;
' Y' {) i1 A6 n' X
, M3 N2 x/ k2 {& r) P
buf.a = pshreRAM->a;
( T/ z9 [( \- g T* z [5 @) q6 e4 K/ W* E
buf.b = pshreRAM->b;
) e- F( l/ q/ q" ], _3 {& y2 }# H
buf.packet_cout = pshreRAM->packet_cout;
" B3 U+ B0 n$ m0 I
2 V) M3 g6 p0 C, A7 Q( q. y* E
if(buf.packet_cout != count_copy)
/ p( D* P# `1 V9 V& u, a1 r% g
{
% i% R! f0 {! H$ x1 Q
printf("a is %d\n", buf.a);
6 l- b; E5 p; S$ H- F; T ?
printf("b is %d\n", buf.b);
" ^7 u* K1 T0 o% @6 z
printf("count is %d\n", buf.packet_cout);
) z! V! Z$ I1 d
count_copy = buf.packet_cout;
5 U$ X% ?- d6 u8 A O Y
}
6 A: O3 e0 r2 R5 Y0 V( g
else
& {( T% [4 N) `( _
{
9 x1 H8 F0 e( X( S; r `
printf("No effective message!");
3 t# J' y/ |, M+ s e' A
}
, b6 N5 O+ p. G, G) f4 i# Q5 c) |
}
- ?4 }3 t* j. q) u+ \5 @
. ]% o a0 A3 z; P/ m' ^/ ?) S
( K1 y. g {+ \0 c o3 e+ b Q9 M8 |
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% {% P# [" T; V0 e& z5 R
使用下面代码,对内存使用了mmap函数后:
) x, N- A9 d4 C/ P/ g
#include <stdio.h>
$ j4 r* a8 x) `$ a% `( G* U1 W
#include <unistd.h>
: R9 E* H; I0 v9 p! Y$ _, d- ^
#include <sys/mman.h>
# v; W1 a" x! W/ \8 g! m [2 C+ E9 b
#include <sys/types.h>
# ~9 Z# u! A' M3 y, w
#include <fcntl.h>
" {9 I* V7 N# ?: ~* w, P
- v6 i5 |; Q% x1 [& Y
#define SHAER_RAM_BASE_ADDR (0x80000000)
! |$ z8 J5 d$ k3 _# O. L# L
#define SHAER_RAM_SIZE (0x20000)
0 Q& K, r2 ]# a4 x I" t$ E
/ p! u: C% c4 j; O
typedef struct
& Y4 R0 T, r$ f1 Z9 Q( o. u! \
{
: G# S* g/ J5 P2 [
unsigned int a;
/ d' P* k5 A0 x: q6 C
unsigned int b;
; @7 @" A; W; ~
unsigned int packet_cout;
- A0 w( F# d1 B8 @- ]7 V. L5 j
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( p i$ R! {5 [* g3 O" ?# J
, i9 G' f1 r: C0 g" R7 X* ^
void read_MSG_buffer(int *baseaddr);
" {$ W4 A) c/ [4 n
unsigned int count_copy = 0;
N \. s1 W y C- Q1 w7 X/ e6 a2 t/ A# f
# p: r5 _: u( v+ w- f' C
int main()
7 ~& f( D3 U6 S3 Q1 m4 t0 V
{
$ X% w* x4 L/ G3 j" n5 |# w
int fd;
$ R. W* h$ _/ ~) e K
int *mem = NULL;
9 \1 O9 _* N2 P+ K2 v: [
9 o8 O. O! y6 I3 m
if((fd = open("/dev/mem", O_RDWR)) <0)
) G2 X7 R; y0 u2 I
{
* }. S" x# O' x5 ~1 x& @. o1 d
perror("open error");
! {# S0 Z! U) [0 A) Q
return -1;
( M0 T. e( X; s* F; e; b
}
6 \, s& s3 D* _2 h. w" N" |# ?' k: H
5 i9 C6 n% A8 K$ m7 W& x( ^0 h
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, f# r# H; F5 t2 t" D! \& P
" I4 w, {" s" C- _
while(1)
3 Q8 b1 B6 A6 _. [. J. B, \
{
' V/ O, M/ o ]2 Y
read_MSG_buffer(mem);
# [' t( q/ }+ n( [& N
}
( |( b P8 L4 }! [/ Z# k7 Z3 b
}
: G( A% n( ]* ~8 r/ B
6 R/ ~ i3 l8 x& m
void read_MSG_buffer(int *baseaddr)
7 }2 V# b$ F, m" Q
{
. A! o8 j- L. k1 g
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ \; y$ D( m7 z: }: G7 [) ]
' G/ |# Q$ Y+ H+ o- d0 l$ r
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( U/ F6 l1 K- z$ U$ R: ]
7 Q/ d. k. O% c+ C' i U) r
if(pshreRAM->packet_cout != count_copy)
* p; N7 R- t6 a
{
- h ^& l# U: d, ]' b" k
printf("a is %d\n", pshreRAM->a);
) Z' v, H- O7 {) ~' {
printf("b is %d\n", pshreRAM->b);
0 | Y7 |9 A9 p" }- c! ]& p4 X
printf("count is %d\n", pshreRAM->packet_cout);
. _9 j: o8 `: A& Q6 Y5 |
count_copy = pshreRAM->packet_cout;
: h+ u; m" x' F+ `$ w
}
# N/ E# H) `4 _( ]) n- `( g4 B. K8 V
else
0 Q5 `4 W) \' G, C0 x4 X
{
% \5 T. p% a# x" I6 m
printf("No effective message!\n");
: W* R& L7 d) B# ^& b2 h' d
}
: y& ~4 K( Q. w% @8 d
}
) E1 k% x2 ~1 g) M
/ Z* d# X( k$ L5 j9 h* u3 D' l+ a
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; x8 \9 K% e5 @, k! |
- c; w+ [- S0 l- ?( v. w
; D% g* N: F; c$ ~7 n2 _0 O
4 p; Y8 F2 [ j. |% H% p1 O) ]
0 a- I! V: v- O0 N/ y6 x, P) e- u
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4