嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 Z$ g& ]+ M- R% M1 l8 k
5 J+ Q/ j! h7 d6 M
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. A5 X4 Y+ \1 u* V9 x1 K
#include <unistd.h>
+ n9 V: d2 V6 a: N8 f2 t2 }
#include <sys/mman.h>
% O# S/ I3 R2 p8 h& U2 d! O, S
#include <sys/types.h>
' ]3 ?; |& l, j! M! _* ]
#include <fcntl.h>
& \/ c1 P* _( L- K! F
8 S G+ M4 O$ S$ {! X9 [0 [: ?& P
#define SHAER_RAM_BASE_ADDR (0x80000000)
- d" @, g" M+ q$ d6 K
8 p2 q# @ E& c; z' L
typedef struct
3 e1 U8 h4 ]1 o f
{
1 L( {% s1 Q$ l' J/ q7 |3 _" P
unsigned int a;
: i& Z% k7 ]1 ?9 V( v
unsigned int b;
' z% m+ K9 C9 g: r" a
unsigned int packet_cout;
$ t9 [/ a, [. H9 H9 I, P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 P7 P5 ~; W! w( I
" h' D, W$ Q$ s) M& H% I. ~* D) ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, k s# j3 H0 m+ l4 T' M
unsigned int count_copy = 0;
$ n: P4 C' `8 E) L
% w! x4 ^3 Q9 `9 n3 B
( C7 y$ h& D, I3 C
int main()
2 I2 P: [& S6 h* {& { A3 O' W7 G
{
. z- n' E' u' p( |' Q0 H s
pRX_MSG_PROTOCOL pshreRAM = NULL;
% O+ y0 b: l Y
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
& ]# \7 ^: a0 Q" P, r9 r+ Z
6 V6 ? @$ y' A1 W1 U
while(1)
, S* a6 {5 v) G6 y- @
{
% z/ t5 L( D; f9 b0 Q& W0 @, [, h# Z
read_MSG_buffer(pshreRAM);
# l' l% B9 e; k6 M( F
}
3 v0 F) f8 l0 z- P
}
: X7 z: Q5 W& _; L5 k' O" z
# Z" v7 d' a& n. [ y; q( j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 a( H$ ^& g) q+ y w) g% g
{
- x+ a4 p4 M8 j) D6 d# p) u
RX_MSG_PROTOCOL buf;
: D; G! B M; v7 H
4 K5 ^ k# u6 @" j+ P4 |6 @
buf.a = pshreRAM->a;
3 J1 i: o S3 ~- h; s
buf.b = pshreRAM->b;
8 _6 W5 M; ^- }3 G$ z/ g4 Z v" e
buf.packet_cout = pshreRAM->packet_cout;
) A0 \( L5 J7 g( |! e" R4 q
& x" }- o2 I* `4 A2 ?
if(buf.packet_cout != count_copy)
' ]( D: O1 q! }& f7 o% r
{
. o7 X$ t6 ^( {7 ^' K
printf("a is %d\n", buf.a);
( h# B4 D* e" Q
printf("b is %d\n", buf.b);
( l. i5 W0 T, H4 K, y
printf("count is %d\n", buf.packet_cout);
" {* ] i7 q3 f
count_copy = buf.packet_cout;
& U3 L- k' R/ m9 g+ [3 M
}
8 K2 Y9 G6 t" h% M
else
$ h9 X/ e7 c( |4 j7 ^
{
5 h W5 o$ \+ j8 D8 s& N
printf("No effective message!");
F( ^8 F2 P2 u- H; v. k
}
4 F0 p6 {. d1 `9 m
}
& Y# M! u3 o+ X' v. W$ n) o7 G
5 D5 f% m6 b6 x% P) t' ?% x/ A
, w& \% b) {. [ q) O6 Y# }
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
+ w8 L7 P$ R* I r w p
使用下面代码,对内存使用了mmap函数后:
2 p4 M) c0 Y3 H, `2 s
#include <stdio.h>
4 V! p$ Q, z# w3 I7 K# t. K
#include <unistd.h>
D+ _0 T2 S/ V% M p
#include <sys/mman.h>
+ e' K( Z- ^) e" E! F
#include <sys/types.h>
9 J i% w+ W( _* C8 j+ {$ B
#include <fcntl.h>
a0 p/ F2 h# H( |
, N: {% E9 z3 S7 |; }: ?
#define SHAER_RAM_BASE_ADDR (0x80000000)
1 o$ z8 t6 e6 w
#define SHAER_RAM_SIZE (0x20000)
5 a; s, h/ n/ `9 r6 r- Z1 n
, _; A6 R( g( H( {7 J# n( O) [4 G% q
typedef struct
, Z5 ?8 I( k: I) b1 {9 u k
{
o8 Q$ }( {' f% p4 \: P
unsigned int a;
: ?+ l& O" b* k8 B& v
unsigned int b;
# y2 }: U8 ^9 ]5 Y: O
unsigned int packet_cout;
k' H5 V' |- z. \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' ^% f4 E* {- }5 K4 U' _# J1 J6 O y
+ F' C* C: Y/ @7 G+ M `) c
void read_MSG_buffer(int *baseaddr);
1 h; s0 J- D. s$ }8 v% }' J% t4 r
unsigned int count_copy = 0;
- s$ J5 s+ g8 E; h: J
' j' k! P/ w& i. q+ \
int main()
$ m9 ^# s( _* Z2 I+ z8 G& q
{
3 p, H/ O% h/ G& H% V
int fd;
3 k" y; J+ `, C( @* l( r$ g( n& G
int *mem = NULL;
& O' f+ d0 ?4 d9 n, F+ ~
. d/ {; b0 Y3 m5 G# J& f% R
if((fd = open("/dev/mem", O_RDWR)) <0)
1 v$ W* U% Y2 l: \) z5 p6 D' \
{
2 n/ O4 e8 W! u a! Q J9 O
perror("open error");
1 J( g. J" y2 t4 t, c# I* t: h% c, C
return -1;
3 A4 P- o, L, j# Q5 [
}
6 O( |# c+ \, C$ O9 n6 w6 f
; H4 P/ k* t @( y6 D; t9 P
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 O2 l; L! d" \5 S1 e
! `0 g6 M t0 k8 ?9 w" e0 c, m7 ^
while(1)
+ n) H/ c7 N3 [3 a; m
{
; u: a4 \+ L6 T% {- V
read_MSG_buffer(mem);
% P0 X4 x; n0 H+ q2 X/ I
}
, _& X" b( W2 b0 q- Y8 h+ X$ \1 j' A j
}
3 |1 r! Z/ ?4 U/ Q: T3 R
+ r! z+ Z/ w% _; R3 J* P( d4 h- R$ L* U
void read_MSG_buffer(int *baseaddr)
) f+ w: B; P) N6 ]+ r% A8 A5 h
{
, O) O; i4 Y6 a+ v2 Y! E
pRX_MSG_PROTOCOL pshreRAM = NULL;
, q y6 J+ R5 k6 U) X" S9 n
" H+ \" o; c+ T9 E3 x2 y% G6 U3 v
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ F+ E! f% x1 Q0 Q% n, O
1 M/ a7 P' i( H% R O0 U
if(pshreRAM->packet_cout != count_copy)
! e w- b* a) B7 j+ ]& n, E
{
+ U. q. ]" K) w: K& a: S/ \
printf("a is %d\n", pshreRAM->a);
9 s# [) Y2 Z) p' k
printf("b is %d\n", pshreRAM->b);
0 H; B+ F9 }# b' N7 @7 l7 @
printf("count is %d\n", pshreRAM->packet_cout);
" {, O; C8 {5 x2 v7 {! D/ M! h
count_copy = pshreRAM->packet_cout;
0 t# N+ \$ j( `3 [, J
}
. b6 n/ V5 n# f% [7 A& g! ^" |. l
else
8 S. g& f6 {0 q& u) O( B
{
- Z' b( d+ c3 G( B+ B w3 B
printf("No effective message!\n");
2 n7 d! ^& X: R9 Z) q
}
; s8 m/ P; z4 J2 K9 ~- S
}
' H9 o8 R/ M3 ^5 L
- U3 y3 S+ @" |( x. c
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 ~+ C/ b2 i3 m5 I3 o
; E9 T x' J t6 G9 r' Z
8 w8 w) V0 e+ }
6 t' t7 H% B9 }* y( e% M
" z5 S% O+ w4 W8 [
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4