嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& ]5 }8 m8 P" {7 ]& q' i3 Q- W/ h
+ u3 _0 O) B; w/ M. r: p5 i, L+ E e
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: [( H; `0 a3 L
#include <unistd.h>
* ?. z7 J/ T' e
#include <sys/mman.h>
- p$ X. ~5 `$ k$ H
#include <sys/types.h>
b6 ~* P' D, o; ~/ ~6 I: @, o
#include <fcntl.h>
6 ^2 J8 z: O" `% Q6 z. I. C: J
( S" @8 m/ {" B! f6 S
#define SHAER_RAM_BASE_ADDR (0x80000000)
( ]! w/ y$ A; E) e6 h4 i
% A1 i5 X O! n& B: C. n0 Q7 v; t$ s
typedef struct
6 {' A% D4 c2 [5 s- U
{
! T% w* A& H7 N' M$ @$ |$ R7 A+ |. }
unsigned int a;
3 R$ f5 o) I$ W7 S
unsigned int b;
( J$ M' D" m* f W
unsigned int packet_cout;
" O- s; I( p7 o# ?
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 \! I/ R+ v/ Y. u2 F' s
. P7 T5 f7 D; a, [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 `4 v/ F+ N D- L; Q2 L }
unsigned int count_copy = 0;
z1 x. o; }& _6 p
& g; h% @. \) ~8 M
: [ x8 y+ Z/ X/ g2 J! R' g" i! H- K( }
int main()
* ^% n5 x0 }% S) x3 O5 E$ l; U1 q
{
" c; ^5 u% o# E" }
pRX_MSG_PROTOCOL pshreRAM = NULL;
, E; c6 S8 h x c6 E5 o& h/ k
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ k( ?' r7 b3 _& q8 k2 o
% W5 r; E9 F( O# L+ U E& u# F
while(1)
- z% A/ W7 \4 P- b! S6 `0 q
{
: [' o7 e1 U2 t" q* ^% r
read_MSG_buffer(pshreRAM);
( ^' u- @0 [( ^0 b
}
1 _* P! _; Z) @% G
}
" s& R) \" J0 p3 h* Y: M
+ C1 C& |6 u6 ]; ]* }/ j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( O2 c1 Z3 c q5 R/ I
{
2 c2 Y( _. ~% r) l0 V' P
RX_MSG_PROTOCOL buf;
, h6 W6 C0 F2 Q3 H- E# \. \
5 k+ ~+ y ?$ G* P, |
buf.a = pshreRAM->a;
. U$ [4 q0 `- n$ m% E, j
buf.b = pshreRAM->b;
0 e7 ?- ^- }" z% P* S+ \
buf.packet_cout = pshreRAM->packet_cout;
6 R$ t1 Z* r$ L# [
' I9 i a3 X. T0 m [6 {
if(buf.packet_cout != count_copy)
$ _. j: v% Y& o# v5 D# l: R! K
{
) [6 \9 _/ [6 \$ }& q3 d; p- S
printf("a is %d\n", buf.a);
" i4 }; Q [& F" v( C
printf("b is %d\n", buf.b);
& t3 b, B" x0 g- o, l
printf("count is %d\n", buf.packet_cout);
& K- L2 W: Z" `6 V3 [
count_copy = buf.packet_cout;
+ ~9 V# `3 n" Y# A7 C
}
- X7 p* ]# h3 x
else
! U) G+ `! _# {2 f2 c8 F# F0 D
{
1 r2 m' ~1 Y0 h, |% C
printf("No effective message!");
4 R/ w4 e2 S: o; Y3 y* B
}
$ O, k. l9 m6 |2 n0 S
}
0 h& |4 D6 x9 v1 P$ ~5 ]
- [# N+ R- V2 C2 g
6 i7 I2 j/ B" Z$ I: w+ u
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
: l8 L6 J- w5 B: c0 `5 j7 E
使用下面代码,对内存使用了mmap函数后:
3 |$ k- C! D1 [) W+ ^; H
#include <stdio.h>
, v" D: @: P" U1 M6 V @3 L6 e
#include <unistd.h>
; a$ b6 z, f# p
#include <sys/mman.h>
- Z& b" z( X1 n; ?9 w
#include <sys/types.h>
) l1 I& a+ G' ~ E5 N! b) h! o
#include <fcntl.h>
7 ?7 j4 w" |5 p. @9 ?" H- e
! ^- N0 q& n, D4 E' _4 M+ \
#define SHAER_RAM_BASE_ADDR (0x80000000)
4 e: A& F8 i8 G c
#define SHAER_RAM_SIZE (0x20000)
! U: T& R S k3 i5 D- B9 E
4 j: m- z/ m2 A9 g8 T) O! r7 S
typedef struct
2 {7 y* C1 n9 I# x, y4 g5 n/ u! B
{
* g# K0 p) E' H6 w" H
unsigned int a;
& d- ?. d# t- g! U& H" Z
unsigned int b;
) z: O. X/ i! T% D% A3 H2 n, `
unsigned int packet_cout;
' D/ k6 G" p6 h6 B6 j& E; l1 S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 {1 W3 B/ q1 d' q
" b4 f# s C/ Y k8 R
void read_MSG_buffer(int *baseaddr);
+ l) J+ U& V8 |( w# [. T5 P
unsigned int count_copy = 0;
+ H+ X4 m6 r( z
2 ^9 a7 p8 j, n7 i* S( v3 c
int main()
* W' s4 W: \! I! F, y) l
{
$ x# P3 @" }3 U2 k
int fd;
- ]# z. d; V0 c
int *mem = NULL;
! W" W1 b, l5 Z( E! k
7 a, ^& D3 s7 w: i3 j
if((fd = open("/dev/mem", O_RDWR)) <0)
- A. s+ V1 p O' d
{
) R9 k# H: g; x" \/ d8 y* C& F
perror("open error");
6 h4 c6 V4 r H+ J( S
return -1;
; q5 o3 U6 E# ]4 ^ e/ m/ d# L! w! e
}
r3 M/ W# f k+ L& h$ T/ m+ ~
7 i) h/ L8 ^+ q4 A. p. f( f
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 h, ?5 s5 I: X4 ~! E
: |3 P O: |* ~5 P% v' l
while(1)
4 t+ c& O A- a- J0 i
{
) I+ u. {7 \: D ]8 N
read_MSG_buffer(mem);
! s1 \; U0 v6 u1 \
}
- u5 C! X0 C: m: l
}
2 `# b6 h' Y1 i9 @6 q2 |6 H
" Z' ?( n/ Z# P# b# v
void read_MSG_buffer(int *baseaddr)
# Z+ b( n! e* ^6 r2 t
{
* B& |; O4 U0 ? \( j$ R: R
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 Z. ?- @: h5 U$ |& q9 J& L3 P
' m* H. L% Q9 g5 {2 e5 W
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: p& v5 h% E: Z) f5 z0 i" ?
8 B: W% W! \- X! Z0 H; n: D
if(pshreRAM->packet_cout != count_copy)
7 w7 V0 i8 J, W$ d4 u# b
{
+ B% @% A8 @) i) q1 \! i
printf("a is %d\n", pshreRAM->a);
, G8 t; b- M9 W7 m9 P; K+ n2 \
printf("b is %d\n", pshreRAM->b);
9 u; @, ~ P7 N5 Y: x8 w( k8 C& B
printf("count is %d\n", pshreRAM->packet_cout);
4 H9 ?* V0 y& @0 R
count_copy = pshreRAM->packet_cout;
/ P' j3 [4 O6 J7 d
}
! x# E! i+ F3 @' r/ [
else
i+ c$ [+ h# T
{
( k0 }/ S" n0 W: l
printf("No effective message!\n");
9 U+ z9 \' K: B9 g2 {1 m
}
' K$ P7 a9 `. d6 d
}
% }; _: D* B. M3 W2 B x. r
! M% h9 w" c" {/ z6 o% N' \* ^/ c. X w
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ i. Z7 V8 Z' S+ }- y
( ?; U) p6 \6 d, h8 g% s( b& B; A
& z: ^9 a8 Q% U K
( [3 ]( A$ W( r+ z% [3 t
- u4 J5 g1 p0 D5 S7 Q
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4