嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 Z* |, i- g, T$ b! f: ^; y
* y7 |3 e/ j* b R) D! H _. C
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: H" \1 a6 S/ L9 s
#include <unistd.h>
- d2 @( \" |# ^( Q
#include <sys/mman.h>
; F. C8 z4 ]& L5 S- V0 X0 `( G1 s5 l
#include <sys/types.h>
- I. u8 Z* @$ w. O9 ]
#include <fcntl.h>
6 G7 y+ g0 z5 Q# ~
) X7 V6 B: b+ `& {) t8 M# L
#define SHAER_RAM_BASE_ADDR (0x80000000)
: t o! ^- ^! e @8 A
/ B! C/ F. \! x4 p
typedef struct
?' h3 @7 y% a( l6 K
{
; X0 z/ r4 B- K2 ^) Z a" n
unsigned int a;
( C2 N$ R% p; x0 P% C
unsigned int b;
* `- I! ]" S0 D8 m) {
unsigned int packet_cout;
F/ _, E0 P9 G& q1 B. m
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# D7 @& f% g/ O2 I5 k
- e6 x& K) G; o% I- l+ _7 n9 Z' H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 [3 n4 c0 F4 {& E( _
unsigned int count_copy = 0;
7 G( m+ s: Q$ ^& V: G- `! h
- i$ U/ K' h9 T* l9 j/ y1 I3 ~6 i
8 ?2 ]( }+ E) i7 S: E4 Z! s
int main()
$ t @7 m. f8 R' Y7 C, S
{
s1 I# |# p3 u2 o) [! i9 E5 O7 j) v& i
pRX_MSG_PROTOCOL pshreRAM = NULL;
8 j( P8 W, H0 b2 g& S( M
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
9 L/ K5 N8 d9 A1 F. }$ I
5 L/ |, A# u! j5 U5 x0 X% g! F! F( r
while(1)
+ z. B I% ]7 B+ J7 ^
{
& B4 N; a% X# l% f6 E
read_MSG_buffer(pshreRAM);
^ q8 B+ N6 c+ M4 z/ |' D3 l
}
1 Z5 x9 h$ h/ A& h2 s. Z9 Q L
}
7 G5 b7 p: X. Y8 A! c
5 S- F W& D/ z+ V, W/ G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ ^. F, O! Z8 `" f
{
+ k3 y& ~4 a( F9 u
RX_MSG_PROTOCOL buf;
$ m& p# L* f3 k. ?5 ?
. x) x# p# T* t' X8 t
buf.a = pshreRAM->a;
" ^# R0 t3 |8 d7 g1 E9 [8 P ^
buf.b = pshreRAM->b;
/ `7 `" e. _+ i, E' Z$ D
buf.packet_cout = pshreRAM->packet_cout;
, y+ \5 [2 S, N* o3 i) N+ B% p
% C" o4 U" U2 @( `
if(buf.packet_cout != count_copy)
5 a' T8 m5 w6 y' T" t% B: j
{
$ l' r5 z e/ u- B+ G/ D0 b
printf("a is %d\n", buf.a);
& c) O) [' ?3 l+ C
printf("b is %d\n", buf.b);
; I7 F P. b# y) N" u- q2 \! }1 J
printf("count is %d\n", buf.packet_cout);
5 `+ a$ S3 f# E p+ f
count_copy = buf.packet_cout;
. i8 F1 l7 p2 K0 f% F7 c- }
}
3 W9 c7 D. N" a' c' R3 _
else
$ Y8 W8 z. n% N3 k4 b' t
{
+ C. C/ T5 G4 G6 t4 z! s' b* n
printf("No effective message!");
6 J7 R, Q% {' H0 ^& Z5 H- [
}
( U1 U; W# O: D. E, b
}
# u) E7 g3 }% x
: I7 m0 P; O' T4 M+ f6 _2 h5 d
1 ^% v. n7 q* @7 s0 N4 u$ o
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
t( f( A' ?/ z% U8 q
使用下面代码,对内存使用了mmap函数后:
0 G+ e8 Q! X# F" M+ g7 Z& T
#include <stdio.h>
. a" ^6 n. }% o3 G
#include <unistd.h>
0 i; I# B' Y/ p: g8 Y% v6 T( l
#include <sys/mman.h>
( z- I; x- G; X/ a8 c
#include <sys/types.h>
2 \# k; g6 `+ @/ X
#include <fcntl.h>
6 B0 X$ j- z8 c) E `9 I# _
s+ X* G7 \- j0 G
#define SHAER_RAM_BASE_ADDR (0x80000000)
" Y- \8 A7 K& ^( I1 |( ~8 u
#define SHAER_RAM_SIZE (0x20000)
4 a% M3 P9 b" r
- n1 }2 e6 j4 J1 ^# n d, A
typedef struct
% C$ v, M' D+ X; G3 a; ?8 o$ K, L
{
4 M+ Y2 d# S$ I- R; }) F" H l. j
unsigned int a;
5 z! I- D3 k9 _) |: C6 F6 B. N
unsigned int b;
+ n5 B6 p9 [9 t4 f; F& G
unsigned int packet_cout;
+ z' t- r" u4 j( p+ G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& k J1 c+ T5 E
5 ^. D0 P0 q5 n1 j; T5 V" [
void read_MSG_buffer(int *baseaddr);
/ N4 \3 h% {- V* B! e4 t" ]
unsigned int count_copy = 0;
6 f0 ?) i# p" W" v1 z, M
4 {4 d4 y& M& ], ^6 H% i1 z8 L
int main()
f/ Y/ X! C4 [5 X2 n" V: V0 q
{
$ O( n0 G" w; D4 y$ n0 z
int fd;
H7 _- K# j X$ \, _0 O/ A
int *mem = NULL;
, G! x+ P3 J: o% ~* N! @ J+ N
& }6 U! D( B6 c* ^4 f/ [: |
if((fd = open("/dev/mem", O_RDWR)) <0)
A0 ]# v! B' [9 m! N! k7 k; \
{
2 J& `$ Q% E- J; H. ~: {+ }
perror("open error");
4 c7 \( G* f# D7 E
return -1;
9 w2 c" x& ?: I' O: [
}
. W: h2 b8 W- M
" {& w+ m/ {) f6 Q
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 h) C# u g) c" W* w i+ ]+ K7 K9 {
8 J2 J0 R9 K& v7 X4 t
while(1)
4 L4 |5 {! q2 I' M/ _$ {
{
) d0 h6 z- l, E5 J3 E' e
read_MSG_buffer(mem);
9 t3 S; n, g! ~! X0 y
}
2 O7 n8 q# K, A6 W
}
( @& K4 ]) b! L; s% C; B0 D$ P
% K e, \1 Q$ F/ O. J6 W) |
void read_MSG_buffer(int *baseaddr)
6 k- B( h' _4 k, ]
{
% z) E: K: H- Z* f, f1 g& V
pRX_MSG_PROTOCOL pshreRAM = NULL;
' r9 d6 c$ r9 m
. B+ Q: m6 f3 M7 R. ~1 P$ p) z
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# y Y, o* {' ?# V) d. h
# L2 ~* `4 O: c7 D0 ] i$ I
if(pshreRAM->packet_cout != count_copy)
1 z$ B5 C& \! c& K
{
# V& h% H+ H3 [! b7 }- Q
printf("a is %d\n", pshreRAM->a);
4 [5 ^/ D& M% p, o
printf("b is %d\n", pshreRAM->b);
3 s7 C2 {8 ^% X2 W; x1 b
printf("count is %d\n", pshreRAM->packet_cout);
2 Z# u* ], {9 v6 \: A
count_copy = pshreRAM->packet_cout;
9 R; Z* q, x# `. x3 m
}
! ^* P$ s2 y$ f9 _
else
! v$ W# T* y8 T7 p. O, ]0 [9 Y1 ^
{
: Z. z" L8 o, o2 o# F7 b- r
printf("No effective message!\n");
) J5 }: L6 c6 q) A0 ~
}
1 g3 K# r! {7 k1 b6 w4 U9 p/ S
}
7 G- e: d; c) K& _ j3 f% z) S s. c
( I2 E6 _9 d7 C. u% q& t) U$ S9 v" X
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 ]$ n3 C8 q9 j3 Z0 y
9 y/ @6 z5 j+ L. y; {4 u6 H
3 d$ t& ~7 j! l U
4 g8 G! _# z7 H3 B# P
- p7 k* E& N7 M9 c5 v
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4