嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. U$ V# C! L# f) t
0 M: k1 T( f+ z1 b9 }# x) x
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
, z' a: R1 Q2 V! e9 N7 S
#include <unistd.h>
8 O0 L- [ P# q* d+ G, z2 a+ |
#include <sys/mman.h>
" B/ S/ e& v' d
#include <sys/types.h>
~2 j: S, {; x3 m+ s
#include <fcntl.h>
) Q: N1 @; Q2 [: ~* l
8 q' T% _ a: {; b" j; p
#define SHAER_RAM_BASE_ADDR (0x80000000)
7 a. D; F- b ^+ J% o7 v0 p
2 n( h3 V& d+ v, t4 `8 {; T n
typedef struct
( J" B9 t7 q5 [7 S
{
; h2 |+ d) A; r
unsigned int a;
: B, I Z2 a$ g5 p, v2 x( S n
unsigned int b;
4 E+ L( h+ ]8 o( S
unsigned int packet_cout;
1 ]7 E' Z* {, w8 ?5 L5 j
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' q4 \% K- X$ I7 y) U* f+ x
' g+ t9 g# s7 ^- p# \! C
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% F2 z! }6 F( V# p, ~
unsigned int count_copy = 0;
7 _+ \3 M9 l1 u& d, o' X' |; \( D$ h
+ v+ \7 W7 s+ L6 B
! M& K- i2 e3 I
int main()
' [) R9 B7 t y2 e: _( n6 U
{
6 A" G3 i9 K u, j {
pRX_MSG_PROTOCOL pshreRAM = NULL;
( }* E5 [5 ]4 l( k- K" L6 e
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
8 c" \0 H! `$ p" `( H6 R- Z/ V+ C. B1 a
8 N/ K. j; ~- d+ R- A# X {
while(1)
2 l4 U: O: y) y( j, S3 s
{
" V& K( G/ d- e
read_MSG_buffer(pshreRAM);
$ m3 M6 N7 X! d8 _6 K5 T$ q/ [
}
8 _5 I6 y1 H) M4 V* H7 u2 Q
}
8 a* }7 ? J. O1 p0 l' Z! Z4 _% b# z
* }3 ]" }5 m) ^& R0 B( \# z" |* A+ a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, S5 T! }, j; W7 z4 `
{
1 m& `: n7 f7 X- s% k, Y
RX_MSG_PROTOCOL buf;
! x4 z1 v _& E3 l U; P
6 w3 M. A3 n3 a9 z+ M
buf.a = pshreRAM->a;
! q) `4 h* s% Y/ |9 r7 V1 r4 \3 R
buf.b = pshreRAM->b;
: ]$ k4 K3 [2 D8 p0 W ^
buf.packet_cout = pshreRAM->packet_cout;
. \' u9 i8 q4 F: K
2 o- a# m/ k* }4 @
if(buf.packet_cout != count_copy)
- R k, {% O8 u0 W4 s: V* n
{
. o$ n& h! N) r2 N/ A
printf("a is %d\n", buf.a);
' b7 Z7 B) M3 E
printf("b is %d\n", buf.b);
W6 C( X5 X$ [
printf("count is %d\n", buf.packet_cout);
* w; _ c' Q9 N0 c$ H0 U K
count_copy = buf.packet_cout;
* x0 H1 L: |- U# x: A
}
9 ^ N9 }5 D! c) d
else
8 r3 J4 K1 D s/ ]8 O& H
{
% M8 Q; H/ A9 S; U5 r& b
printf("No effective message!");
0 ^9 v* G5 i6 L
}
* N+ Y! I9 Q) h( M8 {' _/ H
}
2 r: D0 z* T# Y" m
! ^* Y/ o1 X5 d) s! Q9 G: N4 }
# m; T; @. m$ u( l
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 T5 W4 p% o3 L0 g) y
使用下面代码,对内存使用了mmap函数后:
, {1 Z- z+ C: Z
#include <stdio.h>
. e. l. y. q& h- U% {
#include <unistd.h>
& D; ^' v9 C3 g
#include <sys/mman.h>
; }2 X! p/ ?0 s n
#include <sys/types.h>
+ d+ D, U/ W' Z
#include <fcntl.h>
8 E$ b5 q* l& j' v. x8 C \
; T7 a; S) @) O6 d/ X% u( G! v7 M
#define SHAER_RAM_BASE_ADDR (0x80000000)
. ?! ?6 C& }5 j% R. z. h* u
#define SHAER_RAM_SIZE (0x20000)
8 y/ ?2 m0 Q& s" I' M( \8 d
3 E) Q5 a. b2 x6 y- b
typedef struct
+ S! k- C0 l6 |/ K
{
9 m5 x0 G9 d/ Q$ ]* u5 ?" R- H
unsigned int a;
8 z! v" U L5 H# K
unsigned int b;
, B% g5 |8 P( v. a" O
unsigned int packet_cout;
1 j. c, E& u$ K( [; w [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* T, w& D1 v" \% U* W& i4 E7 d+ ]
+ _* x. N/ k+ r( z0 z4 |; U
void read_MSG_buffer(int *baseaddr);
8 f0 T( Q$ Z7 N! Y3 P* a& L& u
unsigned int count_copy = 0;
& p" [: f' D3 q/ F; f5 j* k0 t
/ ]" Y' t& v) q3 w' V
int main()
- D. I7 ^: M6 n
{
5 i* m# E z' J$ y
int fd;
1 u% |) Q0 ~! p, Q$ X% H) g( V# v
int *mem = NULL;
( l3 [4 S( s/ T! E& w2 M' f9 O' ^
3 T: k: {, |5 g' N8 Z
if((fd = open("/dev/mem", O_RDWR)) <0)
- g' C2 A9 M6 H4 q8 T' S! y# @1 f
{
$ T- x( M6 t$ S* {
perror("open error");
4 Y* j' `# y% F1 i
return -1;
! D( \- }1 d! ]% @
}
; L) f3 Q s2 l5 U6 D
7 F0 t+ ^8 T1 ` V* Z
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
" H4 j* Q8 b5 N9 T% e" A
* Q( L6 ~ l# i! z
while(1)
3 Z6 ~5 X ~0 t" i
{
) N1 B, o7 s# {- V
read_MSG_buffer(mem);
7 a& e. }1 J+ I2 {1 b5 w
}
3 T: b2 }- t4 w; }) B: h
}
}) y9 L p7 W0 [6 H& @- Z
5 h+ u- e, X! v# I; x
void read_MSG_buffer(int *baseaddr)
1 A! @0 w0 c o- A2 |! V+ k
{
: R7 @7 {8 Y: u4 b: c
pRX_MSG_PROTOCOL pshreRAM = NULL;
; m7 F4 c; J2 m, ]
! B; R$ i/ @7 z+ J' {3 ]
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
2 w+ f6 L, u1 c) S: M
" t g: F+ [2 p# c6 @6 K) Q9 D
if(pshreRAM->packet_cout != count_copy)
. K: X& I7 y' x- b8 } R* @
{
/ [- Z, Z( q4 h P
printf("a is %d\n", pshreRAM->a);
+ \4 @( w, [, \+ g+ V* A0 J( F
printf("b is %d\n", pshreRAM->b);
: T: ^/ {3 w2 D- f0 O+ k
printf("count is %d\n", pshreRAM->packet_cout);
; W. Z( v7 h; {# y/ c
count_copy = pshreRAM->packet_cout;
7 |& ]* _1 l" ^- K& m! Y( M
}
" c( o% F; _( P1 D
else
( Q( W8 v- X' M' b0 Y" V
{
1 J" [+ w: f- y/ [* x
printf("No effective message!\n");
; ~# R. g6 p# a% k% l7 [) u
}
6 ?4 m, k6 F! U3 I. S7 A% n! L+ w# F
}
- F* U: }/ _8 l0 Q2 H
; w* x' I* t0 ]) v: O0 Y- ^7 z7 L/ c
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 ?. [# ~ [4 ?4 G' ^+ N/ f7 Y
: O4 Q$ T! v g$ ]& W0 f) @8 M
# @+ E- X, S( ]
( \8 U( O3 s: s; z
: E, e- y+ P* u' ^1 P
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4