嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& `, R- G+ p- U& f' k. k" l
, ]7 m! V! T0 B0 p! B9 y. N
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 O2 O; o2 k; o" F* _
#include <unistd.h>
8 Y N" R9 D% w& X
#include <sys/mman.h>
5 B. C* f' p3 w ~- r
#include <sys/types.h>
$ i6 ^/ C, A$ c* M3 z* l
#include <fcntl.h>
; _/ P% N* b; u1 q& `/ m1 y4 n
6 K/ r; w c4 ~0 i
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 [0 Y0 W5 {3 S' G2 `8 K
+ }+ q6 B/ W9 l7 C2 [* |
typedef struct
/ k) N$ N$ _; a1 {5 G
{
% k o4 H4 N' A9 i# `( H
unsigned int a;
- ~6 ~' y- m% }" R+ F
unsigned int b;
1 H3 A% o0 x( \% I8 G! O# [
unsigned int packet_cout;
. W0 u# b4 Y2 E5 Z. o
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" Z3 L' H8 {, u; h: s$ }
( e/ f: i5 e' r- D" ^! _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 a* Z1 w2 k- Z% `- h
unsigned int count_copy = 0;
( H5 d3 q H7 [5 Y9 y6 W3 Y4 W) b
# g0 j- I6 x3 E
9 y5 I$ J+ |/ Z3 k
int main()
5 L* F8 `4 S+ W" Y% l/ \$ c- n( ~5 W
{
4 d4 o0 c: W: Y. o. \4 A) r
pRX_MSG_PROTOCOL pshreRAM = NULL;
; H" ^+ m# i6 ]5 H' g4 x" {" j5 l
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, }5 U+ T( b. j- u& u
4 k3 e+ g2 t, I. D# g" h: C
while(1)
; v+ D V3 w- h# ^4 Q' |1 }
{
% X9 _- ^4 p7 m2 t" B/ `! r0 \
read_MSG_buffer(pshreRAM);
/ M1 s8 |3 A: v7 w7 ~$ M' {/ Y) }
}
8 E5 y; W6 A6 w$ C O, i$ f
}
, m( v& B" }/ K+ E& S" n
/ f4 l, b7 d/ H+ {; E; D/ i8 q, m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ s S! t5 i7 y% D# t3 ]6 U+ M
{
, ~0 ~/ v$ z) N ~
RX_MSG_PROTOCOL buf;
) r3 B0 C) h/ F
8 r; `/ L' D. K8 H. }7 x. s0 m
buf.a = pshreRAM->a;
3 I2 A# T4 U* B* k( d. N
buf.b = pshreRAM->b;
u, g4 J8 I' z/ x1 r
buf.packet_cout = pshreRAM->packet_cout;
: s9 A6 R3 l( l5 Y* e
7 m( N8 H1 l6 H$ S7 q6 p( ^
if(buf.packet_cout != count_copy)
: E1 Y5 ^. j) t# A7 m% @' p7 D
{
) k4 s# j ^- s. l/ |. A
printf("a is %d\n", buf.a);
6 A- }) h3 O8 T7 r! x; t! n8 z
printf("b is %d\n", buf.b);
* X: c4 C2 x4 W; [* ~) X# V2 r/ w+ S
printf("count is %d\n", buf.packet_cout);
4 ~; W9 N' }- ], q2 f
count_copy = buf.packet_cout;
. W6 K% M$ Q9 F' E& }! E
}
* m* {3 K3 z! K% G2 q
else
$ r$ [0 b$ q6 c- G5 Y
{
( f5 A2 v' b E6 k" U
printf("No effective message!");
, W& C7 l* v( d6 N7 H- G$ [ x
}
+ G5 j; E# [% f# `; k
}
: C4 b* w& {0 o9 T3 w7 }
# O0 z2 v! r+ P
% s5 U' V$ s) f# S# U
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ D/ k! {( j7 g! P6 j& U2 ~* B
使用下面代码,对内存使用了mmap函数后:
. f0 y- f! f! }
#include <stdio.h>
8 M& S2 k2 Q! r8 p) ~
#include <unistd.h>
3 C% E( p+ u2 e: {7 ?1 K C" ^
#include <sys/mman.h>
7 t5 t. C8 v& c! |2 }
#include <sys/types.h>
4 o! p$ U7 x# `% p4 L8 H! p; u R
#include <fcntl.h>
; q+ F5 v: ]% ]+ Q+ E
- ^; _4 Y. s- X, R, e
#define SHAER_RAM_BASE_ADDR (0x80000000)
+ m* j) q4 [/ h W" j- n5 m
#define SHAER_RAM_SIZE (0x20000)
$ j! N |+ Z/ ]2 T* i
- u/ t; ?8 `2 g) `2 R
typedef struct
$ C: v/ h# `4 M, h! O
{
( S4 R$ }8 E3 E
unsigned int a;
! ?& i/ m8 C# h5 r& {0 |5 l
unsigned int b;
5 D5 U6 |5 \3 p: a
unsigned int packet_cout;
k4 o0 b k7 e% w, Z' [2 l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 l, z3 g2 ^% \9 L8 ]+ K$ j
' m; R: U3 C, b- n9 g
void read_MSG_buffer(int *baseaddr);
4 I H8 R w: ~' e" B
unsigned int count_copy = 0;
+ |0 R7 @9 _, ^+ X
/ v! c$ r" ?) L! _! a
int main()
* h- P8 j. T. J+ z0 h6 L$ d0 [
{
) x: X2 e1 H5 b+ Z
int fd;
+ T" f v7 d$ e% H+ X
int *mem = NULL;
: G+ J5 f% B" V3 o# J8 y; M
, `. g; w t5 `+ `
if((fd = open("/dev/mem", O_RDWR)) <0)
6 |8 Y: q+ G! ?
{
/ o6 T8 \4 E# t2 U7 x& @" f; O
perror("open error");
4 B# U8 {9 y/ O) l( g [9 O3 B
return -1;
0 e0 J3 D9 n, t0 I( g
}
G; e( T3 `% ^" s, A: c C5 o
1 n/ `' v* D( H! i! _" R7 K- @/ M
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 w4 h; T' g( I# }, b8 \6 M
, e6 c/ r# R. F; B1 w1 `0 W- X2 V) t
while(1)
/ O; a" r1 U& P8 ~
{
4 B0 w# i- `& F( o7 l2 |
read_MSG_buffer(mem);
6 F& l X6 T% E w
}
, D+ D) ?( x6 V3 p7 X! b1 F! x- w
}
8 p" J" Q4 n9 r* C+ [. S
/ r/ n; }( P0 N. w, |$ S- C2 O
void read_MSG_buffer(int *baseaddr)
4 a# i% _0 S2 G
{
4 z& [ ^! S7 ?- l W5 S% l1 a1 @( ?
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ y: B7 k7 Y/ |( T; e& g
. B+ _4 b' N0 f- X1 M. R
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 {2 [, g' w+ `+ \) e
/ p2 G3 S- E% l2 p! Q, o
if(pshreRAM->packet_cout != count_copy)
/ u% Q$ |* {- F. h6 u# R
{
% X0 h; o' W3 G
printf("a is %d\n", pshreRAM->a);
; b5 s1 V' r. M8 f/ [7 ?1 [
printf("b is %d\n", pshreRAM->b);
' n1 |* N) M8 `2 B/ ]$ t
printf("count is %d\n", pshreRAM->packet_cout);
U' b/ w; Z3 s$ r2 O/ L
count_copy = pshreRAM->packet_cout;
8 {6 q! ]; x( `7 }- L/ H
}
; P* ~) |; _) R s& R1 H b# `
else
1 r0 H0 [& }" }7 I1 n
{
! k( U2 o+ y: ?% v) `
printf("No effective message!\n");
- w( }* Q& ^5 B3 @
}
+ ?: Z# S: @$ W( N
}
: x9 P K5 s7 o4 _$ J$ D" B( C
' D% W4 g y* F
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: b0 H( m9 V2 o1 t4 S3 Q
0 E2 W# W% n: ^
! m) ]' S! r# H( z
( U6 n* n: {3 s! _" G+ O
" r$ Q" M: V0 A+ N
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4