嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 \, y; r- T: X6 d' }) f9 B
1 a9 _1 S' r% T O; \
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; j! u) `5 v2 O2 X
#include <unistd.h>
6 q/ m4 B3 j1 `: W7 h2 [
#include <sys/mman.h>
|0 h# J: `% W$ J/ T2 v2 l9 `
#include <sys/types.h>
- H5 M) e3 U3 e1 E
#include <fcntl.h>
. [/ j5 e1 O& F( F- d& D
3 P! f+ R( u' ~( L) w4 B4 O
#define SHAER_RAM_BASE_ADDR (0x80000000)
: E, y5 a) a1 _' |
; N: O$ J; S( C( i0 {% G4 x
typedef struct
& A x$ | o% |6 L# M
{
% k0 j3 L! K0 e9 B
unsigned int a;
1 y8 E' H1 N# F5 g' ^* G
unsigned int b;
( d) t9 G* G' C2 }8 h$ E X
unsigned int packet_cout;
1 x% v+ z0 N+ j: [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 a( ]7 J0 b% h
4 s3 u' u: r: ], \+ d$ F
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 B+ v3 @* t% D
unsigned int count_copy = 0;
+ b* [1 {* }, p- l: c: T( i
' g6 C$ ~8 X3 z8 o8 I E' A5 k
U% w8 F% I6 \7 g# s& n
int main()
) k1 I! k- a5 }! Z8 H% q4 A. t# @
{
( B+ r k# \9 ^) v
pRX_MSG_PROTOCOL pshreRAM = NULL;
& X1 q% G/ ^. L" S1 e' \
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ I- W3 S2 O' w7 ?8 o
: j2 J/ `# R, R
while(1)
9 ~4 ?. R% a( r& n
{
! P& D( g! k! v/ V" [. @) K9 r( ^
read_MSG_buffer(pshreRAM);
' s1 u* h8 O# u3 d
}
! S* [8 S" X( P6 F. R. T
}
4 l+ Y+ [7 p( [5 [& T* A3 Z2 V
. A' o0 D+ @# S- Y% V
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
K0 J5 M" {) H4 k
{
0 Y3 r4 z8 D" G& b" ^! Z+ _
RX_MSG_PROTOCOL buf;
( i/ x- p! e% {: l" O
) `. w. ~3 a7 G* V
buf.a = pshreRAM->a;
% a( H; M1 r0 {" \' _
buf.b = pshreRAM->b;
. F. G# ^6 M- a: n1 j& G# B
buf.packet_cout = pshreRAM->packet_cout;
: m# A% ~* F3 I, D* R+ a: H
* C/ x) c3 r, d2 L# k$ Z: d# T
if(buf.packet_cout != count_copy)
) K, E" T, c: @' [4 O7 V" F
{
. ?+ z% z- S! @$ q D
printf("a is %d\n", buf.a);
4 c X$ u7 _: e! P, _4 O% n
printf("b is %d\n", buf.b);
7 [3 Y. [- \1 n, ^) C
printf("count is %d\n", buf.packet_cout);
$ i2 \( d [2 j& \
count_copy = buf.packet_cout;
5 d# v8 \- l x1 @! O# g
}
* q, i9 W1 {) O4 o1 g A; V5 H
else
3 C- d0 b8 v5 A; h+ @
{
7 N6 \8 f, o( p9 b; f
printf("No effective message!");
/ A) ]( S* {2 @+ z! e2 H: I; \
}
2 N% S: B. j* n* u7 W7 l2 r
}
* f9 x" c) s: E* x
- ?4 b l& q9 `+ y o; q3 j
. B& K, W; c9 t# k# O
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 e3 [& s5 r, u5 {' }! f
使用下面代码,对内存使用了mmap函数后:
u& v8 m7 ~3 G0 ~5 T4 M% ^4 F$ K
#include <stdio.h>
0 H; _2 K5 e9 x' V/ C6 @
#include <unistd.h>
8 f) o" ?' N: P
#include <sys/mman.h>
8 w" L; _1 Y: S( t
#include <sys/types.h>
, n- [) p3 t: m1 t' W
#include <fcntl.h>
% y$ B" i) K7 K! R. U6 @$ l+ h
* [+ O/ i& a# p
#define SHAER_RAM_BASE_ADDR (0x80000000)
/ J0 s1 o& u% ^- a$ I
#define SHAER_RAM_SIZE (0x20000)
/ [& Z- ?& n7 `
+ D0 B) Z6 P& b1 l( ~1 o& \! [
typedef struct
' R: T" O! `/ f7 |2 z
{
7 B$ f. y" B; X7 L$ l, T
unsigned int a;
5 r% f! Q1 T( Q z# y
unsigned int b;
# x% P+ j1 T0 [. u
unsigned int packet_cout;
/ c$ q9 L- F% b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 O- I( s0 a" g+ K
c7 {& {, Y! u e: V. m! c
void read_MSG_buffer(int *baseaddr);
$ K, M8 c4 i( c- N* h* l. o k: l
unsigned int count_copy = 0;
" l" ], G( I% I
3 {& j: k5 C I9 r+ M
int main()
7 G; M) T* G& j5 P( P
{
9 x$ Q) c1 Y; r+ u8 M3 \# @
int fd;
. z9 M; j' W6 ~2 B+ @ [) [
int *mem = NULL;
$ b; p4 G6 U' |$ x: K9 r' i7 Z( J
* F/ B- x' o' H+ r; }2 P2 S
if((fd = open("/dev/mem", O_RDWR)) <0)
: [- v2 V- z+ {% Z
{
8 x6 t4 S& K0 |' Y( S! Y
perror("open error");
: S) e/ c2 t+ \; c/ C/ Q
return -1;
. m: J5 C2 V3 h1 K8 E/ U6 I9 R
}
' d8 u4 i$ O o' h6 p4 @" ~& A
* s" Q$ d: }; I; L2 V7 ]5 L2 j
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 J/ U% u) j0 _& V
6 y I4 ]1 s! ^; n% s
while(1)
1 {3 V) z/ ~2 D2 j5 F! q
{
' Z/ s' u ]) ]6 n, K7 e
read_MSG_buffer(mem);
2 b: H9 j5 {1 q: c
}
5 r- `4 D* U5 J9 d" Y
}
4 d% P& {9 m4 X+ g! x
. {% M/ d% k4 R5 T1 H( t, \5 J- X
void read_MSG_buffer(int *baseaddr)
: I% O6 C1 D* d) S
{
: D* {! |: ?6 w: \' E0 T$ H
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 \( U, ]; t( J$ x
, o' J. V8 V# e2 f% Z; W
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 I+ F7 n. ?5 U) J2 c
0 S4 ~1 g; V8 J/ N% u2 v- j
if(pshreRAM->packet_cout != count_copy)
- k" N- S* e8 O$ Z
{
6 h. c- ^, O5 d% l( y+ }
printf("a is %d\n", pshreRAM->a);
+ x- D0 ?! E2 D' w1 e( w) d# N
printf("b is %d\n", pshreRAM->b);
4 a1 s; ]4 {) t
printf("count is %d\n", pshreRAM->packet_cout);
* I" c$ ]1 l6 G
count_copy = pshreRAM->packet_cout;
7 F4 {" `0 ~* @9 e" ~! [
}
/ F. o' f0 ] b
else
9 X( i: Q+ a' G8 Y) s7 F n( U
{
! o- G8 Z( y1 ~9 K @: [
printf("No effective message!\n");
3 x3 W% P& j0 ?/ v: T! o) t: v& c
}
- H8 e+ b1 D- _$ g8 O* V/ `5 E
}
% ?5 D- O0 p- v+ p0 \1 {
% C6 `7 Q+ D/ B% V. S
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 J0 Z4 ]/ k5 _: K( F" w* j
1 ^) l- U) Z; C& v. F$ }
" W: }/ P. g5 P- n+ W
$ @/ e2 Q x5 ]2 w* S6 u+ x9 D
1 ~+ K: K, u+ M2 c
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4