嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) ], b; u3 b% n( Y6 N0 o7 |2 Q* b
- k; K, Z& Y; d6 S. l, Q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 Y2 ?, t' U1 G; x0 H* @3 e
#include <unistd.h>
. J1 I5 ~4 \1 Q f* r+ k/ I
#include <sys/mman.h>
: n9 Z( n+ k6 Q! [% L
#include <sys/types.h>
- ~) C+ z0 [9 t, {. s! g0 T+ O# \9 q
#include <fcntl.h>
# T: N+ F2 O, G2 M* ~* D% m
" n7 ~9 U, t2 M& r4 |
#define SHAER_RAM_BASE_ADDR (0x80000000)
7 M7 D/ c3 L/ e" q- k/ y0 m) I" ?
; x6 s( W& O5 C S( m: z
typedef struct
& r% W/ K' M ^8 R% s
{
6 K7 m! O- w+ q
unsigned int a;
- p; }3 |2 s; G) |% Z, s
unsigned int b;
5 M$ |" ]+ q! Z- Q& A1 ?" V
unsigned int packet_cout;
/ N- q: l; } d+ [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( s, t0 q0 q% S1 t* Z! r
7 b: L3 x* ?2 J7 T0 Z' t# W" A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 y/ Z0 _+ O3 u" G0 W
unsigned int count_copy = 0;
0 d+ w/ e) ?4 U3 r; a t8 W/ M) ]0 c
7 p- U) m$ x1 o- ], e6 h
- k, l- G2 D) c
int main()
: [* P& u9 b2 z5 i( @; l9 f: i7 b
{
% Z/ A. M0 H) W8 t5 L# Z F
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 a5 _; F" e1 i0 o3 M; l
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" E3 `: u% h N( [* S! j
9 d3 r0 i9 q+ f8 ~
while(1)
* o" D4 A( C. ]/ k% ~ h" n: w
{
4 o5 m6 @8 A9 E
read_MSG_buffer(pshreRAM);
3 j6 D [' _& p6 G% B$ x
}
" Q" I8 O. R' P/ y& p
}
$ s4 S9 d4 o% b
, d' E1 y2 B+ w: R& G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* }$ K; B. M9 L& ]3 C, i
{
3 A6 U$ d4 M! V4 }2 I
RX_MSG_PROTOCOL buf;
1 b& N5 v. y( ` i% s7 t. |7 O: T
' ^1 I/ M5 A/ N# @& D% N0 ~
buf.a = pshreRAM->a;
- G1 e% T/ Q# N7 P8 R1 R5 |5 j
buf.b = pshreRAM->b;
4 B$ m9 e8 o* ^; _0 z
buf.packet_cout = pshreRAM->packet_cout;
; e/ K' s1 T) p- O$ Z
N& D2 W6 p5 c1 ?5 ?
if(buf.packet_cout != count_copy)
% e5 g1 J" r& V. o3 G
{
1 z K9 w6 T5 O8 Q' ?
printf("a is %d\n", buf.a);
. r: |) x% a7 \& G
printf("b is %d\n", buf.b);
2 d) E+ Y/ C) j9 V( E
printf("count is %d\n", buf.packet_cout);
7 C$ E/ m* A4 u
count_copy = buf.packet_cout;
; P* U6 ^+ a" z9 D, p
}
% t& J/ @* u: P1 d
else
l0 F! i" o. L ~4 l+ [
{
8 P% _$ _ G, K; Y
printf("No effective message!");
* S6 O$ f f+ [# S
}
/ c. ^/ J4 J0 G, P; b
}
5 @' h/ b7 T9 g+ ^# d. o2 ]
- h* G- c0 u2 `- F( E" V1 K# I6 l6 j
p* l, {/ k4 @% J
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 w2 V; p! H; c2 _: n
使用下面代码,对内存使用了mmap函数后:
2 W( x1 Q/ a4 T+ Q+ S
#include <stdio.h>
, r0 [1 W' [: q; x0 x. q! h& H
#include <unistd.h>
1 C8 `4 A. e }; J" }: z
#include <sys/mman.h>
; m* Z n; q Q$ M* z2 ~& Z
#include <sys/types.h>
& [1 h& F% e2 G6 N( J
#include <fcntl.h>
* X+ P& g2 A& R2 c8 Z9 @
6 ]6 X6 l; t5 C! J+ u3 P: E2 |$ ?
#define SHAER_RAM_BASE_ADDR (0x80000000)
/ ]0 x# V, `) [& E: s
#define SHAER_RAM_SIZE (0x20000)
?5 F" A% }, r2 c* |, g. G
/ k, }& G" ?0 e$ }
typedef struct
, T, p0 b) }& t2 `# x# `6 A
{
: ~! N: |' O) _5 o" H
unsigned int a;
! Y6 E' i1 c2 J0 Z' t
unsigned int b;
$ d! ^& U& T7 r
unsigned int packet_cout;
; i& R1 Y; M/ m! A: I7 z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- E$ v3 U8 @4 @6 ^0 ~7 _
. m" h( w& X9 }: l6 E
void read_MSG_buffer(int *baseaddr);
. @9 O4 P5 K, ]; O( t% q. ?
unsigned int count_copy = 0;
5 x2 K1 Q. s8 d0 u1 B, y
. Y4 ]( c# N) r& p0 [( x' z
int main()
9 E7 C: |) T0 K/ A
{
6 B0 D) x$ U& e, K! C- R
int fd;
y" C5 [/ H* i5 g) I
int *mem = NULL;
/ v x) r$ T+ j9 [5 S+ y& {( B, J
, c7 a$ f5 ]# e! h$ ]7 X( X3 A6 Q
if((fd = open("/dev/mem", O_RDWR)) <0)
/ X4 P0 B6 E5 O9 W/ d
{
' K/ c) Q. [& p7 y1 B G
perror("open error");
( D: A; b; p' K& T8 r0 J0 \4 |8 Y
return -1;
- T/ ~4 m0 F- K$ l
}
& c; x: R; K) k
+ {2 Y7 J( Z# A9 f3 S. k
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; H h% e9 F0 `" |& Z' [
* j4 T. `- I/ w$ P
while(1)
7 {, o ?% H/ B
{
5 f* [% Z! s+ M% U. y0 E4 P! ] l
read_MSG_buffer(mem);
) ~+ [4 X6 T) g* s
}
7 w; v5 l3 }6 l) t
}
" e4 j: T& n( f5 D1 p- s
$ e+ k% O) H" J3 L4 O
void read_MSG_buffer(int *baseaddr)
, M3 ~1 i7 u& k
{
- X+ f$ D0 s% f* i0 f
pRX_MSG_PROTOCOL pshreRAM = NULL;
* c5 r/ h$ Y0 J4 `8 m+ X+ _
8 D# {/ w; Z! ^, E0 r" a7 B
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
o' F8 b/ W0 e) X* {
( k4 d1 s+ i- H: X
if(pshreRAM->packet_cout != count_copy)
& }* N* l; { a9 b/ |
{
% b% B+ U* V4 n. H, v
printf("a is %d\n", pshreRAM->a);
. _- a2 c$ Q1 Y" ?1 R4 ]/ [
printf("b is %d\n", pshreRAM->b);
' F0 D+ d# ~$ {+ R2 N; w. e
printf("count is %d\n", pshreRAM->packet_cout);
( h1 Z% Z: s# t) U- A: S
count_copy = pshreRAM->packet_cout;
* D) e1 ~; u+ \
}
, R0 _6 _: @. @+ o# s
else
4 }: }, \0 }0 z% \3 N! q9 x
{
9 N- h; f$ _3 _% A5 J
printf("No effective message!\n");
2 C. N, V1 N5 K; ?; z
}
7 n! D1 ^- {; [7 y$ D/ ?
}
, @' _+ A B7 ?
; F" j$ K$ |3 P* r. s/ B) V# q
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& T& w; k( J; L" Q5 r
* X; N2 T, S. U3 n8 f# W0 F$ Z6 j
0 E9 f0 _: q3 J8 \( |9 @
% @' B+ h: }8 R$ m `" n& O/ v( t
" A+ n* U4 O9 b/ X5 L: t) z" _! {
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4