嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! t/ y H$ ~' L7 G) s# P1 ^/ f
7 y+ k9 ? r) w1 d6 C2 }
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% I2 U( I. ]0 _' P. S
#include <unistd.h>
5 t4 ~6 o* N2 z: X+ y8 S
#include <sys/mman.h>
/ ?* g+ L% m3 [9 N
#include <sys/types.h>
8 N" v+ @$ o7 F$ g! K3 E# {3 A
#include <fcntl.h>
7 X; S- O! ^# ?% \3 {" a
( q+ w7 k0 T' o" k. [
#define SHAER_RAM_BASE_ADDR (0x80000000)
& H: y5 Y) ~# Y4 X" ~
( e6 H. j6 V$ E4 @# @9 u3 F7 x. f
typedef struct
/ x4 P0 H; l7 ]7 S# e" ^+ P
{
' o- F! c) G' }
unsigned int a;
' R0 H, t) `# s: s9 r' W
unsigned int b;
; Z. h: K4 N/ Z& j
unsigned int packet_cout;
! T& ]# W; w& ]
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- X! \. k# L; j8 ^5 X" {
4 ]7 p% t# w0 k: @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* Y% j) B& i4 ~/ O7 |
unsigned int count_copy = 0;
9 H- K9 ~2 @& |7 f p/ Z
$ K4 i* ~7 F. V I
( G2 P: Q; W. R" s+ |% S
int main()
% \' h, Y. q j" C6 o
{
1 Z0 n( X4 w9 `9 u- m3 ^; f7 i u" M
pRX_MSG_PROTOCOL pshreRAM = NULL;
# E% m0 e5 e, w) k: E5 i) x6 h
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 i% f, f' f, n# q1 d$ T+ v
9 G- z/ G- Y4 V# ?6 _, U: `
while(1)
7 z- v3 i z W: g' O1 M
{
" K2 Z; |) A/ m# J2 N3 A
read_MSG_buffer(pshreRAM);
6 I/ c' E) A; [! p/ F; Q! d. G
}
8 ]' T0 q( y9 S/ |
}
1 m) A2 z# g( Y' o1 O2 y
' Y% M7 O8 V$ X/ O1 E4 l( ~. T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" t( R; f i- ~- Y' J! y
{
8 u3 a, ?" ~7 `) S' j# ^4 H U" t
RX_MSG_PROTOCOL buf;
. \) b$ Q' l* a% B( X) ]
: w j: R8 a! B2 y& z% J5 r
buf.a = pshreRAM->a;
8 r9 n& f- o3 s$ W/ E
buf.b = pshreRAM->b;
6 c# E" M; o! |" H
buf.packet_cout = pshreRAM->packet_cout;
4 s0 P. {0 U2 C
/ i. N4 s. T( A' H# [
if(buf.packet_cout != count_copy)
3 Z& Y9 t2 H) ^; i9 W
{
; U2 R* ~" l$ Q5 k) d$ C- L
printf("a is %d\n", buf.a);
/ h' k7 G9 y6 [
printf("b is %d\n", buf.b);
7 P2 V: R) }9 M$ S' h# y: y! u
printf("count is %d\n", buf.packet_cout);
, A. }, u) f' n' K6 G' ]
count_copy = buf.packet_cout;
7 Q. o; M$ P: @2 ~, [* G
}
$ s' X r" j+ d( \
else
. {5 Q2 J% p0 ~, q& X$ |2 @
{
) l) K) p" x8 T$ z
printf("No effective message!");
7 U% P5 `8 W7 A# c! R
}
6 d+ e# D5 t6 d9 k) p5 \& P
}
3 e" R( A2 R3 Z H# y) z% H
; ?8 l- L4 {4 h* X' @& a |6 C5 M3 m
$ n$ V5 B2 S* y$ k
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! z: S! ?% W8 y
使用下面代码,对内存使用了mmap函数后:
7 ~+ l+ u& }/ l
#include <stdio.h>
& R" l. n1 b/ y( x+ f# o- b/ Q) L
#include <unistd.h>
# L4 m1 I: i4 I" }
#include <sys/mman.h>
6 C5 a1 z' e @" L, q+ R, d
#include <sys/types.h>
: D2 q* y4 i/ k9 h7 w% W
#include <fcntl.h>
9 R; F7 s! R) o. W8 c( A
% P% H. u2 `+ T1 r2 [
#define SHAER_RAM_BASE_ADDR (0x80000000)
$ d! Z' \0 a! E: r) |
#define SHAER_RAM_SIZE (0x20000)
: D# s0 [$ J9 ?+ w F
0 H( g+ v# _" w" q0 A
typedef struct
3 u: P- r0 ~4 S' q, ^5 \/ T* z
{
& k M# N. ^- ~, i( Q' S1 z
unsigned int a;
3 Y8 G {1 U& H# y# m2 t" E$ o/ h
unsigned int b;
/ J2 d' \/ h4 Q( {
unsigned int packet_cout;
% z" N" T* s9 n9 q M/ k% x
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% r/ D: F9 i1 g6 b' H
; i5 u; g6 L7 d% p% z
void read_MSG_buffer(int *baseaddr);
* |3 u) G$ p8 |) ^9 E t9 l
unsigned int count_copy = 0;
+ w4 o7 n; {6 e) A5 K( L8 d' B! d. D
# f; f7 p, m+ q a6 J+ @
int main()
5 {7 z. J1 w7 E. [3 h( j
{
; P0 @6 v: V3 P W% Q
int fd;
1 a4 O' n# O7 d' Q/ e5 T
int *mem = NULL;
; N( Z5 v5 O' R( E. H2 C' |
" f2 B3 R" l w" Y8 |" @
if((fd = open("/dev/mem", O_RDWR)) <0)
4 r- @+ i& r v4 ?
{
; H$ L* o/ c. |# j
perror("open error");
7 @2 M) R8 j6 X4 O" h* m
return -1;
( _: t/ [2 o% M9 I9 {' k, v
}
( {% U% y) s/ P6 W8 q8 r1 V" e. ^
( k, C+ r9 Z8 a9 e( t' J4 k
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, x# l; t, S( u5 U& X& w, g
7 {% D( j& q' S7 G2 o
while(1)
2 ~6 Z( c5 M2 g2 H, }4 m
{
# U0 @6 Z* H. e/ w
read_MSG_buffer(mem);
7 j3 W4 H$ _( B& i
}
( |9 @! V- _- U* m+ J# {/ n- `' p
}
5 x9 {0 A9 i2 |
& Q3 M8 E8 y8 w! a, \" z) W* ]
void read_MSG_buffer(int *baseaddr)
* M) o$ u/ i. h& H3 D
{
6 j: f7 ^* | ~; y) H5 _' u& |
pRX_MSG_PROTOCOL pshreRAM = NULL;
# E; r( M2 O0 a: C" a
+ ^3 p1 ^; i) L8 ?* E& r
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 Y8 r' p5 p, S
. G+ ]( u" n: u
if(pshreRAM->packet_cout != count_copy)
& ^8 f, W$ q' T9 ~4 b
{
% L6 x' e$ B! E) K8 N
printf("a is %d\n", pshreRAM->a);
' A- y [& l$ M5 s9 P* {
printf("b is %d\n", pshreRAM->b);
0 u8 E: b6 n& }3 y! H2 j. \
printf("count is %d\n", pshreRAM->packet_cout);
1 z- ? k. @0 }1 q# E9 y
count_copy = pshreRAM->packet_cout;
3 H' G+ F" Z8 t4 B/ N+ w
}
* ]7 q" R( @6 }, P* S m+ E
else
' K7 k$ ~# A& p+ f6 a0 D
{
3 M4 C. x {3 a0 v6 Y: u6 h$ J/ c
printf("No effective message!\n");
* X! f1 i: @8 S W1 ^# V
}
$ G1 v9 g2 d9 M( [. z6 m3 A
}
+ u/ _6 _- _$ B. k* r
( x. | ^9 O T4 Q& C& [. j
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ |3 Z. U6 {+ F; V# G- _
6 `2 A u) e; @- X7 e5 W2 c
& o; s8 W! Z1 l/ ^( R$ J$ i: w
1 R8 R3 A- y6 I1 Q
$ C% l( Y: n/ U) F. Y9 \
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4