嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
5 c" `0 W$ f! X: z( _) Y
4 Z$ q) i! C0 T1 C
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) }5 i% _& h2 G! F" R" B' M. N& `
#include <unistd.h>
) n, ~+ R% \+ N- ^& `0 Q t
#include <sys/mman.h>
0 M- a$ b$ S" w+ C7 j
#include <sys/types.h>
" a+ U" i* y9 q
#include <fcntl.h>
o6 Q* Y& M4 s6 `
, w/ p- k, j4 j4 j# O' _$ @
#define SHAER_RAM_BASE_ADDR (0x80000000)
4 Q6 ~1 Z. [ |8 J6 X
+ j: p! J; n% j& K$ a- {
typedef struct
2 X# l% { d! L' Z: B# q' v' L% z
{
6 ?/ W5 S5 v) M+ H! e7 m
unsigned int a;
7 r3 L3 S3 P% W% a `6 Y: w
unsigned int b;
! E4 P4 ^, B5 e) U+ j# @& S
unsigned int packet_cout;
( j5 D6 Z; ?- ^) Z; I
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ j- T$ C# ?7 U) ^! e
9 i& n: Q, m, S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' a2 ^+ \; }) g3 ?, O' m' N
unsigned int count_copy = 0;
: z3 |$ J: d" }1 _
% M9 f+ y( l" l/ U+ M# M3 t- |+ H/ u
( D3 X- u, |1 j. y+ B
int main()
& ~. r) k8 U2 P3 l c7 J) [
{
* V5 ?1 o* l- U
pRX_MSG_PROTOCOL pshreRAM = NULL;
! F5 I# t% j6 h1 V0 x! U5 `" o
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ J' Z- N$ B1 x1 E
; L* ~# ~2 [9 d: C! K4 R
while(1)
3 ?" G* u/ h0 X6 Z/ S$ \4 E3 Z
{
, o: F# x5 R& E
read_MSG_buffer(pshreRAM);
7 [3 ^1 ?2 N6 e, Y+ n
}
+ U( u4 i# I( U6 r
}
2 i8 Q& g' x; A. r
- e9 i D4 W# L* ?! G T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 @2 a8 X: ]* F
{
! o' j* [2 p* R0 Z
RX_MSG_PROTOCOL buf;
V6 ?1 W/ m% ^- J' S A ~4 b
R' K; i; o8 v4 |
buf.a = pshreRAM->a;
5 s0 x1 i5 N# y
buf.b = pshreRAM->b;
: M) g; r+ ?& C1 j- P
buf.packet_cout = pshreRAM->packet_cout;
! @8 @2 x9 ^+ |7 x4 T! r# T
# }) z1 O9 r! y2 e
if(buf.packet_cout != count_copy)
6 T3 E2 W) c7 o" V5 K6 b* c e
{
9 c6 F7 f7 k" ?& ^9 U. b
printf("a is %d\n", buf.a);
% q7 h- [, ^& L
printf("b is %d\n", buf.b);
% G+ B! c& ^0 W5 q ? S6 z+ s" ~/ E
printf("count is %d\n", buf.packet_cout);
: n3 b# }) U6 n! l
count_copy = buf.packet_cout;
; L0 _1 g; m! e
}
; a4 o7 t" B# b% q1 H6 g
else
9 \1 j. B( Q1 r7 {
{
( c1 S5 f7 H! ~: H) v1 G
printf("No effective message!");
* q! E7 m# T/ C
}
9 \: Y2 q7 H6 Y' N) x4 @( Z
}
g$ o- x! t3 l
/ F$ w( r' s0 e
+ t( T) y, m/ q. Z. p# T: c! @
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 f" B, ^2 o( p) O
使用下面代码,对内存使用了mmap函数后:
/ a: n, c: Z! R* z% M
#include <stdio.h>
( J/ E3 Q7 c" l; J. R+ H! q' `; K- c3 ?
#include <unistd.h>
2 t3 e% r5 y$ q9 k# l
#include <sys/mman.h>
: `9 w6 k6 K' P( V$ c5 Z
#include <sys/types.h>
/ m/ I4 X2 n6 o) Q' ~! [
#include <fcntl.h>
7 o* g& U6 L2 M% K
% t. ]6 |' ]3 K
#define SHAER_RAM_BASE_ADDR (0x80000000)
: [2 N3 @" t: J1 I) A2 A
#define SHAER_RAM_SIZE (0x20000)
) k+ k5 x- n5 u
0 e* h9 Z: U$ V* @) x* q( |
typedef struct
" i4 C4 b5 [9 V8 |+ w* ?: W& z3 n- \0 J
{
! l3 S$ h0 p$ y- Z
unsigned int a;
6 r" h" D! l4 H% |0 r9 K; B9 d, [3 M
unsigned int b;
2 @9 Q7 @! D. @4 B# B. W5 h0 h1 o
unsigned int packet_cout;
+ |% h( z) C$ `3 X2 c; `/ L3 x
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 p" j7 B; r( s
. h0 ^, h+ |' t% t3 J
void read_MSG_buffer(int *baseaddr);
# e7 o! @, n V5 z
unsigned int count_copy = 0;
7 c: G/ T* F9 T. f- [# G6 @
( e$ l; l+ [1 J: |7 I# b
int main()
0 a8 E. u/ `( x3 ^
{
1 o' A |- \% P" t5 H$ s% N
int fd;
( v! |* G$ s. M* A% ]
int *mem = NULL;
: V0 V6 O7 Q/ |' X
2 ~3 U$ n+ G& ~5 J* O/ ^( a, w
if((fd = open("/dev/mem", O_RDWR)) <0)
5 o& O& g' l% E4 H8 N! X$ b; @
{
, I& R F. _3 a$ \1 T, T/ F& S% j
perror("open error");
1 X h) r2 k% M3 q
return -1;
( L: U$ N5 r l" X; t$ L
}
! p$ q/ y5 j, B
' |( D. D2 D2 l0 v2 e0 X! {- t
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 B+ X0 \9 g" |! _- R4 E$ z
& c M( v m; i, T
while(1)
. @0 e, _9 W2 g+ b9 I
{
4 c4 X9 b9 B4 L; c' C# a0 x
read_MSG_buffer(mem);
# l$ b8 R: H' i, A8 w) N
}
1 s0 y$ g. d0 [6 u# s7 Z( [" q, R& ^
}
/ @/ C- }7 Y) b; Q% z" d3 F
. O+ y- D( W0 x& R4 M$ g
void read_MSG_buffer(int *baseaddr)
d4 J7 p p7 T j% P- {# a
{
1 m- a( A' ]8 ~$ s/ n& x( X! n& Y- m
pRX_MSG_PROTOCOL pshreRAM = NULL;
5 B0 O6 x+ Y& O3 t( k
& O: w. E0 B; D. W! E
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 f5 g# b) A, C
* |: N {9 }/ e; e6 }9 ~
if(pshreRAM->packet_cout != count_copy)
. A4 ~ ~) l) ^ l/ i
{
- P* Z" p& J& e0 X& `0 |3 X; \
printf("a is %d\n", pshreRAM->a);
; H! w& ?9 {3 o, f0 X9 [3 z
printf("b is %d\n", pshreRAM->b);
" ?5 Y% t! |7 `. O. Q( B9 U! ?
printf("count is %d\n", pshreRAM->packet_cout);
* i4 J7 x: m& D1 o2 X) x
count_copy = pshreRAM->packet_cout;
9 E8 u: F, _+ I/ F! ?+ K# b7 C
}
9 ]' @- _7 f, x! A# d6 j1 u7 l
else
7 x+ }8 _8 Q% q6 m, T# M
{
$ V8 a2 X6 u Q ~" h
printf("No effective message!\n");
1 ]) i; f$ b$ y
}
& E" I& ~! `8 y: Y8 k! Q# ^* Q
}
- E) H$ C- J# L; u- C C0 T
6 n4 v+ }- j/ h' i- K9 ^
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& r. _3 T; d$ P9 ]! L
8 _8 U# r0 H3 d6 C7 |% ?
) K" }& i: F+ C! E
& Y; _. s+ z. C' _ ~, L+ \" @8 Q
+ y& ?8 q, P8 ~, G1 t" V9 x1 _. x
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4