嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 V3 w9 D# C9 R& B+ }, p
7 w- a- J- B" k
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& A/ l4 _: a! U# w
#include <unistd.h>
! k( K' Q5 Q' }0 h
#include <sys/mman.h>
( D. j1 Y6 N: |
#include <sys/types.h>
& @! `' {- `4 F) j9 m$ U
#include <fcntl.h>
, h; r% G& ~& B r5 U; d
3 k5 V. r9 }1 k1 {% H
#define SHAER_RAM_BASE_ADDR (0x80000000)
$ m. A$ [1 F: e4 H
! S( p3 P+ Y ~1 T0 z" U
typedef struct
8 @+ [. i9 B4 x
{
* I+ B" F1 G7 W) e
unsigned int a;
W3 Q1 x2 v- Y# [
unsigned int b;
; Y! e& N2 d9 A
unsigned int packet_cout;
# F2 T5 \& @9 H1 d2 P3 c3 l. q7 [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; k# C7 e- ?! p
0 @+ [7 h% J' T( n ]' ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 G1 x: x/ v* e$ ^4 {
unsigned int count_copy = 0;
' Q. L' I8 a* `( Z8 h) p
1 w; V l M* Q B
0 b, Q9 I" y8 q3 o4 i: |
int main()
. h* J. e0 Y6 ~) g* j
{
$ L1 ^2 Y: O! E! P+ g' B8 A
pRX_MSG_PROTOCOL pshreRAM = NULL;
: z/ F( [! |. q7 N' ?2 w
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 [$ y5 x m" j) @: s6 r r5 k3 m
" U4 C0 I' P) j3 v; I: t
while(1)
- `0 K$ W9 E. A; P: [
{
/ S9 Y1 s+ |( p2 ?2 A+ i3 C0 ?
read_MSG_buffer(pshreRAM);
s% W6 m* }6 \! K; Y4 w
}
1 { e, ?( Y9 L5 c' g$ g
}
# t5 q7 F1 u' {# v) U) b4 N$ t
8 r$ r# x% J: Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 r9 k4 I& ?* T! M8 ?
{
2 A8 y9 M. W7 ~% f6 t2 H
RX_MSG_PROTOCOL buf;
9 G6 \- g" `- u1 ^! S6 b: [
! t- d8 F3 t4 b& S
buf.a = pshreRAM->a;
: ]0 C3 h8 d% O5 s+ g
buf.b = pshreRAM->b;
& s E; V5 g7 J/ O8 K
buf.packet_cout = pshreRAM->packet_cout;
5 @' f! K. Z0 u/ M" f- y
3 N2 `3 l3 u& I1 L
if(buf.packet_cout != count_copy)
& n0 m4 [7 E" U" S# @/ y
{
$ V" N/ U, U" \
printf("a is %d\n", buf.a);
# d6 W' G3 i$ W V3 x8 m" {
printf("b is %d\n", buf.b);
0 C: W# d4 X; S, t
printf("count is %d\n", buf.packet_cout);
) ?9 {4 o, i4 W7 \; n) a
count_copy = buf.packet_cout;
. g: z. _- q( s) ~- d* t' a1 Z
}
( k# x) G8 d3 V5 l1 G
else
& C9 a. i2 k# S8 P2 z/ @
{
. R/ O$ b* s1 n$ Y( x7 s
printf("No effective message!");
* D% ^, v8 n. W3 n1 x3 h
}
- g9 j/ q* Z* z2 D' o" z
}
! c1 K; T# Z* [% A9 ~+ M+ T
3 ]7 g) O0 N) X- S
8 `; ~" w4 G& i1 T/ ^7 h) s
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. i5 q0 v9 i8 H" n# Y8 ]* n4 |) W
使用下面代码,对内存使用了mmap函数后:
Y5 Q" b R0 n3 a4 @8 K/ d
#include <stdio.h>
- F( s5 @- F, z' e! B
#include <unistd.h>
" V" t; F- [% F& A, l
#include <sys/mman.h>
" d& L5 C; @* q2 x$ x
#include <sys/types.h>
) R4 z O- W( n
#include <fcntl.h>
! \; X' p' x, I1 G4 `/ O3 S/ j7 I; v
# h3 m) r+ M! ^. d% d9 T. h7 N" S1 |
#define SHAER_RAM_BASE_ADDR (0x80000000)
( d+ F& O4 t4 {
#define SHAER_RAM_SIZE (0x20000)
+ M0 K4 F& Y1 Q+ ^5 l
# L/ v2 Q' i0 z9 z; B
typedef struct
* q& ~, |3 }$ [7 j( n K2 [
{
a4 Y! W% {8 H; l7 W8 h
unsigned int a;
1 S6 c) e4 x5 S- W1 d/ }2 \
unsigned int b;
/ l5 ^- D1 X! B
unsigned int packet_cout;
& ]5 c9 d; `8 E( M0 M( g. ? V& _: U) w
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% G$ i$ O5 ?2 |, y, \
* G* G1 d, a% Q6 b7 C8 l+ p/ h2 q( B8 c
void read_MSG_buffer(int *baseaddr);
2 I6 Q( c+ f3 ?- r( X3 [! G4 I$ `
unsigned int count_copy = 0;
, B8 z8 f* k& ?8 M# d* ?
9 l' C! E3 G6 q
int main()
$ L q8 l, F: ^5 k4 c9 }
{
D7 c6 I" |5 W- g
int fd;
: \0 R6 S9 f5 S; L
int *mem = NULL;
/ y* ]3 `7 b- J8 |* {# I
' P" m/ I& Q, I' \
if((fd = open("/dev/mem", O_RDWR)) <0)
$ O" y7 i7 ~3 ^) w0 l# p
{
0 V- T! |5 b; E3 @) j
perror("open error");
, |" g4 W1 C3 }( O: M
return -1;
: o, |0 R2 C0 T# _5 @' a/ m
}
7 y ^1 n4 z* l& {1 n; e
5 }, s' ~. n8 `3 Q) }" t: M
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; `- g1 j6 A9 f6 y# r$ A
! E, t6 \7 g$ g( }0 w. x
while(1)
) M' @/ w3 k& s( {
{
3 ~/ e. J B* a: L5 V- x# G8 r3 D
read_MSG_buffer(mem);
i; M: _' s5 X% f; ^6 ?% B
}
+ b J% e0 f% ?- k
}
2 a" @' j. o" ^2 r: t! s
" \' g9 ?2 n- ], D: n* S K$ N
void read_MSG_buffer(int *baseaddr)
% J9 d3 k2 h$ p: E0 o$ Q
{
5 R. u1 F9 w6 Y3 x7 x; f$ t
pRX_MSG_PROTOCOL pshreRAM = NULL;
c$ }' x. Q' Q7 F6 Z$ C+ b7 Y; N! b! A
: n* v2 c+ Y, `+ l8 b4 C
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ ?6 ]9 k6 X9 I6 P% {2 b
- E3 ~9 X3 i3 c5 W
if(pshreRAM->packet_cout != count_copy)
% c- B) I; v5 G0 _0 y1 Q s' |
{
+ o' ~1 G% w% X/ E7 T
printf("a is %d\n", pshreRAM->a);
^: w1 [( m+ {. a! H
printf("b is %d\n", pshreRAM->b);
( ~1 V. S# I! v
printf("count is %d\n", pshreRAM->packet_cout);
' q @& E: u# Y5 J
count_copy = pshreRAM->packet_cout;
5 N3 Q/ V: ~: E) ?: y( V
}
) W9 ?; G r+ m
else
' Z4 s; _6 Q5 t- q- r
{
% _2 s0 F# k6 `: J% e
printf("No effective message!\n");
c4 |$ a5 j& X
}
- i4 D! B; u. o- j6 q
}
8 P, q V) W* s9 _5 Q5 e3 z
; ]5 g4 T; v- K# _4 K: i
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
q3 z; J$ u# w; ?1 z; m. ]
6 P6 K5 s1 f1 C2 H. ]% g
4 r1 e6 a7 Y+ V% a; u6 n
6 W/ D: e7 ]: k! ~
2 D }1 q( x. q* ^ s3 z0 o
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4