嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" U9 \, p9 u; T; m2 r) P
. c' ~9 ^, s8 v9 D3 e
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 ^% |% R1 z6 } y$ a! I
#include <unistd.h>
6 U0 |# F) R E- k4 e% G
#include <sys/mman.h>
$ t1 t X4 d6 D- i
#include <sys/types.h>
9 f, Y: c( c d; U3 V4 o
#include <fcntl.h>
( K5 |! m* E, \. [
1 M* Y( b) h% ]4 _8 S" G' o
#define SHAER_RAM_BASE_ADDR (0x80000000)
. F1 b- H, v( `; U' P$ ?" G
! Y$ q2 u& z% j) P9 [' r* U* h+ v
typedef struct
& q$ x. D8 b6 u1 W4 T( x- T
{
1 ?5 m+ k; K8 ]% l& a% O4 n5 C
unsigned int a;
* V, Z9 m: ?: O! C
unsigned int b;
, }; t' m& I1 u
unsigned int packet_cout;
0 {7 M6 \7 _ G% g6 o& h
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 P1 @; ^7 [ f1 T$ v( n$ V
! g% E6 d' D# l1 X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
+ l# N5 {% G& L$ [$ u* _0 t' Q
unsigned int count_copy = 0;
! l5 k' j |' w* p
- X+ ?" f. i( E8 k4 P7 t# \- @1 [
5 }+ \! h0 }" e* K5 D* d% o1 r5 y4 o
int main()
$ x9 ]/ y: M' b9 r3 b% {
{
( P |* U! d2 _) r- d
pRX_MSG_PROTOCOL pshreRAM = NULL;
, P1 X, [8 a2 i. A( B
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
z+ D# A6 {9 ^2 t9 b; I
0 v( k+ Z; X0 V$ C8 C
while(1)
( m& f' @+ `6 Q/ r$ g
{
+ H5 C" M; y& T( L0 j
read_MSG_buffer(pshreRAM);
$ Y; s% n* \, y! m
}
' E- J2 z G Y) o4 z# U
}
0 M( O- H/ g; n& y
+ \$ `! V2 H+ h1 ~. \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) O- n1 w( z2 p) H4 g% m
{
8 L @2 }( j( f) {! i) [# E/ k
RX_MSG_PROTOCOL buf;
" I1 U3 M+ T A; F% o5 C" a
+ ?* f, k7 S. B2 V
buf.a = pshreRAM->a;
g1 X: S! L- ~2 r
buf.b = pshreRAM->b;
* D6 N/ s7 g2 \' a; L
buf.packet_cout = pshreRAM->packet_cout;
; o5 x% k2 l* p) l1 g* j( T! C1 t6 ?
: {! c* s% _% ^; r
if(buf.packet_cout != count_copy)
4 P3 B% U- g- h$ A, t8 N( N$ s' w
{
: k/ t0 l* l( N( P9 u2 w! x
printf("a is %d\n", buf.a);
3 K+ n* g C6 W- C& D1 g4 [6 e+ C
printf("b is %d\n", buf.b);
% `4 K- U# r/ T& d" w8 ?. ^
printf("count is %d\n", buf.packet_cout);
% m/ f! Y3 g( D6 X0 Q: T
count_copy = buf.packet_cout;
0 K* T8 q+ O" b9 B3 V3 B7 c" r
}
2 X8 Y: k# O+ F$ P9 G2 e# n
else
9 ]. L, Z' b& `2 k# ?
{
) w$ g- C- Q- O: c% c: B$ s
printf("No effective message!");
7 p3 G# t! v6 E- {) v- O( V
}
5 l8 ^: W( H9 ]6 X, s- x! i7 V
}
2 _8 V- f& F; t' V% D# M' @
% U$ j& m: \( i5 o! b2 T
- h" n# S2 ~ Z L3 I
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. L. v) G4 Y' i- b# D$ s5 `
使用下面代码,对内存使用了mmap函数后:
* A+ k5 S5 z& A3 \, A
#include <stdio.h>
7 `8 }( B7 p0 K# Q0 t# P
#include <unistd.h>
$ K# l* q7 U0 b9 [" Z8 @
#include <sys/mman.h>
' |4 n8 w9 t$ o/ H! c
#include <sys/types.h>
! a" ^6 o0 R9 o8 K: O) P
#include <fcntl.h>
" M; f( [3 G5 R5 T
8 g0 q" P4 V# X
#define SHAER_RAM_BASE_ADDR (0x80000000)
+ ~! t5 i7 {& H- s) J& n
#define SHAER_RAM_SIZE (0x20000)
4 W' r' Q2 M j3 ~5 x
, \& F, v& Z( s% G7 N( s x
typedef struct
1 ?& |# s* O5 i7 J$ t
{
6 G9 j2 z9 A8 c2 x2 t; y2 B7 P
unsigned int a;
4 l( g4 a% H P" E* c
unsigned int b;
' F" J7 h5 N& z9 ?
unsigned int packet_cout;
: A% S( ?( T* y# x6 q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" B: S, E9 `2 u! X! K+ [6 O9 e4 l, s7 d
. L" D V6 K+ x. k9 q4 z4 H
void read_MSG_buffer(int *baseaddr);
+ w! D* ~2 [" |% M6 d, g2 {; Z
unsigned int count_copy = 0;
9 U9 m4 w1 W$ K7 e5 n" ~7 I. M1 X
% M4 H+ p" n3 D! V8 Z9 t' R
int main()
4 Z5 j( D, L0 y9 R* E. }$ c! ]7 v, G
{
3 t- v; ]: S& o
int fd;
3 D$ r4 |. o& m! a" P2 k+ h
int *mem = NULL;
7 w- z/ i' T# m5 b+ `2 @
0 _2 h+ \% [6 a+ c4 y7 _! ]% A
if((fd = open("/dev/mem", O_RDWR)) <0)
# j8 d# K: f& y) q6 E
{
, o2 w7 b5 `: P
perror("open error");
' W. y7 M: P3 J
return -1;
/ Q/ J) h4 k! O, N7 ]7 c
}
0 a4 s3 a' W& D
. V) z9 ^$ b6 P- U
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) y+ u1 E2 X7 B+ _/ T* o) e/ ~7 P% v: e
. F. l$ y+ v: b% n$ `: s7 M
while(1)
2 l* u! l3 L+ m7 l a
{
+ X; U" F% k( @; O
read_MSG_buffer(mem);
5 d: ~1 `7 m) }$ r% n! ^
}
# R+ ?. u9 @9 c" P
}
" [/ g; W; O7 e+ p6 X' N' ~
{$ L5 G! R0 c3 X; s, [
void read_MSG_buffer(int *baseaddr)
9 h( u# e- ~9 u! c; J2 }- f2 k# K
{
( k& ]9 O2 t- q2 c/ C( [% v
pRX_MSG_PROTOCOL pshreRAM = NULL;
5 E" V8 s+ e, v( Y
" u6 m+ q$ ~7 e7 }* O1 ~
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
a$ V" R' u9 q: e6 ], h( ?1 U
* {* S: f5 [) j" d; f& l& s& K9 \# x
if(pshreRAM->packet_cout != count_copy)
" z% G5 B D* W: E
{
' @, q1 k* Y: o; l
printf("a is %d\n", pshreRAM->a);
2 `/ I+ B% c" r% z, E
printf("b is %d\n", pshreRAM->b);
8 i4 F8 |1 w9 `# Z- k/ ~
printf("count is %d\n", pshreRAM->packet_cout);
0 q: f0 e& v# u Z
count_copy = pshreRAM->packet_cout;
2 n0 N1 X2 E; f5 k
}
4 V% B2 T/ M* i& [5 I+ j8 E
else
. \" O- Y9 i5 a) ?3 T
{
4 N- C" U; F) w: b) Z2 s
printf("No effective message!\n");
/ `6 {2 W# n* c) s6 f
}
8 g+ s4 t }, O8 l1 E+ ^! w
}
) U, C' r+ Q4 D
* M: K; O, W. K9 M4 c5 K
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ Q: X* f& I% S. r4 b, O
( q: m* B. J& D2 h0 _: h5 b" x8 b0 K
6 n( U( E+ v+ z- N
8 a' T! R1 e% W* @6 W; @
, L% I) _) ^1 d5 r% F d; J
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4