嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 d9 N% H; n9 G O
" m) g( R$ n1 G4 j: H8 V4 }1 w( ]
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% R1 ?, s7 m4 L
#include <unistd.h>
6 |# p% ~7 h2 r' v1 o* o+ P9 G
#include <sys/mman.h>
8 T1 r0 L. J" F1 }. L
#include <sys/types.h>
& S, p: k2 ~9 [0 h
#include <fcntl.h>
1 n2 H5 P1 k) \9 q; V5 I! p
" r" @2 B4 P; u2 I( J1 M- k' F
#define SHAER_RAM_BASE_ADDR (0x80000000)
% q; t/ Z i! K! q Y. G
$ L8 b- M$ c3 a0 \& _
typedef struct
# v1 t# @6 {; f# _/ ~
{
8 O1 L9 k/ }2 @
unsigned int a;
9 c0 S" v# U; {' x. g' y
unsigned int b;
+ z* W- {3 T, C& c$ y" ~
unsigned int packet_cout;
6 y+ S8 e0 T' X- A6 S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ M% L4 B3 Z4 P; g
; U% o" O3 I. Y( k" J9 Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 ^. |8 |7 q6 _) i. E. r
unsigned int count_copy = 0;
7 l0 {1 S9 y" i9 J$ b
# i0 }7 g( w2 O0 q( M. q
5 E6 j7 P, O4 R: W3 o
int main()
. s c( e- s8 c1 p! Z( U5 s
{
! Q# H4 D3 w/ |! n8 X# h) v. K
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 w6 X. i. n2 X- C' v
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 m1 b0 V- w! l1 `' V% O
* A/ a9 c. o$ b$ y
while(1)
; Y, v+ u1 c* [+ H% T
{
* E$ z8 K* ^# n8 b+ G7 z; K
read_MSG_buffer(pshreRAM);
8 U# }# @5 j" e# _. m0 W' q2 U
}
) T# Y# I$ l; H: }$ D
}
& }/ n$ c/ }+ Z6 ?7 v
3 M- P7 o" h: F0 g6 l B( R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: v9 Y2 ~. t2 U' w/ R7 L$ E$ H# R V4 O
{
8 H: i0 f' x' M
RX_MSG_PROTOCOL buf;
- h( V# D; X8 j7 D) C$ p
$ r2 P' j8 o: k0 R! i6 A
buf.a = pshreRAM->a;
# l" A6 [5 B' U/ f
buf.b = pshreRAM->b;
$ h+ n" i0 ?0 s& l p6 m
buf.packet_cout = pshreRAM->packet_cout;
4 b1 u/ T, w: O5 g4 f
5 A3 L6 \- ]3 e' S# z( C) C
if(buf.packet_cout != count_copy)
/ ^0 A0 x& N4 W& o: N3 |% F
{
5 N0 A% q' w' Q* `* u ?
printf("a is %d\n", buf.a);
0 ~" j/ |$ E j9 k a/ P; I. e
printf("b is %d\n", buf.b);
8 H$ y: y& Z: i# a" E1 ^0 F7 f
printf("count is %d\n", buf.packet_cout);
" l$ M. {. c, v1 d e; O
count_copy = buf.packet_cout;
! `: |* U& m( [: o, p
}
+ J" ~5 M+ p. m3 d" F, L! J
else
$ ]; |' X5 D" U, E6 p
{
9 D$ I. o8 r3 p- A: \
printf("No effective message!");
5 i$ ^6 X& p$ L; r
}
" w; i2 N4 r% e2 l! b
}
8 T% s) i1 [* G$ l) Y! H
6 D8 z# K( \1 Z; `4 d$ ]
; }/ V+ @$ _8 g0 R* C! T
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 u! F" `2 H4 ]$ C& D3 B
使用下面代码,对内存使用了mmap函数后:
- q& m) S) h1 x; p
#include <stdio.h>
/ l5 G5 B5 G6 b0 [* n) c
#include <unistd.h>
# v1 ?) f9 I/ ]9 L) n6 d; N1 }* N8 Y
#include <sys/mman.h>
( |' l H8 s( Q/ B: i! C
#include <sys/types.h>
9 D. s! S/ W6 T" O9 O- e0 {) D! P! F
#include <fcntl.h>
& O( o. }4 B3 I( a- p+ e! D
1 ^- R3 g' {/ W
#define SHAER_RAM_BASE_ADDR (0x80000000)
% H2 f2 |" M" P1 \; D8 ?9 d) e
#define SHAER_RAM_SIZE (0x20000)
1 n( X& g0 O# e) Z" r1 T
3 u$ h+ C+ u R, o! @5 i6 W# }
typedef struct
$ ~' ?1 a5 L9 [5 h2 U9 k$ W
{
8 N% J% i5 }! s7 r# q
unsigned int a;
' m1 {" M5 u' C, ]- ]8 y
unsigned int b;
) o1 e( o/ w. u: @3 w R5 T( m
unsigned int packet_cout;
) G" k4 \2 w8 C a @5 e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 M/ `% @- j6 C s/ W& c
, c4 K; B" p9 v. J, M# h5 K0 U* H
void read_MSG_buffer(int *baseaddr);
; a+ l) U! d ]# ?& g( c8 I
unsigned int count_copy = 0;
1 k: p2 w% j+ p3 v/ G D
" V! W9 c( L" y1 F8 Y
int main()
3 l. j8 F- S: p7 Z! ?5 c
{
$ P9 i: k/ c2 ]4 _ e
int fd;
9 o3 V) b7 @6 b4 k0 e
int *mem = NULL;
; ?1 v L4 i/ ]# w
0 B- \* L( k5 Y
if((fd = open("/dev/mem", O_RDWR)) <0)
, [) j4 R: R* ]: J) b
{
, F3 _, X7 e H9 a( D
perror("open error");
% A$ y8 k; Z4 | q) |( y& t
return -1;
X# Q: ?9 y! e( |# o' p+ q$ c; N
}
7 ~7 J: L C8 L6 D+ V7 y& s
) K8 {6 M: n8 L+ W: q6 G# T
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; j% @+ F( u8 y" c
7 m- Z- R! v F6 w& E* `2 V; L% }
while(1)
. _+ l; u8 J4 @" r6 N& @3 c
{
) M& Y- s/ l1 D' F& A+ X& t
read_MSG_buffer(mem);
4 Y7 m! E: H! i* v1 T. a
}
e, }. y/ m! D' {
}
' N+ M. t4 W4 R; }+ W2 W; n
. U7 L5 a. I+ S! v/ r
void read_MSG_buffer(int *baseaddr)
1 ]5 a; X2 E i9 t8 h4 c
{
/ A; D) Z/ j( p7 y* `
pRX_MSG_PROTOCOL pshreRAM = NULL;
) O& c8 c0 F. [
3 N- g/ [8 H; w; g0 o' {4 @
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" Y6 m0 F# K" @; O5 S
8 E' D" W. i3 O+ T# |0 z
if(pshreRAM->packet_cout != count_copy)
$ a+ v/ D+ ?6 Y. I" g/ Z, B( R A# E
{
( ]3 ~+ Z4 U2 t2 m. @4 O
printf("a is %d\n", pshreRAM->a);
, y- I Z4 C, h F2 i
printf("b is %d\n", pshreRAM->b);
. }* Z4 k0 a% e* _; o0 e
printf("count is %d\n", pshreRAM->packet_cout);
, i) i |. ~9 Y$ ~
count_copy = pshreRAM->packet_cout;
7 Z9 S4 R. m7 Z5 R! Q
}
( P1 E/ U/ _, O* @
else
% g+ |- \+ G. {8 i+ s
{
: {; K r4 b/ y) ?+ o V8 J
printf("No effective message!\n");
$ \& r& }! m% H/ [2 c0 W7 u
}
+ F! ` ^; D. M8 v1 P9 {7 }# q
}
- P9 @3 w, u6 l2 R
1 J/ d5 J3 K2 P
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; k( L1 N$ ]' [& r0 ~1 N
; `6 k6 n2 }2 E" X9 e
% D! p) Z& ~7 m( E" J# F
. V! j6 x* ?! C' d6 x
9 Z, o- x( W# W i r
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4